为什么我的角色在地板上翻来覆去?

Why are my characters flipping through the floor?

我正在编写一个简单的巡逻脚本,一切正常,但角色在转身时会在地板上随机滚动。这是他们的短片...

这是我的脚本...

public class Patrol : MonoBehaviour
{
    public float speed = 5;
    public float directionChangeInterval = 1;
    public float maxHeadingChange = 30;
    public bool useRootMotion;

    CharacterController controller;
    float heading;
    Vector3 targetRotation;

    Vector3 forward
    {
        get { return transform.TransformDirection(Vector3.forward); }
    }

    void Awake()
    {
        controller = GetComponent<CharacterController>();

        // Set random initial rotation
        heading = Random.Range(0, 360);
        transform.eulerAngles = new Vector3(0, heading, 0);

        StartCoroutine(NewHeadingRoutine());
    }

    void Update()
    {
        transform.eulerAngles = Vector3.Slerp(transform.eulerAngles, targetRotation, Time.deltaTime * directionChangeInterval);
        if (useRootMotion)
        {
            return;
        }
        else
        {
            controller.SimpleMove(forward * speed);
        }
    }

    void OnControllerColliderHit(ControllerColliderHit hit)
    {
        if (hit.gameObject.tag == "Player")
        {
            // Bounce off the obstacle and change direction
            var newDirection = Vector3.Reflect(forward, hit.normal);
            transform.rotation = Quaternion.FromToRotation(Vector3.forward, newDirection);
            heading = transform.eulerAngles.y;
            NewHeading();
        }
        if (hit.gameObject.tag == "Boundary")
        {
            // Bounce off the obstacle and change direction
            var newDirection = Vector3.Reflect(forward, hit.normal);
            transform.rotation = Quaternion.FromToRotation(Vector3.forward, newDirection);
            heading = transform.eulerAngles.y;
            NewHeading();
        }
    }


    /// Finds a new direction to move towards.
    void NewHeading()
    {
        var floor = transform.eulerAngles.y - maxHeadingChange;
        var ceil = transform.eulerAngles.y + maxHeadingChange;
        heading = Random.Range(floor, ceil);
        targetRotation = new Vector3(0, heading, 0);
    }

    /// Repeatedly calculates a new direction to move towards.
    IEnumerator NewHeadingRoutine()
    {
        while (true)
        {
            NewHeading();
            yield return new WaitForSeconds(directionChangeInterval);
        }
    }
}

我试过给角色添加刚体并限制旋转,但没有用。奇怪的是,角色控件根本没有旋转。在场景视图中,我可以看到角色碰撞器保持原样,但角色自行翻转网格。

看起来是因为他们走到一个角落,不断地在两堵墙之间弹跳,导致他们表现得很奇怪。我会添加一种方法来检查一系列非常快速的碰撞,以检测它们是在角落里还是被卡住,然后相应地进行调整,也许是旋转 180 度并继续行走等方法。

你可以这样做:

float fTime = 0.1f
float fTimer = 0;
int iCollisionCounter;
if(collision){
   if(fTimer > 0) iCollisionCounter++;
   if(iCollisionCounter >= 5) //Character is stuck
   fTimer = fTime;
}
Void Update(){
    fTimer -= time.deltaTime;
}

这意味着如果在 0.1 秒内发生多次碰撞,您可以处理它。

希望对您有所帮助!