本文主要是介绍OnTrrigerEnter与OnCollisionEnter、OnControllerColliderHit、Rigidbody、CharacterController,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
1,测试OnTriggerEnter和OnCollisionEnter的区别
测试:如果两个物体A,B
两者都有碰撞体collider(Box Collider,Sphere Collider,Capsule Collider等)
A,B都有刚体(Rigidbody)
A或者B中有一个勾选isTrigger或者两者都勾选isTrigger A和B都可以进入OnTriggerEnter方法,但是不可进入OnCollisionEnter方法。
A和B都不勾选isTrigger,A和B能进入OnCollisionEnter方法但是不能进入OnTriggerEnter方法。
结论:
OnCollisionEnter方法必须是在两个碰撞物体都不勾选isTrigger的前提下才能进入,反之只要勾选一个isTrigger那么就能进入OnTriggerEnter方法。
OnCollisionEnter和OnTriggerEnter是冲突的不能同时存在的。
2,OnTriggerEnter和OnCollisionEnter的选择。
如果想实现两个刚体物理的实际碰撞效果时候用OnCollisionEnter,Unity引擎会自动处理刚体碰撞的效果。
如果想在两个物体碰撞后自己处理碰撞事件用OnTriggerEnter。
3,一些技巧。
3.1:刚体(Rigidbody)的使用。
两个碰撞的物体A 和 B
现在我们就可以分两种模式来分析了,就是OnTrigger模式和OnCollision模式,因为上面已经详细介绍了两者是对立的模式,
在OnCollision模式下:
测试1:如果只有A有刚体(Rigidbody),那么当A去碰撞B时,发现A弹开B没有动。A和B都进入OnCollisionEnter方法
结论1:只有刚体能实现真实的物理碰撞。
测试2:如果只有A有刚体(Rigidbody),那么当B去碰撞A时,发现没有碰撞效果,A和B都没有进入OnCollisionEnter方法。
结论2:实现碰撞的条件是,发起碰撞方必须具有刚体。
这里我猜测了刚体是用来实现物理真实碰撞的Component,但是这个想法是错误的,因为OnTriggerEnter也必须有一个物体具有刚体,所以猜测刚体应该是一个判断是否实现碰撞的是与否的标志。
在OnTrigger模式下:
A和B必须有一个有刚体(Rigidbody),A和B都可以进入OnTriggerEnter方法。
4,知识扩展。
上面的内容中有的实验是A,B有一个有刚体,有的实验是A,B都有刚体,那么为什么不干脆把两个物体都加刚体就没这么多麻烦了?
其实是这样的,真实游戏里面,有太多的物体,而这些物体如果都有刚体那么对系统的开销是很大的,如果可以减少一半的开销是很不错的选择。
比如地面就可以不设置刚体,因为地面是永远不动的,把人物设置刚体就可以实现真实的物理碰撞效果了。
CharacterController.OnControllerColliderHit 控制碰撞器碰撞
function OnControllerColliderHit (hit : ControllerColliderHit) : void
Description描述
OnControllerColliderHit is called when the controller hits a collider while performing a Move.
当控制器碰撞一个正在运动的碰撞器时,OnControllerColliderHit 被调用。
This can be used to push objects when they collide with the character
这个可以被用于推动物体,当他们碰撞角色时。
- C#//OnControllerColliderHit 此函数要挂载在角色控制器CharacterController上。
using UnityEngine;
using System.Collections;public class example : MonoBehaviour {public float pushPower = 2.0F;void OnControllerColliderHit(ControllerColliderHit hit) {Rigidbody body = hit.collider.attachedRigidbody;if (body == null || body.isKinematic)return;if (hit.moveDirection.y < -0.3F)return;Vector3 pushDir = new Vector3(hit.moveDirection.x, 0, hit.moveDirection.z);body.velocity = pushDir * pushPower;}
}
是让GameObject能够按照真实的物理规律运动。不再使用Transform组件移动或旋转物体,而是用力(force)!如重力、摩擦力、恒定力等。
角色控制器Character Controller
主要用于第一或第三人称控制中。它对外界施加的力不作反应,也不自动的把其他的刚体推开(刚体组件撞上另一个刚体会对其施加力)。如果你想推开其他刚体,或在碰到其他刚体时作出反应,需要重载 OnControllerColliderHit() 函数并实现你的逻辑。角色控制器和Collider不能同时存在,可以与Rigidbody同时存在,如果不要求对物理力做出真实的反应的话,它可以取代Rigidbody和Collider。
碰撞器和触发器
碰撞器和触发器的区别在于Collider的isTrigger 参数是true or false ,如果是true,那它就是一个触发器,可以被穿透,对应函数为OnTriggerEnter,OnTriggerExit,OnTriggerStay;如果值为false,那它就是一个碰撞器,不可被穿透,在碰撞时调用OnCollisionEnter,OnCollisionExit,OnCollisionStay 函数,其函数的参数为Collision类,类中包括接触点,接触速度等信息。
- center
- collisionFlags
- detectCollisions
- height
- isGrounded
- Move
- OnControllerColliderHit
- radius
- SimpleMove
- slopeLimit
- stepOffset
- velocity
CharacterController.OnControllerColliderHit 控制碰撞器碰撞
function OnControllerColliderHit (hit : ControllerColliderHit) : void
Description描述
OnControllerColliderHit is called when the controller hits a collider while performing a Move.
当控制器碰撞一个正在运动的碰撞器时,OnControllerColliderHit 被调用。
This can be used to push objects when they collide with the character
这个可以被用于推动物体,当他们碰撞角色时。
- C#
- JavaScript
using UnityEngine;
using System.Collections;public class example : MonoBehaviour {public float pushPower = 2.0F;void OnControllerColliderHit(ControllerColliderHit hit) {Rigidbody body = hit.collider.attachedRigidbody;if (body == null || body.isKinematic)return;if (hit.moveDirection.y < -0.3F)return;Vector3 pushDir = new Vector3(hit.moveDirection.x, 0, hit.moveDirection.z);body.velocity = pushDir * pushPower;}
}
这篇关于OnTrrigerEnter与OnCollisionEnter、OnControllerColliderHit、Rigidbody、CharacterController的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!