Unity两个物体发生碰撞的条件
2016-05-07 18:37
609 查看
好吧,网上好多资料显示发生碰撞条件如下:
两个对象都有Collider组件且至少一个有Rigidbody组件
其中至少一个物体(必须运动的)必须带有碰撞器(collider)+刚体(Rigidbody),另一个物体(可以静止也可以运动)也必须至少带有collider
也有说一方有CharacterController,另一方有Collider,于是这里对 CharacterController做点补充。
Unity圣典中的说法是:
CharacterController角色控制器允许你在受制于碰撞的情况下很容易的进行运动,而不用处理刚体。(个人理解:用CharacterController组件,它包含Rigidbody组件的一些属性,就不用用Rigidbody组件了)。 角色控制器不受力的影响,仅仅当你调用Move函数时才运动。然后它将执行运动,但是受制于碰撞。
下面说说我自己的理解:
(1)添加了CharacterController组件后,人物将不受力影响,这时即使加上Rigidbody组件,并启用Use Gravity,人物也不会受重力影响,在脚本中通过rigidbody对人物施加力也是无效的。也就是说CharacterController屏蔽了Rigidbody的所有属性和方法。要控制CharacterController移动,可以通过在脚本中调用Move方法使其移动。
(2)虽然CharacterController不受力,但是有个例外是,它受碰撞的影响。
一般的碰撞发生条件是:碰撞的两个物体必须都有Collider,并且其中一个有Rigidbody。
但是如果一方有CharacterController,则不需要。这时碰撞发生的条件为:
一方有CharacterController,另一方有Collider。CharacterController本身就继承自Collider。
(3)碰撞发生时,CharacterController不会推动其它物体移动,也就是说CharacterController不会对它所碰撞的物体施加物理作用。除非我们在脚本中添加了OnControllerColliderHit()函数,在该函数中使用被碰撞物体的rigidbody对被碰撞物体施加力。
两个对象都有Collider组件且至少一个有Rigidbody组件
其中至少一个物体(必须运动的)必须带有碰撞器(collider)+刚体(Rigidbody),另一个物体(可以静止也可以运动)也必须至少带有collider
也有说一方有CharacterController,另一方有Collider,于是这里对 CharacterController做点补充。
Unity圣典中的说法是:
CharacterController角色控制器允许你在受制于碰撞的情况下很容易的进行运动,而不用处理刚体。(个人理解:用CharacterController组件,它包含Rigidbody组件的一些属性,就不用用Rigidbody组件了)。 角色控制器不受力的影响,仅仅当你调用Move函数时才运动。然后它将执行运动,但是受制于碰撞。
下面说说我自己的理解:
(1)添加了CharacterController组件后,人物将不受力影响,这时即使加上Rigidbody组件,并启用Use Gravity,人物也不会受重力影响,在脚本中通过rigidbody对人物施加力也是无效的。也就是说CharacterController屏蔽了Rigidbody的所有属性和方法。要控制CharacterController移动,可以通过在脚本中调用Move方法使其移动。
(2)虽然CharacterController不受力,但是有个例外是,它受碰撞的影响。
一般的碰撞发生条件是:碰撞的两个物体必须都有Collider,并且其中一个有Rigidbody。
但是如果一方有CharacterController,则不需要。这时碰撞发生的条件为:
一方有CharacterController,另一方有Collider。CharacterController本身就继承自Collider。
(3)碰撞发生时,CharacterController不会推动其它物体移动,也就是说CharacterController不会对它所碰撞的物体施加物理作用。除非我们在脚本中添加了OnControllerColliderHit()函数,在该函数中使用被碰撞物体的rigidbody对被碰撞物体施加力。
// this script pushes all rigidbodies that the character touches var pushPower = 2.0; function OnControllerColliderHit (hit : ControllerColliderHit) { var body : Rigidbody = hit.collider.attachedRigidbody; // no rigidbody if (body == null || body.isKinematic) return; // We dont want to push objects below us if (hit.moveDirection.y < -0.3) return; // Calculate push direction from move direction, // we only push objects to the sides never up and down var pushDir : Vector3 = Vector3(hit.moveDirection.x, 0, hit.moveDirection.z); // If you know how fast your character is trying to move, // then you can also multiply the push velocity by that. // Apply the push body.velocity = pushDir * pushPower; }
相关文章推荐
- Unity中游戏暂停和开始怎么实现?
- unity3d中脚本生命周期(MonoBehaviour lifecycle)
- 粒子的控制
- Unity3D Quaternion各属性和函数测试
- Unity如何实现磁铁效果?(比如跑酷游戏中,获得磁铁道具后,自动吸附附近金币的效果。)
- Unity学习笔记12——打飞机战斗模块
- Unity3D-UI-Canvas
- WebClient 没有销毁 导致 Unity 卡死
- Unity3D 场景平移、缩放
- 【翻译】 Unity3D VR 教程:3.VR中的交互
- Unity3d Update和FixedUpdate、LateUpdate的区别
- unity 控制移动的方法
- Unity3D 摄像机(Camera)
- Unity中Awake与Start函数的区别
- Unity 模仿官方例子 点击时添加爆炸力
- Unity3D之详解游戏开发音频的播放
- Unity3D脚本手册
- Unity3D用户手册
- Unity3D组件参考手册
- Unity Shaders and Effects Cookbook (6-3) 修改渲染队列Queue 来 修改渲染顺序