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

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

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

Q&A

解決済

1回答

724閲覧

【unity2D】当たり判定付きタイルマップとオブジェクトが接触すると予期しない振動が起こる

maggot78

総合スコア2

0グッド

0クリップ

投稿2023/05/17 11:18

前提

2DのRPGのマップ画面を作ろうとしています。
1つのシーン上に、Tilemap collider2Dで当たり判定を付けた壁用タイルマップと、Box collider2Dで当たり判定を付けたゲームオブジェクト(画像をもとにしたスプライト)があります。
オブジェクトには「矢印キーの入力に応じて画面上を移動する機能」を記述したスクリプトがアタッチしてあります。
画面上のゲームオブジェクトを矢印キーで動かし、壁にぶつかったらちゃんと停止するかどうかを確認しています。

事象

当たり判定そのものはきちんと働いており、壁を貫通したりすることはありませんでした。
しかし壁にぶつかった後も矢印キーを押しっぱなしにしていると(例えば右向きに進んだ結果壁にぶつかったなら、そのまま右矢印を押しっぱなしにしていると)オブジェクトがぶるぶると震えだし、見た目的におかしい挙動をはじめます。
インスペクター上では実際にtransformのposition値が±0.1程度のスパンで小刻みに増減しているのが確認できました。
この振動を起こさないようにする方法はありますでしょうか?

移動する機能のソースコード

void Update() { float horizontalKey = Input.GetAxis("Horizontal"); float verticalKey = Input.GetAxis("Vertical"); Vector2 position = transform.position; float speed = 0.01f; if (horizontalKey < 0) { position.x -= speed; } if(horizontalKey > 0) { position.x += speed; } if (verticalKey < 0) { position.y -= speed; } if (verticalKey > 0) { position.y += speed; } transform.position = position; }

Collider等の設定

タイルマップ側のTilemap collider2D

  • 「複合で使用」にチェック

タイルマップ側のRiditBody2D

  • ボディタイプ……キネマティック
  • 衝突判定……連続的
  • Constriants……x,y,z固定

オブジェクト側のRiditBody2D

  • ボディタイプ……Dynamic
  • 衝突判定……連続的
  • Constriants……z固定
  • 重力スケール……0

他は初期値のままかと思いますが、気になるところがあればお答えさせていただきます。

試したこと

衝突判定の連続的・非連続的の切り替え
ボディタイプの切り替え

補足情報(FW/ツールのバージョンなど)

unity2021.3.24

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

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

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

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

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

guest

回答1

0

自己解決

別のサイトでも調べてみたところ、スプライトのtransform.positionを動かすのではなく、Rigidbody2Dコンポーネントを直接動かさないと計算が正確に行われないとのことでした。

unity

1public class CharaAnimationController : MonoBehaviour 2{ 3 4 private Animator anim = null; 5 public float speed; 6 private bool isMoving; 7 private Rigidbody2D body; 8 9 // Start is called before the first frame update 10 void Start() 11 { 12 body = GetComponent<Rigidbody2D>(); 13 anim = GetComponent<Animator>(); 14 } 15 16 17 // Update is called once per frame 18 void Update() 19 { 20 float horizontalKey = Input.GetAxis("Horizontal"); 21 float verticalKey = Input.GetAxis("Vertical"); 22 Vector2 moveVector = new Vector2(horizontalKey, verticalKey); 23 24 isMoving = (horizontalKey != 0 || verticalKey != 0); 25 26 if (isMoving) 27 { 28 body.MovePosition(new Vector2(transform.position.x + moveVector.x * speed * Time.deltaTime, 29 transform.position.y + moveVector.y * speed * Time.deltaTime)); 30 } 31 32 anim.SetBool("walk", isMoving); 33 } 34}

このようにすると壁での振動はなくなりました。
ただ動きの慣性が気になるので、28~29行目あたりをもう少し弄っていきます。

投稿2023/05/18 09:12

maggot78

総合スコア2

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問