CharacterController和Normal刚体Box Collider碰撞问题

时间:2014-04-21 12:07:38

标签: unity3d collision

我遇到各种不同情况下的碰撞问题。我会提到他们每个人并等待你的帮助。

案例1:

我有一个移动的对象,附加了characterController并在此插件中移动:http://u3d.as/content/hedgehog-team/...ck-buttons/2Uo

characterController碰撞的对象是附有框架碰撞器的刚体。大多数时候,碰撞与天然碰撞效果完美地结合,例如板条箱的掉落等,并且具有刚体和箱式对撞机的物体的OnCollisionEnter被称为没有任何问题。但有时,这会停止。没有掉落的物体没有碰撞,也没有调用OnCollisionEnter。

我尝试在谷歌上进行调试和搜索但没有任何帮助发现。

案例2:

我有一个移动的对象,附加了characterController并使用“SimpleMove”函数移动。

在这种情况下,没有任何碰撞发生,没有掉落,没有自然效果,也没有在附有刚体和箱式对撞机的物体上调用OnCollisionEnter。

请帮助解决这个错误,我一直试图解决这些问题4天但没有运气,最后我发布在这里。会等你的回复。

感谢。祝你有美好的一天!

2 个答案:

答案 0 :(得分:1)

CharacterController是否有一个附加了'isKinematic'的RigidBody?

答案 1 :(得分:0)

将此脚本添加到您的对象:

#pragma strict

var layerMask : LayerMask; //make sure we aren't in this layer
var skinWidth : float = 0.1; //probably doesn't need to be changed
private var minimumExtent : float;
private var partialExtent : float;
private var sqrMinimumExtent : float;
private var previousPosition : Vector3;
private var myRigidbody : Rigidbody;
//initialize values
function Awake() {
   myRigidbody = rigidbody;
   previousPosition = myRigidbody.position;
   minimumExtent = Mathf.Min(Mathf.Min(collider.bounds.extents.x, collider.bounds.extents.y), collider.bounds.extents.z);
   partialExtent = minimumExtent*(1.0 - skinWidth);
   sqrMinimumExtent = minimumExtent*minimumExtent;
}

function FixedUpdate() {
   //have we moved more than our minimum extent?
   var movementThisStep : Vector3 = myRigidbody.position - previousPosition;
   var movementSqrMagnitude : float = movementThisStep.sqrMagnitude;
   if (movementSqrMagnitude > sqrMinimumExtent) {
      var movementMagnitude : float = Mathf.Sqrt(movementSqrMagnitude);
      var hitInfo : RaycastHit;
      //check for obstructions we might have missed
      if (Physics.Raycast(previousPosition, movementThisStep, hitInfo, movementMagnitude, layerMask.value))
         myRigidbody.position = hitInfo.point - (movementThisStep/movementMagnitude)*partialExtent;
   }
   previousPosition = myRigidbody.position;
}

不要忘记指定要检测的图层。

祝你好运!