标签:
在Unity3D中,一个物体通常包含一个Collider和一个Rigidbody。Collider是碰撞体,一个物体是Collider,才可以进行碰撞检测。Collider组件中的"Is Trigger"属性项被勾选上时,这个物体就变成碰撞检测体。
物体有了Rigidbody组件,才会具备一些物理属性,比如重量、阻力、旋转阻力,等等。"Use Gravity"项表示是否有自然引力。"Is Kinematic"项表示是否被物理引擎所驱动,勾选上表示不受物理引擎所驱动。"Interpolate"项表示计算差值。"Collision Detection"项表示碰撞检测的频率,"Discrete"表示不连续检测,"Continuous"表示连续检测。
用脚本来控制组件
物理引擎是可以用脚本来控制的,现在用脚本来控制一些物理属性。
一个Cube已经有了"Box Collider",没有"Rigidbody"组件,为其附加一个名称为"PhysicController"的脚本。
using UnityEngine;using System.Collections;[RequireComponent(typeof(Rigidbody))]public class PhysicController : MonoBehaviour{public Rigidbody rb;// Use this for initializationvoid Start (){rb = gameObject.GetComponent<Rigidbody>();}// Update is called once per framevoid Update () {}}
这时,自动为Cube添加了一个"Rigidbody"组件。
现在,给物体添加一个力,通过Rigidbody的AddForce实例方法就可以实现。修改"PhysicController"脚本如下:
using UnityEngine;using System.Collections;[RequireComponent(typeof(Rigidbody))]public class PhysicController : MonoBehaviour{public Rigidbody rb;// Use this for initializationvoid Start (){rb = gameObject.GetComponent<Rigidbody>();rb.AddForce(0,0,1,ForceMode.Impulse);}// Update is called once per framevoid Update () {}}
把当前"Rigidbody"的"Use Gravity"的勾选去掉。
保存运行游戏,"Scene"中的Cube会带着某种程度的力在z轴方向移动。
我们看到,在"PhysicController"脚本中用到了一个ForceMode枚举,该枚举的选项包括:Acceleration, Force, Impulse,VelocityChange。用"A"表示"Acceleration",用"F"表示"Force",用"I"表示"Impulse",用"V"表示"VelocityChange",用"M"表示物体,用"T"表示事件,之间的关系有2个:
F = M * A
I = F * T = M * V
当ForceMode的项选择是"Acceleration"时,一般放在FixedUpdate方法中。修改"PhysicController"脚本如下:
using UnityEngine;using System.Collections;[RequireComponent(typeof(Rigidbody))]public class PhysicController : MonoBehaviour{public Rigidbody rb;// Use this for initializationvoid Start (){rb = gameObject.GetComponent<Rigidbody>();//rb.AddForce(0,0,1,ForceMode.Impulse);}// Update is called once per framevoid Update () {}void FixedUpdate(){rb.AddForce(0, 0, 1, ForceMode.Acceleration);}}
保存运行游戏,可以看到Cube是以加速度的方式在z轴方向平移,平移速度越来越快。
物体之间的碰撞检测关系
碰撞体的类型包括以下6个:
● Static Collider 静态碰撞器
● Rigidbody Collider 刚体碰撞器
● Kinematic Rigidbody Collider 运动学碰撞器
● Static Trigger Collider 静态触发碰撞器
● Rigidbody Trigger Collider 刚体触发碰撞器
● Kinematic Rigidbody Trigger Collider 运动学刚体触发碰撞器
这6类碰撞器碰撞关系如下,打勾表示可以发生碰撞。
可见,
● 静态碰撞器只和刚体碰撞器发生碰撞
● 去碰撞的一方必须有Rigidbody,被碰撞的一方是可以没有Rigidbody的
● 物体被勾选上触发器,才会调用OnTrigger方法
以下的打勾列举了触发发生的情况:
OnTrigger方法与OnCollision方法
OnTriggerEnter()当Collider进入trigger时调用
OnTriggerExit() 当Collider停止触发trigger时调用
OnTriggerStaty() 当Collider解除trigger时,将在每一帧被调用
OnCollisonEnter() 当collider/rigidbody触发另一个rigidbody/collider时被调用
OnCollisionExit() 当collider/rigidbody停止触发另一个rigidbody/collider时被调用
OnCollisionStay() 当collider/rigidbody触发另一个rigidbody/collider时,将在每一帧被调用
标签:
原文地址:http://www.cnblogs.com/darrenji/p/4601696.html