実現したいこと
Unityで敵に8秒間待たせた後、今のplayerの位置にスムーズに移動したい。
なお、8秒間待たせた後のその時のplayerの位置に移動させたいので、playerが移動すると、よけれるようにしたい。
発生している問題・分からないこと
while文を追加すると、8秒間立った後にフリーズします。
エラーメッセージ
error
1フリーズ(タスクマネージャーなどで強制終了しなければならなくなっている状況)になっています。
該当のソースコード
C#
1using System.Collections; 2using System.Collections.Generic; 3using UnityEditor; 4using UnityEngine; 5using System.Threading.Tasks; 6 7public class mobMove : MonoBehaviour 8{ 9 public Kusuri kusuri; //ゲーム内で使う「クスリ」という物体のスクリプト 10 public GameObject pl; //player 11 public GameObject ka; //自分自身(mob) 12 13 float startTime; 14 [SerializeField] private float duration = 100; 15 16 17 // Start is called before the first frame update 18 void Start() 19 { 20 transform.position = new Vector2(14f, 4f); //モブの初期位置 21 startTime = Time.time; 22 } 23 24 // Update is called once per frame 25 async void Update() 26 { 27 if (kusuri.stage == 3) 28 { 29 await waitTime(8); 30 int sw; 31 sw = Random.Range(1, 2); 32 Transform target = pl.transform; 33 switch (sw) 34 { 35 case 1: 36 while (target.position != ka.transform.position) //←ここから 37 { 38 var t = (Time.time - startTime) / duration; 39 var xPos = Mathf.SmoothStep(ka.transform.position.x, target.position.x, t); 40 var yPos = Mathf.SmoothStep(ka.transform.position.y, target.position.y, t); 41 var zPos = Mathf.SmoothStep(ka.transform.position.z, target.position.z, t); 42 ka.transform.position = new Vector3(xPos, yPos, zPos); 43 } 44 break; 45 } 46 Debug.Log(sw); 47 } 48 } 49 50 async Task waitTime(float time) 51 { 52 int T = (int)time * 1000; 53 await Task.Delay(T); 54 } 55} 56
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
検索して出てきたのを見ても、自分の状況とは違うかったので参考になりませんでした。(本当はなったのかもしれないけど)
補足
while文の内容だけ残して実行してもフリーズはしないので、while文に原因があると思っています。(違うかもしれません。)
ぼくは、モブを動かす際にMathf.SmoothStep();
を使っているので、ループしないと目的地まで移動できなくなります。
回答4件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2024/02/11 09:40 編集