Unity3D实践系列09, 物理引擎与碰撞检测

 

在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 initialization
    void Start ()
    {
        rb = gameObject.GetComponent<Rigidbody>();
    }
    
    // Update is called once per frame
    void Update () {
    
    }
}
 
 
 
 

 

这时,自动为Cube添加了一个"Rigidbody"组件。

 

27

 

现在,给物体添加一个力,通过Rigidbody的AddForce实例方法就可以实现。修改"PhysicController"脚本如下:

 

 
 
using UnityEngine;
using System.Collections;
 
 
[RequireComponent(typeof(Rigidbody))]
public class PhysicController : MonoBehaviour
{
 
 
    public Rigidbody rb;
 
 
    // Use this for initialization
    void Start ()
    {
        rb = gameObject.GetComponent<Rigidbody>();
        rb.AddForce(0,0,1,ForceMode.Impulse);
    }
    
    // Update is called once per frame
    void 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 initialization
    void Start ()
    {
        rb = gameObject.GetComponent<Rigidbody>();
        //rb.AddForce(0,0,1,ForceMode.Impulse);
    }
    
    // Update is called once per frame
    void 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类碰撞器碰撞关系如下,打勾表示可以发生碰撞。

28

 

可见,

● 静态碰撞器只和刚体碰撞器发生碰撞
● 去碰撞的一方必须有Rigidbody,被碰撞的一方是可以没有Rigidbody的
● 物体被勾选上触发器,才会调用OnTrigger方法

 

以下的打勾列举了触发发生的情况:

29

 

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时,将在每一帧被调用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值