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

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

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

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

Q&A

解決済

1回答

1242閲覧

Unityの2Dスクロールゲームの壁に対する当たり判定について

yuineko

総合スコア5

Unity

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

0グッド

0クリップ

投稿2020/03/04 08:09

Unityで横スクロールの2Dアクションゲームを作っています。
制作の際、解決できない問題が発生してしまったため、質問します。
2Drigidbodyと2Dboxcoliderを用いてプレイヤーキャラクターとステージに当たり判定を設けたのですが、プレイヤーがステージに上から接する(落ちる、歩くなど)場合は問題なく当たり判定が作用するのですが、横からステージにぶつかった場合にぬるっとステージ内に入り込みながらステージ上部分に上昇するような動作をしてしまうようになってしましました。ちゃんと壁にぶつかるようにするにはどうしたらいいでしょうか?

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

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

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

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

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

Y0241-N

2020/03/04 08:47

キャラクターの移動方はどのようにしていますか? キャラクターの移動スクリプトの提示をお願いします。 スクリプトが無い現状で憶測で語るなら、恐らくはTransformで移動しているのではないかなと思うのですが、壁にぶつかった際のめりこみはキャラクターがTransformによる直接の座標書き換えで壁の中にめり込んでしまい、コライダー同士の反発で上昇するような動きになっているかもしれません。
yuineko

2020/03/04 15:47

キャラクター移動のスクリプトはこちらになります。 (スクリプトより一部抜粋) // 現在位置をPositionに代入 Vector2 Position = transform.position; if (Input.GetKey("left") || Input.GetKey(KeyCode.A)) { // 左キーを押し続けていたら // 代入したPositionに対して加算減算を行う Position.x -= SPEED.x; } if (Input.GetKey("right") || Input.GetKey(KeyCode.D)) { // 右キーを押し続けていたら // 代入したPositionに対して加算減算を行う Position.x += SPEED.x; } // 現在の位置に加算減算を行ったPositionを代入する transform.position = Position; 解答者様がおっしゃっているとおり、transform.positionを利用した処理になっています。 この方法だと、壁の中にめり込んでしまう動きになってしまうということでしょうか?
Y0241-N

2020/03/04 23:56 編集

簡単に知ってしまえば、現在yuinekoさんが使っている移動方法は「ごく短いワープを連続して行い、あたかも平行移動している」状態です。座標を書き換えているので、例えば壁が移動途中にあっても、壁の中に入り込む可能性があります。 そのため、Rigidbodyが付いているのであれば2D、3Dともに基本的に移動は.veloctityという加速を用いて移動する方法が望ましいです。この辺は「Unity 2D 移動方法」で検索するといろいろ記事が出てきます。 今回は私のおすすめ記事を添付しておくので、参考にしてみてください。 https://dkrevel.com/makegame-beginner/make-2d-aciton-move
simapiko

2020/03/05 01:38

横から失礼します。 一応念のため補足ですが、Unity公式ではvelocty(速度)を直接操作することは非推奨になっています。https://docs.unity3d.com/ja/2018.4/ScriptReference/Rigidbody-velocity.html また、実装方法によりけりですがvelocityを基本的な移動手段にしてしまうと、Unityで補完してくれている物理演算が出来なくなりジャンプや壁に跳ね返る等の処理に少し工夫する必要が出てきます。 なので、Y0241-Nさんが貼って頂いた記事にも書いてありますが、基本的には物理的挙動をさせない場合に有用です。 ついでに、positionを使いたい場合は、昔からある方法ですが移動先が移動可能かどうか走査し可能であれば移動するみたいな感じで出来なくは無いです。 どの方法でも問題無いですが、後々の影響を考えてどれが適切か考えておくと苦労が減るかもしれません。
yuineko

2020/03/05 03:52

お二方とも丁寧なご説明ありがとうございます。 ゲームデザインに合わせてどの方法が良いか検討したいと思います。
Y0241-N

2020/03/05 04:13 編集

simapiko様、至らぬ箇所の補足をありがとうございます。勉強になりました。 veloctiyを変更するよりは、AddFroceで動かす方がよさそうですね。
guest

回答1

0

自己解決

質問の追記・修正欄を参照ください。

投稿2020/03/05 03:53

yuineko

総合スコア5

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問