前提・実現したいこと
オブジェクトAとオブジェクトBが接触したらオブジェクトBがオブジェクトCに移動する処理を接触判定内で行いたいのですが、
実際に処理を書くとオブジェクトAとオブジェクトBが接触した瞬間Unityが止まってしまいました。
ここに質問の内容を詳しく書いてください。
発生している問題・エラーメッセージ
Unityが再生不可(応答しなくなる)
該当のソースコード
C#
1//呼び部分 2void OnTriggerStay(Collider other){ 3 //Playerとの処理 4 if (other.gameObject.tag == "Player"){ 5 switch (gameObject.tag) { 6 case "Parts": 7 PartsSearchArea(); 8 break; 9 case "DumyParts": 10 PartsSearchArea(); 11 break; 12 case "Core": 13 CoreSearchArea(); 14 break; 15 case "Base": 16 BaseSearchArea(); 17 break; 18 } 19 } 20} 21//メソッド内↓ 22void PartsSearchArea(){ 23 float targetDistance = Vector3.Distance(gameObject.transform.position, warp.transform.position); 24 25 while (targetDistance > 1.0f){ 26 Vector3 dis = warp.transform.position - gameObject.transform.position; 27 gameObject.transform.position += 28 new Vector3(dis.z / targetDistance, dis.y / targetDistance, -(dis.x / targetDistance)); 29 targetDistance = Vector3.Distance(gameObject.transform.position, warp.transform.position); 30 } 31}
試したこと
移動処理がだめだと思いwhile内の処理を一旦外に出してやってみました
その結果、移動処理自体は問題なかったです。
補足情報(FW/ツールのバージョンなど)
Unity2018.3.8f1
Unityの質問であれば、Unityのタグを付けてください。
OnTrigger~内でもwhileは使えますが、使うべきではないかもしれません。
まず無限ループの可能性が濃厚なので、試しにStartメソッドからPartsSearchAreaメソッドを呼んでみてください。
恐らくwhileの中で1フレームも待機していないのでpositionが変化しない扱いになり、targetDistanceに変化が起こらず無限ループしているんじゃないかと思います。
(つまりOnTriggerStayは無関係/どっから呼ぼうがwhileが無限ループを起こしていたらUnityが止まる)
使うべきではないかもしれない理由は、「OnTriggerStayはぶつかっている間、毎物理フレーム毎(デフォルトなら0.02秒毎)に呼ばれ続ける」という点です。
今回のコードが正しく動いていれば問題無いのですが(条件を満たさなければループしないから)、もし毎回大量にループするwhileだったら、0.02秒毎に実行したら恐ろしいことになるのは想像出来るかと思います。
回答ありがとうございます、教えていただいた案をもとに少し変更したいと思います。
回答2件
あなたの回答
tips
プレビュー