文档库 最新最全的文档下载
当前位置:文档库 › unity碰撞需注意

unity碰撞需注意

Unity3d中参与碰撞的物体分2种类型:
一、发起碰撞的物体。
二、接收碰撞的物体。
1. 参与发起碰撞物体:Rigodbody, CharacterController 角色碰撞器。
2. 参与接收碰撞的物体:所有Collider .
工作的原理为:发生碰撞的物体中必须要有“发起碰撞”的物体。否则,碰撞不响应。
比如:两面墙都只用BoxCollider ,所以墙与墙之间无反应。
比如:一个带有Rigidbody属性的箱子,能落到带有MeshCollider属性的地面上。
比如:一个带有Rigidbody属性的箱子,可以被一个带有CharacterController 属性的人推着跑。
在所有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.
脚本:
在魔法球上添加脚本






(1) 如果游戏对象(即gameObject)的初始状态为关闭状态,那么运行程序,Awake函数不会执行;反之,如果游戏对象的初始状态为开启状态,那么Awake函数会执行。并且,值得注意的一点是,Awake函数的执行与否与脚本实例的状态(启用或禁用)并没有关系,而是与脚本实例所绑定的游戏对象的状态有关。

(2) 在不切换场景的前提下,原本处于关闭状态的游戏对象,当它被首次开启时,Awake函数会执行,并且是只在首次开启时才会执行;而已经开启(激活)的游戏对象(Awake函数已经执行过一次),将它关闭后再次开启,Awake函数不会再次执行。看来这是对应了手册中说明的在脚本实例的整个生命周期中仅执行一次的情况。

(3) 如果重新加载场景,那么场景内Awake函数的执行情况重新遵循上述两点。

2、 Start函数

还是先看参考手

册中对Start函数的一些说明情况:

当Update函数第一次被调用前会调用Start函数;Start函数只在脚本实例被启用时才会执行;Start函数总是在Awake函数之后执行。在此基础之上,自己的测试总结如下 (没有特殊说明,均为在不切换场景的前提下):

(1) 如果游戏对象被关闭,那么Start函数不会执行。想一想这是理所当然的,游戏对象关闭了,脚本实例不会被加载,Awake函数不会执行,Start函数不会执行,Update函数等也不会执行。

(2) 如果游戏对象开启了,对象上绑定的脚本实例被禁用了,那么Start函数不会执行。这是Start函数的特点,只有在脚本实例被启用时它才会执行,这个说明中有提到。注意,这与Awake函数是有区别的。

(3) 如果游戏对象开启了,对象上绑定的脚本实例也开启了,那么Start函数会执行。并且Start函数只会在脚本实例首次被开启时才会执行。如果是已经开启过的脚本实例被关闭后再次开启,那么Start函数不会再次执行。

(4) 如果重新加载场景,那么场景内Start函数的执行情况重新遵循上述三点。



除此之外,还有对Awake函数和Start函数都比较重要的一点,那就是当游戏对象之间存在父子关系时(不论层级的多少)。这时,父游戏对象的状态(开启或关闭)完全决定了子游戏对象上的脚本函数的执行情况。总的来说就是,只有在父游戏对象被开启的状态下,程序才会考虑是否调用子游戏对象上的脚本函数(Awake与Start等)。自上而下,以此类推。

相关文档