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

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

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

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

Q&A

解決済

2回答

1655閲覧

【Unity】複数の衝突判定オブジェクトがどの順番で衝突されたか判別させたい

tyomo_ng

総合スコア1

Unity

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

0グッド

0クリップ

投稿2020/08/27 13:54

前提・実現したいこと

前提:Unityを触り始めて2週間ちょっとの初心者です。
Unityの2Dを使い、8個の穴に上からボールを3回落として点数を表示するゲームを製作途中です。
それぞれの穴に、ボールと衝突したときに起動する衝突判定用オブジェクトをIs trigger状態で設置し、ScoreGeneratorスクリプトをアタッチしました。
実現したいこと:それぞれの穴にボールが入ると決められた点数(1~8)が貰え、1回目、2回目、3回目にボールが落ちた穴に割り振られているそれぞれの点数と3回の合計点数をゲーム上に表示することです。

発生している問題

 現在のScoreGeneratorスクリプトでは、1回目から3回目まで全て同じ穴に落ちた時はちゃんど動くのですが、同じ穴に2回連続でボールが落ちた後、3回目で違う穴にボールが落ちた際、3回目の処理をするのではなくまた1回目の処理がされてしまいます。 そこでどのようにすれば1~3回目の間で違う穴に落ちた時に全て同じ穴にボールが落ちた時と同じ処理がされるのか教えて頂きたいです。  またそれぞれの穴にボールが落ちた際、1~8の点数をソースコードの「〇」の部分に表示させたいのですがどうすれば実装できるのかわかりません。

該当のソースコード

C♯

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.UI; 5 6public class ScoreGenerator : MonoBehaviour 7{ 8 float number = 1f;//衝突回数を判定する変数 9 public GameObject score_object1 = null;//1回目の点数を表示するTextオブジェクト 10 public GameObject score_object2 = null;//2回目の点数を表示するTextオブジェクト 11 public GameObject score_object3 = null;//3回目の点数を表示するTextオブジェクト 12 13 void OnTriggerEnter2D(Collider2D col) //このスクリプトをアタッチしている空のオブジェクトとボールとの衝突を検知するもの(ボールにはPlayerとタグ付け済み) 14 { 15 //衝突してきた物体がPlayerとタグ付けされているかつnumberが1(1回目の衝突)の時 16 if ((col.gameObject.tag == "Player") && (number == 1f)) 17 { 18 // オブジェクトからTextコンポーネントを取得 19 Text score_text1 = score_object1.GetComponent<Text>(); 20 // テキストの表示を入れ替える 21 score_text1.text = "1回目〇点"; // $〇の部分にそれぞれの衝突判定用オブジェクトに割り振った点数を表示させたいです$ 22 number++; //numberを1増やして2回目の衝突時の条件に移行させる 23 } 24 else if ((col.gameObject.tag == "Player") && (number == 2f))//24行目と同じ処理(2回目の衝突) 25 { 26 Text score_text2 = score_object2.GetComponent<Text>(); 27 score_text2.text = "2回目〇〇点"; // $〇〇の部分にそれぞれの衝突判定用オブジェクトに割り振った点数を表示させたいです$ 28 number++; //numberを1増やして3回目の衝突時の条件に移行させる 29 } 30 else if ((col.gameObject.tag == "Player") && (number == 3f)) //24行目と同じ処理(3回目の衝突) 31 { 32 Text score_text3 = score_object3.GetComponent<Text>(); 33 score_text3.text = "3回目〇〇点";  // $〇〇〇の部分にそれぞれの衝突判定用オブジェクトに割り振った点数を表示させたいです$ 34 } 35 //21,27,33行目のプログラム記述方法がわかりません。 36 } 37}

試したこと

他の方法は全く思いつきませんでした。

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

バージョン:2019.4.7.f1*

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

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

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

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

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

YT0014

2020/08/28 02:20

"ボールと衝突したときに起動する衝突判定用オブジェクトをIs trigger状態で設置"の部分のソースをご提示ください。 全ての衝突判定用オブジェクトに、同一インスタンスを割り当てていませんか?
tyomo_ng

2020/08/28 04:33

返信ありがとうございます。大変申し訳ないのですが質問後に大幅にソースコードを見直した結果、自己解決することが出来てしまいました。おっしゃる通りその時は同一インスタンスを割り当てていました。
guest

回答2

0

ソースコードを大幅に見直して以下のように修正した結果、理想的な動きをしてくれるようになりました。

C♯

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.UI; 5 6public class ScoreGene1 : MonoBehaviour//このスクリプトにアタッチした衝突判定用オブジェクトとボールが衝突すると1点が貰えるプログラム(似たようなプログラムを8個それぞれ作り8個の衝突判定用オブジェクトにアタッチする。) 7{ 8 float Hitnumber; 9 int score_1 = 1; 10 float Burnnumber = 3f;//衝突回数を判定する変数 11 GameObject Scoreobject; //変数宣言 12 PlusScore script;//変数宣言 13 14 15 void Start() 16 { 17 Scoreobject = GameObject.Find("PlusScore"); //Scoreというゲームオブジェクトを見つけてballobjectへ格納 18 script = Scoreobject.GetComponent<PlusScore>(); 19 } 20 21 // Update is called once per frame 22 public void Update() 23 { 24 25 Hitnumber = script.Burnnumber; //新しく変数を宣言してその中にPlusScoreの変数Burnnumberを代入する 26 } 27 void OnTriggerEnter2D(Collider2D col) //このスクリプトをアタッチしている空のオブジェクトとボールとの衝突を検知するもの(ボールにはPlayerとタグ付け済み) 28 { 29 30 31 //衝突してきた物体がPlayerとタグ付けされているかつnumberが1(1回目の衝突)の時 32 if ((col.gameObject.tag == "Player") &&(Hitnumber == 3f)) 33 { 34 Scoreobject.GetComponent<PlusScore>().PlusScore1(score_1); 35 36 } 37 else if ((col.gameObject.tag == "Player") && (Hitnumber == 2f))//同じ処理(2回目の衝突) 38 { 39 Scoreobject.GetComponent<PlusScore>().PlusScore2(score_1); 40 41 } 42 else if ((col.gameObject.tag == "Player") && (Hitnumber == 1f)) //同じ処理(3回目の衝突) 43 { 44 Scoreobject.GetComponent<PlusScore>().PlusScore3(score_1); 45 } 46 47 } 48}

C♯

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.UI; 5 6public class PlusScore : MonoBehaviour//空のオブジェクトにこのソースコードをアタッチして計算を行うプログラム。 それぞれのscore_Objectに違うTextを挿入しました。 7{ 8 public float Burnnumber = 3f;//残りの衝突検知可能回数を判定する変数 9 public GameObject score_Object1 = null;//1回目の点数を表示するTextオブジェクト 10 public GameObject score_Object2 = null;//2回目の点数を表示するTextオブジェクト 11 public GameObject score_Object3 = null;//3回目の点数を表示するTextオブジェクト 12 13 // Start is called before the first frame update 14 void Start() 15 { 16 17 } 18 19 // Update is called once per frame 20 void Update() 21 { 22 23 } 24 public void PlusScore1(int firstNumber)//1度目の衝突 25 { 26 Text score_text1 = score_Object1.GetComponent<Text>(); 27 // テキストの表示を入れ替える 28 score_text1.text = "1回目"+firstNumber+"点"; // それぞれの衝突判定用オブジェクトに割り振った点数を表示 29 Burnnumber--; //1減らして2回目の衝突時の条件に移行させる 30 } 31 public void PlusScore2(int secondNumber)//2度目の衝突 32 { 33 Text score_text1 = score_Object2.GetComponent<Text>(); 34 // テキストの表示を入れ替える 35 score_text1.text = "2回目" + secondNumber + "点"; // それぞれの衝突判定用オブジェクトに割り振った点数を表示 36 Burnnumber--; //1減らして3回目の衝突時の条件に移行させる 37 } 38 public void PlusScore3(int thirdNumber)//3度目の衝突 39 { 40 Text score_text1 = score_Object3.GetComponent<Text>(); 41 // テキストの表示を入れ替える 42 score_text1.text = "3回目" + thirdNumber + "点"; // $それぞれの衝突判定用オブジェクトに割り振った点数を表示 43 Burnnumber--; //1減らして衝突時の条件を受け付けない 44 } 45}

投稿2020/08/28 04:42

tyomo_ng

総合スコア1

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

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

0

自己解決

ソースコードを大幅に見直して以下のように修正した結果、理想的な動きをしてくれるようになりました。

C♯

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.UI; 5 6public class ScoreGene1 : MonoBehaviour//このスクリプトにアタッチした衝突判定用オブジェクトとボールが衝突すると1点が貰えるプログラム(似たようなプログラムを8個それぞれ作り8個の衝突判定用オブジェクトにアタッチする。) 7{ 8 float Hitnumber; 9 int score_1 = 1; 10 float Burnnumber = 3f;//衝突回数を判定する変数 11 GameObject Scoreobject; //変数宣言 12 PlusScore script;//変数宣言 13 14 15 void Start() 16 { 17 Scoreobject = GameObject.Find("PlusScore"); //Scoreというゲームオブジェクトを見つけてballobjectへ格納 18 script = Scoreobject.GetComponent<PlusScore>(); 19 } 20 21 // Update is called once per frame 22 public void Update() 23 { 24 25 Hitnumber = script.Burnnumber; //新しく変数を宣言してその中にPlusScoreの変数Burnnumberを代入する 26 } 27 void OnTriggerEnter2D(Collider2D col) //このスクリプトをアタッチしている空のオブジェクトとボールとの衝突を検知するもの(ボールにはPlayerとタグ付け済み) 28 { 29 30 31 //衝突してきた物体がPlayerとタグ付けされているかつnumberが1(1回目の衝突)の時 32 if ((col.gameObject.tag == "Player") &&(Hitnumber == 3f)) 33 { 34 Scoreobject.GetComponent<PlusScore>().PlusScore1(score_1); 35 36 } 37 else if ((col.gameObject.tag == "Player") && (Hitnumber == 2f))//同じ処理(2回目の衝突) 38 { 39 Scoreobject.GetComponent<PlusScore>().PlusScore2(score_1); 40 41 } 42 else if ((col.gameObject.tag == "Player") && (Hitnumber == 1f)) //同じ処理(3回目の衝突) 43 { 44 Scoreobject.GetComponent<PlusScore>().PlusScore3(score_1); 45 } 46 47 } 48}

C♯

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.UI; 5 6public class PlusScore : MonoBehaviour//空のオブジェクトにこのソースコードをアタッチして計算を行うプログラム。 それぞれのscore_Objectに違うTextを挿入しました。 7{ 8 public float Burnnumber = 3f;//残りの衝突検知可能回数を判定する変数 9 public GameObject score_Object1 = null;//1回目の点数を表示するTextオブジェクト 10 public GameObject score_Object2 = null;//2回目の点数を表示するTextオブジェクト 11 public GameObject score_Object3 = null;//3回目の点数を表示するTextオブジェクト 12 13 // Start is called before the first frame update 14 void Start() 15 { 16 17 } 18 19 // Update is called once per frame 20 void Update() 21 { 22 23 } 24 public void PlusScore1(int firstNumber)//1度目の衝突 25 { 26 Text score_text1 = score_Object1.GetComponent<Text>(); 27 // テキストの表示を入れ替える 28 score_text1.text = "1回目"+firstNumber+"点"; // それぞれの衝突判定用オブジェクトに割り振った点数を表示 29 Burnnumber--; //1減らして2回目の衝突時の条件に移行させる 30 } 31 public void PlusScore2(int secondNumber)//2度目の衝突 32 { 33 Text score_text1 = score_Object2.GetComponent<Text>(); 34 // テキストの表示を入れ替える 35 score_text1.text = "2回目" + secondNumber + "点"; // それぞれの衝突判定用オブジェクトに割り振った点数を表示 36 Burnnumber--; //1減らして3回目の衝突時の条件に移行させる 37 } 38 public void PlusScore3(int thirdNumber)//3度目の衝突 39 { 40 Text score_text1 = score_Object3.GetComponent<Text>(); 41 // テキストの表示を入れ替える 42 score_text1.text = "3回目" + thirdNumber + "点"; // $それぞれの衝突判定用オブジェクトに割り振った点数を表示 43 Burnnumber--; //1減らして衝突時の条件を受け付けない 44 } 45}

投稿2020/08/28 04:36

tyomo_ng

総合スコア1

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問