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

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

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

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

Q&A

解決済

1回答

1142閲覧

if文の中でOnTriggerStay2Dを使いたい

Bis1335

総合スコア3

C#

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

0グッド

0クリップ

投稿2022/10/31 06:14

編集2022/11/01 02:33

前提

2dのルーレットゲームをUnityで作っています

実現したいこと

上下に動いている的が
①エンターキーで停止
②的が画面中央にある点線の上で止まっていたらコンソールに”HIT!”と表示

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

エンターキーが入力されたかどうかというif文の中でvoidOnTriggerStay2Dを使おうとすると次のエラーメッセージが表示されます

Assets\Scenes\PlayerController.cs(34,17): warning CS8321: The local function 'OnTriggerStay2D' is declared but never used ### 該当のソースコード ```C♯ using System.Collections; using System.Collections.Generic; using UnityEngine; public class PlayerController: MonoBehaviour { public Rigidbody2D rigid2D; // Start is called before the first frame update void Start() { Application.targetFrameRate=60; this.rigid2D=GetComponent<Rigidbody2D>(); } // Update is called once per frame void Update() { if(Input.GetKeyDown(KeyCode.Space)) { this.rigid2D.velocity=new Vector2(0,5f); if(transform.position.x!=3) { this.rigid2D.velocity=new Vector2(0,-5f); } } if(Input.GetKeyDown(KeyCode.Return)) { this.rigid2D.velocity*=0; void OnTriggerStay2D(Collider2D other) { if(other.CompareTag("PointLine")) { Debug.Log("HIT!"); } } } } void OnTriggerEnter2D(Collider2D other) { if(other.CompareTag("Wall")) { this.rigid2D.velocity*=-1; } } }

試したこと

void OnTriggerEnter2Dの部分をif文の外に出してみましたが、そうすると意図した動きになりません
(本来はエンターキーで的を停止させた後だけに”HIT!”と表示させたいのに、void OnTriggerEnter2Dの部分をif文の外に出すと、的が動いていても点線を通り越すたびに”HIT!”と表示される)

補足情報

プロジェクトのエディターナンバーは 2021.3.11f1で、的のインスペクターは次の通りです
イメージ説明
イメージ説明

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

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

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

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

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

StellaSplitter

2022/10/31 07:38

①該当する問題部分を載せる際は、一部分だけではなくその**ファイル全体**を載せるようにしてください。 なぜかというと、今回のエラー(正確に言うと警告ですが)のこの部分 ``` Assets\Scenes\PlayerController.cs(34,17) ``` の(34,17)というのは問題が起きている行数と何文字目かを指しているため、ファイル全体で何行目かが「回答者に」わからないと原因究明の妨げになります。 それと同時に、直接的な問題がその部分ではない時があるため、やぱりファイル全体を記述して頂かなければ回答するのが難しいときがあります。 Unityであれば、同時にそのゲームオブジェクトのInspectorに表示されている情報も(できるなら画像で)提示してください。 (問題となっているオブジェクトのものです) ②「試したこと」と「補足情報(ツールのバージョンなど)」を書いてください。 何故か意図的に削除しているようですが、これらも回答者にとっては有益な情報です。 サイトを参考にしたのであれば、そのサイトのURLを貼ってください。 UnityであればUnityHubからプロジェクトを選択する際に「エディターバージョン」が書いてあるはずです。 これが必要な理由は、「バージョンによって動作が変わる可能性がある」からです。
guest

回答1

0

ベストアンサー

結論となるコードを先に書いておきます。
(改変した部分だけを記述しています)

csharp

1 // Update is called once per frame 2 void Update() 3 { 4 if (Input.GetKeyDown(KeyCode.Space)) 5 { 6 this.rigid2D.velocity = new Vector2(0, 5f); 7 8 if (transform.position.x != 3) 9 { 10 this.rigid2D.velocity = new Vector2(0, -5f); 11 } 12 } 13 14 if (Input.GetKeyDown(KeyCode.Return)) //Returnキーが押されたら 15 { 16 this.rigid2D.velocity *= 0; 17 18 if(_isHit) //現在ヒットしているなら 19 { 20 Debug.Log("HIT!"); 21 } 22 } 23 } 24 25 private bool _isHit = false; 26 27 void OnTriggerEnter2D(Collider2D other) 28 { 29 if (other.CompareTag("Wall")) 30 { 31 this.rigid2D.velocity *= -1; 32 } 33 34 if (other.CompareTag("PointLine")) //PointLineにヒットしているなら 35 { 36 _isHit = true; //ヒットしている状態をtrueにする 37 } 38 } 39 40 void OnTriggerExit2D(Collider2D other) 41 { 42 if (other.CompareTag("PointLine")) //PointLineから離れたなら 43 { 44 _isHit = false; //ヒットしている状態をfalseにする 45 } 46 }

説明します。
まず、OnTriggerStay2D()などのUnityが呼び出すメソッドは、クラス直下に書くという決まりになっています。
あなたの現在OnTriggerEnter2D()が書いてある場所がそうで、なぜそうしなければいけないかというと
そうしておかないとUnityが呼び出すべきメソッドがどこにあるかわからないからです。

「的がヒットしているかどうか」という情報と、Enterキーを押したという情報を同時に調べたい場合、2つの方法があります。

①的の上にあるかどうかをクラス内の変数に保存しておいて、Enterキーを押したときにその変数の中身を見る方法

例えばこんな変数(フィールド)をクラスに置いてあげて、

csharp

1 private bool _isHit = false;

的の上に乗り始めたらtrueを入れてあげて、的から離れたらfalseを入れてあげます。

csharp

1 void OnTriggerEnter2D(Collider2D other) 2 { 3 if (other.CompareTag("PointLine")) //PointLineにヒットしているなら 4 { 5 _isHit = true; //ヒットしている状態をtrueにする 6 } 7 } 8 9 void OnTriggerExit2D(Collider2D other) 10 { 11 if (other.CompareTag("PointLine")) //PointLineから離れたなら 12 { 13 _isHit = false; //ヒットしている状態をfalseにする 14 } 15 }

あとは_isHitにPointLineにヒットしているかどうかが入ってるので、

csharp

1 if (Input.GetKeyDown(KeyCode.Return)) //Returnキーが押されたとき 2 { 3 if(_isHit) //的の上に現在乗っているとき 4 { 5 Debug.Log("HIT!"); 6 } 7 }

あとはこれを貴方のコードに足してあげればいいだけです。
(回答の最初にあるコードになると思います)

OnTriggerStay2DではなくOnTriggerEnter2DとOnTriggerExit2Dにしているのは、
Stayだと「接触している間だけ呼び出される」ため、「離れた瞬間」がわからないからです。
(正確に言うと検知すること自体はできますが、あまり良くないコードになります)

②OnTriggerStay2Dでキー入力を取る方法

この方法はあまりおすすめしません。というのも、「Returnキーを押しているとき」というif文がUpdate()の中とOnTriggerStay2D()の中で2回登場するのでどこに何を書いているかわかりにくくなります。

csharp

1 void OnTriggerStay2D(Collider2D other) 2 { 3 if(Input.GetKeyDown(KeyCode.Return) && other.CompareTag("PointLine")) 4 { 5 Debug.Log("HIT!"); 6 } 7 }

以上になります。

投稿2022/11/01 09:26

編集2022/11/01 09:30
StellaSplitter

総合スコア37

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

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

Bis1335

2022/11/02 09:40 編集

説明通りにスクリプトを改変したところ、ちゃんと意図した動きになりました! OnTrigger~がif分の中では使えないため、bool型の変数をif分の条件に入れて、その変数についてvoid OnTrigger~の中で設定すればいいんですね! 非常に丁寧で分かりやすい説明、ありがとうございました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問