実現したいこと
キャラクターを前に動かしたいときに前に障害物があった場合停止する処理をしたいです。コードに不具合があるなど、どのような不備があるのか教えてください。
発生している問題・分からないこと
うまく作動せず延々と壁にぶつかり続け、操作不能になります。コライダーなどはしっかり設定しているため、何が不備なのかわかりません。
エラーメッセージ
error
1延々とぶつかり続ける(エラーメッセージはなし)
該当のソースコード
C#
1using System.Collections; 2using UnityEngine; 3using UnityEngine.EventSystems; 4 5public class chara_move : MonoBehaviour 6{ 7 [SerializeField] LayerMask solidObjectsLayer; 8 9 Animator animator; 10 bool isMoving; 11 12 private void Awake() 13 { 14 animator = GetComponent<Animator>(); 15 } 16 17 void Update() 18 { 19 if (isMoving == false) 20 { 21 float x = Input.GetAxisRaw("Horizontal"); 22 float y = Input.GetAxisRaw("Vertical"); 23 24 if (x != 0) 25 { 26 y = 0; 27 } 28 29 if (x != 0 || y != 0) 30 { 31 animator.SetFloat("InputX", x); 32 animator.SetFloat("InputY", y); 33 StartCoroutine(Move(new Vector2(x, y))); 34 } 35 } 36 animator.SetBool("IsMoving", isMoving); 37 38 } 39 40 IEnumerator Move(Vector3 direction) 41 { 42 isMoving = true; 43 Vector3 targetPos = transform.position + direction; 44 if (IsWalkable(targetPos) == false) 45 { 46 isMoving = false; 47 yield break; 48 } 49 while ((targetPos - transform.position).sqrMagnitude > Mathf.Epsilon) 50 { 51 transform.position = Vector3.MoveTowards(transform.position, targetPos, 5f * Time.deltaTime); 52 yield return null; 53 } 54 55 transform.position = targetPos; 56 isMoving = false; 57 } 58 59 bool IsWalkable(Vector3 targetPos) 60 { 61 return Physics2D.OverlapCircle(targetPos, 0.2f, solidObjectsLayer) == false; 62 } 63}
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
特に変わりはなかった
補足
特になし
Ridibody2Dを使って、当たり判定を実装してはどうでしょうか?
Rigidbody 2D は使っているんですけど、ぶつかっても止まらず延々とぶつかり続けるんですよね…
Rigidbody2Dはどんな設定で、どのように使っていますか?
もしかしたら「Rigidbody2Dが邪魔になって移動できない」ということかもしれません。
Rigidbody2Dの設定はボディタイプはダイナミックで、質量だけ1にしてます。後は衝突判定は連続的で、Z軸の回転は固定してます。
この場合「Physics2D.OverlapCircle」で移動するか判定しているので、物理判定は不要だと思います。
むしろ、その物理判定によって「指定された位置まで移動できない」となってしまって現状の問題になっている可能性もあります。
試しにRigidbody2Dなし(Collider2Dのみ)にしましたが、動作しました。
そのため「Rigidbody2Dによる物理的な挙動」は不要です。
そもそも、このスクリプトはRPGのようなマス目単位で移動するものですが、その点は理解していますか?
マス移動のRPGを作っているので、大丈夫です。
Rigidbody2Dを試しに抜いたところ、タイルマップの建物にぶつからずに通過してしまいました。
TilemapCollider2Dは入れています。