

オブジェクトをゆっくり指定の位置まで移動させたいのですがゆっくりではなく一瞬で最後の指定ポイントについてしまいます。  
Vector3.Lerpはwhileだとうまく動かないのでしょうか？  
いい方法があればご教授お願いします。

[code]

        IEnumerator Move()
        {
            foreach(Transform _childobject in _pointParent)
            {
                _spped = 0;
    
                while(true)
                {
    
                    _spped += Time.deltaTime / 2f;
                    this.transform.position = Vector3.Lerp(this.transform.position, _childobject.position, _spped);
    
                    if(_spped > 1) break;
    
                }
                 yield return null;
            }
        }
    
[/code]


CC BY-SA 4.0
2020-11-11T03:02:09.710
71855
2022-07-27T08:07:20.640
40081
question
c# unity3d
オブジェクトをゆっくり指定の位置まで移動させたい


コルーチンでは `yield return null;` で中断し次のフレームから再開となります。  
提示されているコードではwhile文を抜けたあとに `yield return null;`
しているため、whileの処理が同じフレームで処理されることになり一瞬で処理が終わります。なので、`yield return null;`
はwhile文の中に記述するのが正しいと思います。

提示されたコードは複数点を通過して移動することを意図しているようですので、それを踏まえたコードを例示します。

[code]

    IEnumerator Move()
    {
      foreach (Transform childobject in _pointParent)
      {
        var start = this.transform.position;
        var goal = childobject.position;
        var t = 0.0f;
    
        while (t < 1.0f)
        {
          t += Time.deltaTime / 2.0f;
          t = (t > 1.0f) ? 1.0f : t; // 上限は1.0
          this.transform.position = Vector3.Lerp(start, goal, t);
          yield return null;
        }
      }
    }
    
[/code]


CC BY-SA 4.0
2020-11-12T11:51:35.217
71896
2020-11-12T11:51:35.217
14817
71855
answer