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

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

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

RPG (Report Program Generator)とは、IBMの System i(AS/400)サーバ向けのプログラミング言語です。

C#

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

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

Unity

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

Q&A

解決済

1回答

762閲覧

【Unity】2DRPGの当たり判定を作成したいです。

Locu_______

総合スコア16

RPG

RPG (Report Program Generator)とは、IBMの System i(AS/400)サーバ向けのプログラミング言語です。

C#

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

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

Unity

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

0グッド

0クリップ

投稿2022/05/29 15:38

前提

Unityで2DRPGを作っています。
言語はC#です。

実現したいこと

4方向(上下左右)移動をして、斜め移動をしないで壁とかに当たり判定をつけてすり抜けないようにしたいです。

発生している問題・エラーメッセージ

現在、4方向移動は完成しているのですが、壁の当たり判定はがばがばで
キーを同時押ししたら斜め移動になって壁をすり抜けちゃうことや、壁に埋まってしまう問題が出ています。

言葉じゃ伝えにくいので動画を限定リンクで公開しました。
https://youtu.be/gVLVHgIYMpo

該当のソースコード

<Player>

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using InputKey; 5 6public class Player : MonoBehaviour 7{ 8 9 private GameObject player; //(操作)移動したいオブジェクトを設定 10 private float PlayerPosX, PlayerPosY, PlayerPosZ; 11 Vector3 movePosition, OldPlayerPos; //移動する距離を格納 12 public int speed = 3, HitJudgement = 3; //1マス毎に移動するスピード 13 public Vector3 moveY = new Vector3(0, 0.5f, 0); //(1マス毎の)Y軸の移動距離 14 public Vector3 moveX = new Vector3(0.5f, 0, 0); //(1マス毎の)X軸の移動距離 15 bool moveButtonJudge; //移動中の判定 16 17 Animator animator; 18 19 void Start() 20 { 21 player = GameObject.Find("主人公"); 22 moveButtonJudge = false; //⑤初期設定 23 this.animator = GetComponent<Animator>(); 24 } 25 26 void Update() 27 { 28 // //移動場所設定 29 ////キー入力を行うと、moveButtonJudge = true に変わり、一時的にキー入力を無効 30 //if (moveButtonJudge == false){ 31 // if (Input.GetKey("up")) 32 // { 33 // movePosition = player.transform.position + moveY; //movePositionに移動する距離を格納 34 // moveButtonJudge = true; //moveButtonJudge = trueにして、移動を制限する 35 // } 36 // else if (Input.GetKey("down")) 37 // { 38 // movePosition = player.transform.position + -moveY; 39 // moveButtonJudge = true; 40 // } 41 // else if (Input.GetKey("right")) 42 // { 43 // movePosition = player.transform.position + moveX; 44 // moveButtonJudge = true; 45 // } 46 // else if (Input.GetKey("left")) 47 // { 48 // movePosition = player.transform.position + -moveX; 49 // moveButtonJudge = true; 50 // } 51 //} 52 53 //player.transform.position = Vector3.MoveTowards(player.transform.position, movePosition, speed * Time.deltaTime); //移動開始(playerオブジェクトが, 目的地に移動, 移動速度) 54 55 // //指定した場所にオブジェクトが移動すると、再度移動が可能になる 56 //if (player.transform.position == movePosition) moveButtonJudge = false; 57 58 if(Input.GetKey(KeyCode.UpArrow)) 59 { 60 transform.position += transform.up * speed * Time.deltaTime; 61 } 62 else if(Input.GetKey(KeyCode.DownArrow)) 63 { 64 transform.position -= transform.up * speed * Time.deltaTime; 65 } 66 else if(Input.GetKey(KeyCode.RightArrow)) 67 { 68 transform.position += transform.right * speed * Time.deltaTime; 69 } 70 else if(Input.GetKey(KeyCode.LeftArrow)) 71 { 72 transform.position -= transform.right * speed * Time.deltaTime; 73 } 74 } 75 76 void OnTriggerStay2D(Collider2D other) 77 { 78 if(other.gameObject.CompareTag("Wall-All")) 79 { 80 if (Input.GetKey("up")) 81 { 82 transform.position -= transform.right * speed * Time.deltaTime; 83 } 84 else if (Input.GetKey("down")) 85 { 86 transform.position += transform.right * speed * Time.deltaTime; 87 } 88 else if (Input.GetKey("right")) 89 { 90 transform.position -= transform.right * speed * Time.deltaTime; 91 } 92 else if (Input.GetKey("left")) 93 { 94 transform.position += transform.right * speed * Time.deltaTime; 95 } 96 } 97 speed = 3; 98 } 99 100} 101

試したこと

deltaTimeをなくして、speedだけで移動させてみたり
別の方式で移動させてみたりしてみました。
コメントアウトしてるのが別の方式です。

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

Windows 11 Home
CPU Core i3-12100
Unity 2021,3,2f1

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

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

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

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

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

bboydaisuke

2022/05/29 21:53

コライダー(非トリガー)をアタッチし、Rigidbody2D コンポーネントがなければ追加して Rigidbody2D.velocity で移動すればすり抜けません。 transform.position の直接指定つまり瞬間移動の連続と、なぜかトリガーで当たり判定をしていますが、これではゲームエンジンを使う意味がないと思います。この辺りの処理をやってくれるからゲームエンジンを使うのであって、それを活用しないならゲームエンジンは使わない方がよいでしょう。
Locu_______

2022/05/30 14:25

回答ありがとうございます。 キャラ側にコライダー(非トリガー)・Rigidbody2D 壁にはコライダー(非トリガー)でいいのでしょうか? こうした場合OnTriggerStay2Dだった場合トリガー設定してないので出来ないのはわかっていますが、OnCollisionStay2Dでも当たり判定が作れませんでした。 ご教授お願い致します。
guest

回答1

0

自己解決

bboydaisuke様のおかげで解決出来ました。
キャラ側にはRigidbody2D・コライダー(非トリガー)
壁とかにはコライダー(非トリガー)をつけて、Rigidbody2Dの重力スケールを0にしたら出来ました。

投稿2022/05/30 14:30

Locu_______

総合スコア16

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問