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

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

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

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

2896閲覧

Unity2Dで障害物を作りたいがすり抜けてしまう

yrema

総合スコア286

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

2クリップ

投稿2018/04/27 06:18

編集2018/04/27 06:19

カーソルでキャラクターを移動させ、壁ブロックにぶつかったらOnTriggerEnter2DとOnTriggerStay2Dで接触フラグを立てて、ぶつかったら座標を戻して移動制限をしているのですが、すり抜けてしまいます。(正確にはカクカクしてゆっくりすり抜けていきます。[下の画像参照])
イメージ説明

そもそも障害判定がこの方針でいいのか疑問に思ってきたので質問してみました。
コライダーの設定と判定コードは以下のとおりです。
イメージ説明

イメージ説明

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class arrow : MonoBehaviour { 6 7 private float PLAYER_SPEED = 50; 8 private Vector3 mLatestPosition; 9 private bool mCollided = false; 10 11 void Start () { 12 13 } 14 15 void Update () { 16 // カーソルによって移動 17 traslateByInput(); 18 } 19 20 void OnTriggerEnter2D(Collider2D col) { 21 Log.d("Enter", this.gameObject.transform.position); 22 mCollided = true; 23 } 24 void OnTriggerStay2D(Collider2D col) { 25 Log.d("Stay", this.gameObject.transform.position); 26 mCollided = true; 27 } 28 void OnTriggerExit2D(Collider2D col) { 29 Log.d("Exit", this.gameObject.transform.position); 30 mCollided = false; 31 } 32 33 void traslateByInput() { 34 float directionHorizontal = Input.GetAxisRaw ("Horizontal"); 35 float directionVertical = Input.GetAxisRaw ("Vertical"); 36 37 if (directionHorizontal != 0 || directionVertical != 0) { 38 Log.d("mCollided", mCollided); 39 if (mCollided) { 40 mCollided = false; 41 this.gameObject.transform.position = mLatestPosition; 42 } else { 43 float dx = directionHorizontal * PLAYER_SPEED * Time.deltaTime; 44 float dy = directionVertical * PLAYER_SPEED * Time.deltaTime; 45 this.gameObject.transform.Translate (dx, dy, 0); 46 mLatestPosition = this.gameObject.transform.position; 47 } 48 } 49 } 50} 51

▼環境
Unity2017 3.1f1

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

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

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

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

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

guest

回答1

0

ベストアンサー

Wallオブジェクト

こちらは問題はありません。
強いて言うならWallが動かないオブジェクトであれば右上の static にチェックを入れることで精度と処理速度が向上します

Arrowオブジェクト

  1. Rigidbody2DConstraintsFreeze Rotation以外のチェックは全て外してくださいFreeze Positionにチェックが入っていると衝突判定があっても

抜け出そうとしなくなるためめり込んでしまいます

  1. 移動処理はtransform.Translateではなくrigidbody2d.velocityを用いて移動させてください。transformでも移動できないことは無いですがテレポート的な移動になり壁にぶつかった際に一瞬めり込みガクガクしてしまうためです

上記修正すればめり込まず、またガクガクもしないと思います

投稿2018/04/27 06:28

編集2018/04/27 06:30
MMashiro

総合スコア2378

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

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

yrema

2018/04/27 07:02

できました!感動しました!ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問