Unity,Rigidbody角色不断摔倒

时间:2014-06-28 21:09:11

标签: unity3d rigid-bodies

我有一个问题,试图阻止我的角色翻身,但允许它俯仰和偏航。我看到的建议是锁定不同的轴,但无论我是否锁定x,y或z轴,我总是遇到角色可能会翻倒的情况。我能得到的最好的是锁定y轴和z轴。这允许角色改变音高以符合地形。但是,如果我在上山或下山时向左或向右转,我可以将角色翻过来。

这是我目前的移动代码(如果它有帮助)。我没有其他代码,我的刚体是默认值。我有一个网格collier,字符集为凸,但默认为。

有关如何使这项工作的任何建议? 这是y和z轴被锁定的现场演示。只是在山上跳华尔兹,左转或右转,你就会摔倒。 (ASWD控制)

https://dl.dropboxusercontent.com/u/27946381/Builds/builds.html

非常感谢!

var speed = 3.0;
var rotateSpeed = 3.0;

function FixedUpdate() {

    var hAxis = 0;
    var vAxis = 0;

    if( Input.GetAxis("Horizontal") > 0 ) { hAxis = 1.0; } else if( Input.GetAxis("Horizontal") < 0 ) { hAxis = -1.0; } else { hAxis = 0.0; }
        if( Input.GetAxis("Vertical") > 0 ) { vAxis = 1.0; } else if( Input.GetAxis("Vertical") < 0 ) { vAxis = -1.0; } else { vAxis = 0.0; }

    var rigidBody: Rigidbody = GetComponent(Rigidbody);

    // Rotate around y axis
    // transform.Rotate(0, hAxis * rotateSpeed, 0);
    var deltaRotation : Quaternion = Quaternion.Euler(0, hAxis * rotateSpeed, 0);
    rigidbody.MoveRotation(rigidbody.rotation * deltaRotation);

    // Move forward / backward
    var forward = transform.TransformDirection(Vector3.forward);
    var currSpeed = speed * vAxis;

    rigidBody.MovePosition( rigidBody.position + (forward * currSpeed) );

    var animatorController: Animator = GetComponent(Animator);
    animatorController.SetFloat("Speed", currSpeed);

}

2 个答案:

答案 0 :(得分:0)

好吧也许你应该检查你的刚体属性称为重力比例..将它设置为0并且你永远不会掉落

答案 1 :(得分:0)

我相信你的问题出在这些MovePosition和MoveRotation中。看看脚本参考 - 这些方法基本上忽略了碰撞,直到身体以指定姿势传送。即你可能会把身体置于某种无法解决的状态,当物理探测器无法找到合适的力量将身体推离另一个对撞机时,身体就会摔倒。在这种情况下,最好使用AddForce和AddTorque。

此外,您可以使用 CharacterController 代替 RigidBody 。虽然它根本不能旋转,但是有精确的运动运动方法和精确的碰撞检测。并且您可以将另一个主体附加到角色控制器并根据需要旋转它。