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

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

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

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

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

Unity

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

Q&A

解決済

1回答

5770閲覧

Unity ブロック崩し ボールが跳ね返ってくれません。

yofi6617

総合スコア2

C#

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

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

Unity

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

0グッド

0クリップ

投稿2020/06/20 07:12

編集2020/06/20 16:11

前提・実現したいこと

Unity 1日目の超絶初心者です。
ブロック崩しを作っているのですが、
プレイヤー(板)にボールが当たっても跳ね返ってくれなくて困っています。

試したこと

プレイヤーを左右に移動させる上で、壁を突き抜けて移動出来てしまうのを防ぐために
プレイヤーが左右の壁に接触していたら、それ以上いけない、みたいなことを
やろうとプレイヤーにRigitBodyを追加したら跳ね返らなくなりました。
RigitBody無くせば跳ね返るのですが、下記コードみたいな感じで突き抜け防止
したかったので困ってます。

そもそもこんなやり方しないとか、こうすると楽みないな方法があれば
教えていただきたく、よろしくお願いいたします。

また、まだ設定1つ1つの意味を全然理解していないのでどこかいじる必要のある設定
があれば、意味についても教えていただけると助かります......

該当のソースコード

一応、以下が壁抜け防ぐために書いたコードです。

html

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class PlayerControl : MonoBehaviour 6{ 7 8 public float speed = 1.0f; 9 private bool moveFlag_left = true; 10 private bool moveFlag_right = true; 11 12 // Start is called before the first frame update 13 void Start() 14 { 15 16 } 17 18 // Update is called once per frame 19 void Update() 20 { 21 if (Input.GetKey(KeyCode.LeftArrow)) 22 { 23 if(this.moveFlag_left == true) 24 { 25 this.transform.position += Vector3.left * speed * Time.deltaTime; 26 } 27 } 28 else if (Input.GetKey(KeyCode.RightArrow)) 29 { 30 if(this.moveFlag_right == true) 31 { 32 this.transform.position += Vector3.right * speed * Time.deltaTime; 33 } 34 } 35 } 36 37 private void OnCollisionEnter(Collision collision) 38 { 39 if (collision.gameObject.CompareTag("Wall_Left")) 40 { 41 this.moveFlag_left = false; 42 } 43 else if (collision.gameObject.CompareTag("Wall_Right")) 44 { 45 this.moveFlag_right = false; 46 } 47 } 48 49 private void OnCollisionExit(Collision collision) 50 { 51 if (collision.gameObject.CompareTag("Wall_Left")) 52 { 53 this.moveFlag_left = true; 54 } 55 else if (collision.gameObject.CompareTag("Wall_Right")) 56 { 57 this.moveFlag_right = true; 58 } 59 } 60}

補足

<プレイヤーのRigitBodyの設定>
質量:1
抗力:0
角抗力:0
重力:なし
補間:なし
衝突判定:非連続的
位置、回転全部固定

<ボールのRigitVBody設定>
質量:1
抗力:0
角抗力:0
重力:あり
補間:なし
衝突判定:非連続的
位置:y固定
回転:全固定

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

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

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

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

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

guest

回答1

0

ベストアンサー

rigidbodyなしだと跳ね返るとのことなので、今回はColliderによる判定での制限ではなく、C#の機能で移動可能な位置に対して制限を設けます。

以下のようなスクリプトで制御可能です。

入力に関する処理はUpdate内で行い、移動に関する処理はFixedUpdateで行います。UpdateとFixedUpdateに処理内容を分けている理由ですが、簡単に言うとUpdateは「マシンの性能に依存する」FiexdUpdateは「マシンの性能に依存しない」ため、移動等の物理的な処理はFixedUpdate内で書くのが一般的です。この辺は勉強を進めていくうちにぶつかる問題だと思うので、今はまだ完全に理解する必要はありません。

あと余談ですが、当該のソースコードの拡張子がhtmlになっていますが、C#ですのでC#が正しい表記となります。

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class PlayerControl : MonoBehaviour 6{ 7 8 public float speed = 1.0f; 9 public float minPoss; 10 public float maxPoss; 11 private float MoveScale; 12 13 private bool MoveRight; 14 private bool MoveLeft; 15 16 void Update() 17 { 18 if (Input.GetKey(KeyCode.LeftArrow)) 19 { 20 MoveLeft = true; 21 MoveRight = false; 22 } 23 else if (Input.GetKey(KeyCode.RightArrow)) 24 { 25 MoveRight = true; 26 MoveLeft = false; 27 } 28 else 29 { 30 MoveScale = 0; 31 } 32 //Mathf.ClampでX座標の移動に対して制限をかけています。minPossが-方向の制限位置、maxPossが+方向の制限位置となっています。 33 this.transform.position = new Vector3(Mathf.Clamp(transform.position.x,minPoss,maxPoss),transform.position.y,transform.position.z); 34 } 35 36 void FixedUpdate() 37 { 38 if (MoveLeft) 39 { 40 MoveScale -= 0.1f; 41 this.transform.position += new Vector3(MoveScale * speed * Time.deltaTime,0,0); 42 } 43 else if (MoveRight) 44 { 45 MoveScale += 0.1f; 46 this.transform.position += new Vector3(MoveScale * speed * Time.deltaTime,0,0); 47 } 48 else 49 { 50 MoveScale = 0; 51 } 52 } 53}

投稿2020/06/24 02:05

編集2020/06/24 06:45
Y0241-N

総合スコア1066

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

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

YAmaGNZ

2020/06/24 06:40

コードを記す際の文言はそれが何の言語かを示すものであって、拡張子を示すものではないかと思います。 今回の場合は”C#”と記載すべきなのではないでしょうか?
Y0241-N

2020/06/24 06:45

ご指摘ありがとうございます。拡張子を入力するものと勘違いをしておりました。 訂正しておきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問