【问题标题】:Why are my characters flipping through the floor?为什么我的角色在地板上翻来覆去?
【发布时间】:2017-05-08 15:04:18
【问题描述】:

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

这是我的脚本...

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);
        }
    }
}

我尝试为角色添加刚体并限制旋转,但这不起作用。奇怪的是,字符控件根本没有旋转。在场景视图中,我可以看到角色对撞机保持原样,但角色会自行翻转网格。

【问题讨论】:

    标签: c# unity3d game-physics


    【解决方案1】:

    看起来是因为他们走到一个角落里,不断地在两堵墙之间弹跳,导致他们表现得很奇怪。我会添加一种检查一系列非常快速的碰撞的方法,以检测它们是否在角落或卡住,然后相应地进行调整,也许使用旋转 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 秒内发生多次碰撞,您可以处理它。

    希望这会有所帮助!

    【讨论】:

    • 我尝试将它添加到我的 OnColliderHit 方法中,但我无法让它抛出调试消息。
    • 你可以尝试在场景中只设置一个角色,并在每次他们与墙壁碰撞时进行调试,以检查他们是否真的在角落快速碰撞?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-17
    • 2018-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多