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

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

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

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

Q&A

解決済

1回答

6437閲覧

Unity 壁貫通を防ぎたい

kenN

総合スコア1

Unity

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

0グッド

0クリップ

投稿2022/02/27 09:13

編集2022/02/27 10:29

Unity初心者です。
とあるQiitaの記事を見ながらブロック崩しを作っているのですが、
自分の動かすブロック(以後プレイヤー)が壁を貫通してしまいます。
(その記事では壁貫通について触れていません)
ご質問がありましたので、以下参考にしている記事です。
https://qiita.com/nmxi/items/7950fb12ef925efa276d

発生している問題

プレイヤーが壁を貫通してしまうのが気になり、プレイヤーのCollision Detectionの設定を変更し
一時は壁貫通を防げるようになりました。
しかし、プレイヤーの移動スピードを上げると壁を貫通するようになり
どうすれば壁貫通を防げるのかが分かりません。
(この場合設定をいじるのはプレイヤー側ではなくて壁の方が正しい?)

プレイヤーの移動は左右キーで行っています。
以下プレイヤーに使っているコードです。

using System.Collections; using System.Collections.Generic; using UnityEngine; public class Controller : MonoBehaviour { // Start is called before the first frame update void Start() { } // Update is called once per frame void Update() { if(Input.GetKey(KeyCode.LeftArrow)) { transform.position += transform.forward * 0.2f; }else if (Input.GetKey(KeyCode.RightArrow)) { transform.position -= transform.forward * 0.2f; } } }

試したこと

Collision Detection の設定をすべて試しましたがダメでした。
もしCollision Detection 以外で壁貫通を防げるものがあれば合わせて教えて欲しいです。

補足情報(+で気になること)

プレイヤーにRigidbodyの設定をつけると、壁貫通は防げますが
ボールに接触するとプレイヤーが跳ね返されてしまいます。
跳ね返りをConstraintsで防ぐと、今度は壁貫通してしまうようになります。。。
今はプレイヤーを重くして一時的に跳ね返りを防いでいますが、これの正しい対処法もわかりません。


初歩的な質問で申し訳ないですが、
ご教授いただけると幸いです。

よろしくお願いいたします。

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

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

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

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

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

fiveHundred

2022/02/27 09:18

現状のコードを記載してください。 移動を行っているコード次第で変わってくるので。
bboydaisuke

2022/02/27 10:22 編集

> とあるQiitaの記事を見ながらブロック崩しを作っている Update() で transform.position を直接いじって「ブロック崩し」を作るというのは相当考えにくいです。他の設定も全て知りたいので出典を明示してください。
guest

回答1

0

ベストアンサー

以下のように「Rigidbody で動かす」ようにすれば簡単には壁抜けはしません。transform.position を直接操作するのは「瞬間移動を繰り返す」ため、速く運動すると壁が薄いほど簡単に抜けます。
Start() 内で設定を変えてますが、これは事前に Inspector から設定してもちろん構いません。また、Controller の Speed, Rigidbody の Mass, Collision Detection は適宜設定を変えてください。

csharp

1using UnityEngine; 2 3[RequireComponent(typeof(Rigidbody))] 4public class Controller : MonoBehaviour 5{ 6 [SerializeField] float _speed = 10f; 7 Rigidbody _rb = default; 8 9 void Start() 10 { 11 _rb = GetComponent<Rigidbody>(); 12 _rb.useGravity = false; 13 RigidbodyConstraints constraints = 14 RigidbodyConstraints.FreezeRotation 15 | RigidbodyConstraints.FreezePositionX 16 | RigidbodyConstraints.FreezePositionY; 17 _rb.constraints = constraints; 18 } 19 20 void Update() 21 { 22 float h = Input.GetAxisRaw("Horizontal"); 23 _rb.velocity = -1 * h * this.transform.forward * _speed; 24 } 25}

投稿2022/02/27 11:19

bboydaisuke

総合スコア5339

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

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

bboydaisuke

2022/02/27 11:45

蛇足なのでコメントで残します。 質問の元記事冒頭に動画がありますが、その動画をよく見ると左側に壁をすり抜けてる瞬間があります。
kenN

2022/02/27 12:50

詳しく解説いただきありがとうございます!! 記述いただいたコードで試してみたら壁貫通しなくなりました! すみません、追加で分かれば教えていただきたいのですが、 上記コード実装後に動かすと今度はボールがうまく跳ね返ってくれなくなりました。 (正確にはプレイヤーにボールが当たるとボールが真横に動く) 質問ばかりで申し訳ございませんが、ご教授いただけますと幸いです。。。 追記コメントについてですが、、、 この参考記事では壁貫通させたまま完成としていましたが、 自分が気になったので変更しようと思い試している最中でした。
bboydaisuke

2022/02/27 12:55

別件は別に質問してください。その時には、ボールが自分の意図と違うようにわかりやすく跳ねている gif 動画をつければ、回答がつくと思います。
kenN

2022/02/28 15:45

承知しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問