Unity3D之Character Controller(CC)与GameObject的碰撞方法

Unity3d中参与碰撞的物体分2种类型: c#

1、发起碰撞的物体。 ide

2、接收碰撞的物体。 函数

1. 参与发起碰撞物体:Rigodbody, CharacterController 角色碰撞器。 测试

2. 参与接收碰撞的物体:全部Collider . this

工做的原理为:发生碰撞的物体中必需要有“发起碰撞”的物体。不然,碰撞不响应。 spa

好比:两面墙都只用BoxCollider ,因此墙与墙之间无反应。 3d

好比:一个带有Rigidbody属性的箱子,能落到带有MeshCollider属性的地面上。 code

好比:一个带有Rigidbody属性的箱子,能够被一个带有CharacterController 属性的人推着跑。 orm

在全部Collider上有一个Is Trigger 的boolean型参数。 对象

(If enabled, this Collider is used for triggering events, and is ignored by the physics engine.)

当发生碰撞反应的时候,会先检查此属性是否为true。

当激活此选项时,会调用碰撞双方的脚本 OnTrigger, 反之,脚本方面没有任何反应。

当激活is trigger = true,不会发生后续物理的反应。反之,发生后续的物理反应。

总结:Is Trigger 比如是一个物理功能的开关, 是要“物理功能”仍是要“OnTrigger脚本”。

在Rigodbody 上有一个Use Gravity 的boolean型参数.

(Controls whether gravity affects this rigidbody.)

 

Unity 物理引擎,处理的一个细节:

当一个CharacterController不发生位置变化,一个Collier发生位置变化后,产生碰撞。将不会调用任何碰撞函数,也就是没有碰撞反应的。

物理引擎视为CharacterController无碰撞.

--------------------分隔线----------------------

 

如今就来考虑如何让GameObject(魔法球)主动碰撞到CC(人物), 碰撞到人物后,显示受击效果.

解决方案, 由上面的可知, 作出以下设置:

1:魔法球: Collider(合适的类型), Rigidbody(Use Gravity能够去掉)

2:人物: CC.

脚本:

在魔法球上添加脚本

    void OnCollisionEnter (Collision collision)
    {
        Debug.Log ("**** collision.gameObject.name***:" + collision.gameObject.name);        if(collision.gameObject.name == "Player")
        {
       // 发送攻击消息            SendAttackMsg();
       // 销毁魔法球
            Destroy (gameObject);
        }
    }


具体的一些,能够看 unity3d manual refrernce的东西,有几个表格在后面能够参考:

几个类型碰撞器:

1. 静态碰撞器: 就是只有碰撞器,但没有刚体的

2.刚体碰撞器: 带Rigidbody的碰撞器,这个是最基本的碰撞器

3.运动学刚体碰撞器: 带Rigidbody, 并且RigidbodyIsKinematic打勾的,注意这个碰撞器是不能加力的,只能修改他的transform才能移动

Triggers 触发器

仅须要选中Inspector中的IsTrigger属性选择框。触发器不受物理引擎控制,当和一个触发器发生碰撞时会发出三个独特的触发信息,为了使两个触发器碰撞时发出碰撞事件,其中一个必须包含刚体.

 

今天遇到的一个状况是:若是刚体碰撞器不动,静态碰撞器去碰撞,则不会触发任何信息,而若是静态碰撞器不动,刚体碰撞器(包括运动学刚体碰撞器)去碰撞静态碰撞器,则会触发碰撞,若是是触发器,则会触发事件。因此下面的表格提供了触发的条件,但主动性你们也还须要注意,否则要纠结一段时间的。

 


Static Collider
静态碰撞器

Rigidbody Collider
刚体碰撞器

Kinematic 
Rigidbody Collider
运动学刚体碰撞器

Static 
Trigger Collider
静态触发碰撞器

Rigidbody 
Trigger Collider
刚体触发碰撞器

Kinematic Rigidbody 
Trigger Collider
运动学刚体触发碰撞器

Static Collider 静态碰撞器

Y

Rigidbody Collider 刚体碰撞器

Y

Y

Y

Kinematic Rigidbody Collider
运动学刚体碰撞器

Y

Static Trigger Collider
静态触发碰撞器

Rigidbody Trigger Collider
刚体触发碰撞器

Kinematic Rigidbody Trigger Collider
运动学刚体触发碰撞器



 

Static Collider
静态碰撞器

Rigidbody Collider
刚体碰撞器

Kinematic 
Rigidbody Collider
运动学刚体碰撞器

Static 
Trigger Collider
静态触发碰撞器

Rigidbody 
Trigger Collider
刚体触发碰撞器

Kinematic Rigidbody 
Trigger Collider
运动学刚体触发碰撞器

Static Collider 静态碰撞器

Y

Y

Rigidbody Collider 刚体碰撞器

Y

Y

Y

Kinematic Rigidbody Collider
运动学刚体碰撞器

Y

Y

Y

Static Trigger Collider 静态触发碰撞器

Y

Y

Y

Y

Rigidbody Trigger Collider
刚体触发碰撞器

Y

Y

Y

Y

Y

Y

Kinematic Rigidbody Trigger Collider
运动学刚体触发碰撞器

Y

Y

Y

Y

Y

Y

 

 

下面就是我作的测试状况,都是A物体去撞B物体。

1、A(碰撞体),B(没有碰撞体,不管有没有刚体),没有触发事件。

2、A(碰撞体),B(碰撞体),没有触发事件。

2、A(碰撞体和刚体,开启IsTrigger),B(碰撞体,关闭IsTrigger),双方都能收到触发事件。

3、A(碰撞体和刚体,关闭IsTrigger),B(碰撞体,开启IsTrigger),双方都能收到触发事件。

4、A (碰撞体,关闭IsTrigger),B(碰撞体和刚体,开启IsTrigger),没有触发事件。

5、A (碰撞体,开启IsTrigger),B(碰撞体和刚体,关闭IsTrigger),没有触发事件。


额外实验:

6、A(碰撞体和刚体,开启IsTrigger)自由下落,B(碰撞体)撞击A,双方都能收到触发事件。


根据上面的实验得出,若是要收到触发事件,必须知足以下三个条件:

一、必须都要有碰撞器组件(Collider),其实上面的碰撞事件一样也须要这个前提条件。

二、必须有一个物体带刚体组件,而且处于运动状体中(包括主动运动去撞击别人和在运动过程当中被别人撞击)。

三、两个碰撞器中至少有一个开启了IsTrigger。


此外还有两点:

1、产生触发事件的两个物体会相互穿越,准确的说是由于开启IsTrigger那个物体会被物理引擎锁忽略掉,因此会产生两个物体穿越的状况。

2、两个对象要么都收到碰撞事件,要么都收到触发事件,不会出现一个收到触发事件,一个收到碰撞事件的状况。


还有一个经验点就是,在控制一个物体A去撞另外一个物体B时,不要直接去修改物体A的Transform的position属性,由于你会发现若是即便二者发生了碰撞也仍是会穿越的,缘由就在于咱们是直接设置的坐标,若是物体A有刚体组件的话,应该用AddForce,给物体添加一个力,而后让物理引擎去让物体动,此时若是发生了碰撞的话,就不会穿越了。


好吧,下午折腾了半天以后,我就一直在想那个IsTrigger有啥用,后来在网上搜了一下,说是能够作门的自动打开,就让我想起了Unity3d 4自带的哪一个AngryBots例子,貌似当控制主角走到一个门前时,那个门会自动打开。

相关文章
相关标签/搜索