在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. Opencv学习笔记——release和debug两个模式的运行问题

    本文为原创作品,转载请注明出处 欢迎关注我的博客:http://blog.csdn.net/hit2015spring和http://www.cnblogs.com/xujianqing/ 作者:晨凫 ...

  2. Linux ALSA声卡驱动之五:移动设备中的ALSA(ASoC)

    转自http://blog.csdn.net/droidphone/article/details/7165482 1.  ASoC的由来 ASoC--ALSA System on Chip ,是建立 ...

  3. linux压缩日志并删除原始文件

    下面的脚本可以压缩日志并删除原始文件 #!/bin/bash yesterday=`date -d '1days ago' +%Y_%m_%d` cd $ find . -name "*$y ...

  4. linux中Shell标准输出错误 >/dev/null 2>&1 分析【转】

    Shell中可能经常能看到:>/dev/null  2>&1 eg:sudo kill -9 `ps -elf |grep -v grep|grep $1|awk '{print ...

  5. IDEA配置文件的配置文件配置

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

  6. Android Studio一直 Fetching Documentation...

    Android查看私有库android-spport-v4.jar & android-support-v7-appcompat.jar源码 https://www.cnblogs.com/s ...

  7. 【LOJ】#2118. 「HEOI2015」兔子与樱花

    题解 怎么觉得都像树dp,不像贪心 但是树dp确实做不了 把每个节点的值设置为樱花+儿子数 把儿子合并到父亲上就是父亲的剩余容量加上儿子的值-1 每次在父亲的时候将儿子的值排序然后能加就加上 因为儿子 ...

  8. Python中collections.defaultdict()使用

    一个小示例 from collections import defaultdict import json def tree(): return defaultdict(tree) users = t ...

  9. 002.SMB安装与端口

    一 安装所需包 samba:主服务包 samba-client:客户端 samba-common:通用工具和宏文件,存在于客户端和服务端 samba-libs:库 samba-winbind:wind ...

  10. 玩转SpringCloud(F版本) 二.服务消费者(1)ribbon+restTemplate

    上一篇博客有人问我,Springcloud系列会不会连载 ,大家可以看到我的标签分类里已经开设了SpringCloud专题,所以当然会连载啦,本人最近也是买了本书在学习SpringCloud微服务框架 ...