代码之家  ›  专栏  ›  技术社区  ›  AquaDev

vector3.slerp()停止而不完成它必须做的事情

  •  0
  • AquaDev  · 技术社区  · 7 年前

    所以我想让玩家去某个地方,但我不想让它看起来像是在传送,所以我用了vector3.slerp3,但问题是它不会在中途停止。

    代码如下:

    void Update()
    {
        if (Input.GetKeyDown("space"))
        {
            StartCoroutine(GoToTargetPos());
        }
    } IEnumerator GoToTargetPos()
    {
        Vector3 targetPos = transform.position + offset;
    
        transform.position = Vector3.Slerp(transform.position, targetPos, Time.deltaTime * speed);
    
        yield return new WaitForSeconds(0.75f);
    
        isDone = true;
    }
    

    对不起,如果我的英语不好。

    2 回复  |  直到 7 年前
        1
  •  5
  •   JeanLuc    7 年前

    快速回答,只是为了证明它有效…

    IEnumerator GoToTargetPos()
    {
        Vector3 targetPos = transform.position + offset;
        float timeElapsed = 0.0f;
        float timeToMove = 0.75f; // Using this since that is how you are waiting...
        while(timeElapsed < timeToMove)
        {
           timeElapsed += Time.deltaTime;
           float ratio = Mathf.Clamp01(timeElapsed / timeToMove);
           transform.position = Vector3.Slerp(transform.position, targetPos, ratio);
    
           yield return null; // Return to this at the beginning of the next frame
        }
        isDone = true;
    }
    
        2
  •  0
  •   dome12b    7 年前

    使用 Slerp 在一次联谊会上是个坏主意我想…

    如中所述 docs 我建议使用 球面线性插值 Update 以下内容:

    试试这个:

    public class Moving : MonoBehaviour {
    
        public Vector3 offset;
        public float offsetTime = 2.0f;
        private float t = 0.0f;
        private bool moveMe = false;
        private Vector3 targetPos;
        private Vector3 startPos;
    
        // Use this for initialization
        void Start () {
            targetPos = transform.position + offset;
            startPos = transform.position;
            StopMoving();
        }
    
        public void StartMoving()
        {
            t = 0.0f;
            moveMe = true;
        }
    
        private void StopMoving()
        {
            t = 0.0f;
            moveMe = false;
        }
    
        // Update is called once per frame
        void Update () {
    
            if (moveMe)
            {
                t += Time.deltaTime / offsetTime;
    
                if(t < 1.0f)
                {
                    transform.position = Vector3.Slerp(startPos, targetPos, t);
                }
                else
                {
                    StopMoving();
                }
            }
        }
    }