在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"组件。

现在,给物体添加一个力,通过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类碰撞器碰撞关系如下,打勾表示可以发生碰撞。

可见,

● 静态碰撞器只和刚体碰撞器发生碰撞
● 去碰撞的一方必须有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时,将在每一帧被调用

Unity3D实践系列09, 物理引擎与碰撞检测的更多相关文章

  1. Unity3D实践系列04, 脚本的生命周期

    Unity3D脚本生命周期是指从脚本的最初唤醒到脚本最终销毁的整个过程.生命周期的各个方法被封装到了MonoBehaviour类中.具体来说如下: 1.In Editor Mode 编辑模式 当在编辑 ...

  2. Cocos2d-x3.2 使用物理引擎进行碰撞检测[转]

    通常在游戏简单逻辑判断和模拟真实的物理世界时,我们只需要在定时器中判断游戏中各个精灵的条件是否满足判断条件就可以了.例如,在飞机大战中,判断我方子弹和敌机是否发生碰撞一般在定时器中通过敌机所在位置的矩 ...

  3. Cocos2d-x3.2总结---使用物理引擎进行碰撞检测

    [转自]: http://blog.csdn.net/cbbbc/article/details/38541099 通常在游戏简单逻辑判断和模拟真实的物理世界时,我们只需要在定时器中判断游戏中各个精灵 ...

  4. Cocos2d-x 使用物理引擎进行碰撞检测

    [转自]: http://blog.csdn.net/cbbbc/article/details/38541099 通常在游戏简单逻辑判断和模拟真实的物理世界时,我们只需要在定时器中判断游戏中各个精灵 ...

  5. 实例介绍Cocos2d-x中Box2D物理引擎:碰撞检测

    在Box2D中碰撞事件通过实现b2ContactListener类函数实现,b2ContactListener是Box2D提供的抽象类,它的抽象函数:virtual void BeginContact ...

  6. 实例介绍Cocos2d-x物理引擎:碰撞检测

    碰撞检测是使用物理引擎的一个重要目的,使用物理引擎可以进行精确的碰撞检测,而且执行的效率也很高.在Cocos2d-x 3.x中使用事件派发机制管理碰撞事件,EventListenerPhysicsCo ...

  7. Unity3D实践系列08, MonoBehaviour类的各种触发事件

    在脚本的生命周期中,有Awake, Start, FixedUpdate, Update, LateUpdate等方法,其实这些属于MonoBehaviour类的事件响应方法,是MonoBehavio ...

  8. Unity3D实践系列11, 组件的添加和访问

    当把一个脚本附加到一个GameObject上的时候,这个GameObject就有了脚本组件. 通过GameObject的属性获取组件 比如如下: [RequireComponent(typeof(Ri ...

  9. Unity3D实践系列07,组件的启用或禁用开关,物体的的可见或不可见开关,以及相应事件

    创建一个Unity项目. 在"Project"窗口中,在"Asserts"中,添加"_MyScene"文件夹. 点击"File&q ...

随机推荐

  1. Android sdk安装目录中没有platform-tools目录问题详解

    sdk下载地址 http://tools.android-studio.org/index.php/sdk 安装步骤很简单,百度即可. 下面详细说一下,在安装中遇到android sdk下没有plat ...

  2. IDEA配置文件的配置文件配置

    IDEA配置文件的配置文件配置: 路径 /Applications/IntelliJ IDEA 3.app/Contents/bin/idea.vmoptions (/IntelliJ IDEA 3. ...

  3. java 持有对象总结

    java提供了大量的持有对象的方式: 1)数组将数字和对象联系起来,它保存类型明确的对象,查询对象时,不需要对结果做类型转换,它可以时多维的,可以保存基本数据类型的数据,但是,数组一旦生成,其容量就不 ...

  4. sysbench安装及性能测试

    现在的压力测试工具各种各样,只要上手好几款功能强大点的而且比较大众化的压力测试工具即可,以下跟大家交流下sysbench的安装和压力测试 sysbench支持以下几种测试模式: 1.CPU运算性能 2 ...

  5. ZOJ 3203 灯泡

    题面 相比 wildleopard 的家,他的弟弟 mildleopard 比较穷.他的房子是狭窄的而且在他的房间里面仅有一个灯泡.每天晚上,他徘徊在自己狭小的房子里,思考如何赚更多的钱.有一天,他发 ...

  6. .NetCore下使用Prometheus实现系统监控和警报 (二)Linux安装

    Prometheus对Windows有相关的支持  下载地址:https://prometheus.io/download/ wget https://github.com/prometheus/pr ...

  7. django用户系统的测试,蛮不错的。

    https://blog.csdn.net/orangleliu/article/details/51944758 这个很实用 https://www.cnblogs.com/yanhuidj/p/1 ...

  8. Windows下SVN服务器搭建方法整理(apache)

    http://skydream.iteye.com/blog/437959 http://www.cnblogs.com/liuke209/archive/2009/09/23/1572858.htm ...

  9. hadoop日志数据分析开发步骤及代码

    日志数据分析:1.背景1.1 hm论坛日志,数据分为两部分组成,原来是一个大文件,是56GB:以后每天生成一个文件,大约是150-200MB之间:1.2 日志格式是apache common日志格式: ...

  10. Win10解决无法访问其他机器共享的问题

    Win10解决无法访问其他机器共享的问题     你不能访问此共享文件夹,因为你组织的安全策略阻止未经身份验证的来宾访问.这些策略可帮助保护你的电脑免受网络上不安全设备或恶意设备的威胁. 管理员身份执 ...