質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

1回答

5878閲覧

Unity2Dにてプレイヤー移動の際に壁にめり込む

Karna03

総合スコア12

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2019/04/03 09:28

質問内容

Unity2Dにて、プレイヤーのムーブメントを実装したのですが、
壁に向かって動いた際にガクガクと壁にめり込んでしまい、行動不可能になってしまいます。

このような感じでめり込みます→Gyazo GIF

解決方法のひとつとして、targetのタイルが当たり判定を持っているかの可否でvoid Move()メソッドを呼び出すという方法が挙げられたのですが、具体的な実装方法も分かりません。

該当のソースコード

C#

1Vector3 MOVEX = new Vector3(1.0f, 0, 0); 2 Vector3 MOVEY = new Vector3(0, 1.0f, 0); 3 4 float step = 4f; 5 Vector3 target; 6 Vector3 prevPos; 7 8 Animator animator; 9 Tilemap tile; 10 11 void Start() 12 { 13 target = transform.position; 14 animator = GetComponent<Animator>(); 15 16 var tilemap = GetComponent<Tilemap>(); 17 tilemap = tile; 18 } 19 20 void Update() 21 { 22 if (transform.position == target) 23 { 24 SetTargetPosition(); 25 } 26 Move(); 27 } 28 29 void FixedUpdate() 30 { 31 32 } 33 34 void SetTargetPosition() 35 { 36 37 prevPos = target; 38 39 if (Input.GetKey(KeyCode.RightArrow)) 40 { 41 target = transform.position + MOVEX; 42 SetAnimationParam(1); 43 return; 44 } 45 if (Input.GetKey(KeyCode.LeftArrow)) 46 { 47 target = transform.position - MOVEX; 48 SetAnimationParam(2); 49 return; 50 } 51 if (Input.GetKey(KeyCode.UpArrow)) 52 { 53 target = transform.position + MOVEY; 54 SetAnimationParam(3); 55 return; 56 } 57 if (Input.GetKey(KeyCode.DownArrow)) 58 { 59 target = transform.position - MOVEY; 60 SetAnimationParam(0); 61 return; 62 } 63 } 64 65 void SetAnimationParam(int param) 66 { 67 animator.SetInteger("", param); 68 } 69 70 void Move() 71 { 72 transform.position = Vector3.MoveTowards(transform.position, target, step * Time.deltaTime); 73 }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

※動作未確認のため、解決できなかったらすいません。

まず、位置移動など物理演算に影響する内容は、FixedUpdate()内で行うのがベターです。

また、Rigidbody2Dの各関数を使うと、物理処理も考慮されます。
今回の場合、Rigidbody2D.MovePosition()が適任だと思います。

ソースコードは下記のようになります。

C#

1 Rigidbody2D rb2D; 2 3 void Start() 4 { 5 // …(中略) 6 7 rb2D = GetComponent<Rigidbody2D>(); 8 } 9 10 void FixedUpdate() 11 { 12 Move(); 13 } 14 15 void Move() 16 { 17 Vector3 vec = Vector3.MoveTowards(transform.position, target, step * Time.fixedDeltaTime); 18 rb2D.MovePosition((Vector2)vec); 19 }

投稿2019/04/03 09:54

fiveHundred

総合スコア9796

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Karna03

2019/04/03 11:08

ありがとうございます。 試してみましたところ、横移動に関してはガクガクすることはなくなったんですが操作不可能な状態に変わりありませんでした。縦移動に関しては少し軽減された程度で、やはり操作不能に陥ります。 https://gyazo.com/2b57df6a2cd9f6e7b17a32179055cbac
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問