質問: true; もしどなたか原因や修正方法がわかる方がいたら、教えていただきたいです。 足りない情報は追加させていただきますので、指摘をしていただければと思います。 よろしくお願いいたします。
回答: (スクリプト内部は精査していませんので参考までに) `StartCoroutine`はコルーチンを呼び出す命令ですが、そのままではコルーチンの完了を待ちません。 また、複数のコルーチンを呼び出した場合、(staticでない限り)並列で進行します。 なので今回の場合は以下の流れになっているものと思います。 1.`StartCoroutine(SmoothMovement(end));`が呼び出されて移動開始。 2.直後に`StartCoroutine(SmoothMovement(start));`が呼び出されるも、内部のwhileの条件に合致せずすぐにこのコルーチンは終了。 3.`SmoothMovement(end)`側のコルーチンは維持されているので「1つ目だけ移動する」ように見える。 対処方法としては、呼び出し側のメソッドも`void`から`IEnumerator`に変えて、 `yield return SmoothMovement(end);`などとすると処理完了を待つようになります。 また、コールバックを設定してそれを受け取りつつ次の処理をするようにしてもいいと思います。 (コメントを受けて追記) 以下はyield returnにしたスクリプト例です。 ``` //敵の攻撃動作 IEnumerator EnemyAction () { //~(中略)~ //ここで1/2にするとそもそも動かなくなる float halfX = xDir; float halfY = yDir; //現在地→プレイヤーへ Vector2 start = transform.position; Vector2 end = start + new Vector2(halfX, halfY); //StartCoroutineから変更 yield return SmoothMovement(end); yield return SmoothMovement(start); boxCollider.enabled = true; } ``` コールバックのやり方は「Kamanii Square - Unity - コールバックの記述まとめ」などを参考にどうぞ。 (SmoothMovement内部にて、一番最後に登録したメソッドを呼ぶイメージです)