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

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

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

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

Unity

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

Q&A

1回答

770閲覧

ゴールに入った回数を画面に表示したい

kassi

総合スコア3

C#

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

Unity

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

0グッド

0クリップ

投稿2021/01/08 01:33

編集2021/01/10 16:10

ゴールに入った回数(Score)を画面に表示したいのです。
ゴールの判定とテキストの表示ができています。あとそのゴールに入った回数をテキストに加算していきたいです。
どうすればBallManagerで判定したものを、ScoreManagerで画面に表示させることができるのでしょうか?

スコアとテキストの管理はScoreManager

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.UI; 5 6public class ScoreManager : MonoBehaviour { 7 8 public GameObject text; 9 public int score = 0; 10 //public GameManager text; 11 12 // Use this for initialization 13 void Start () { 14 15 } 16 17 // Update is called once per frame 18 void Update () { 19 20 Text score_text = text.GetComponent<Text> (); 21 score_text.text = "Score:" + score ; 22 } 23}

ゴールの判定はBallManagerです。

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class BallManager : MonoBehaviour { 6 7 float Spacetime; 8 public GameObject ballPrefab; 9 public GameObject ball; 10 11 // Use this for initialization 12 void Start () { 13 14 } 15 16 // Update is called once per frame 17 void Update () { 18 shotBall (); 19 20 if(Input.GetKey(KeyCode.Space)){ 21 //Spacetimeに経過時間を記録 22 Spacetime += Time.deltaTime; 23 } 24 } 25 26 void shotBall() { 27 if (Input.GetKeyUp (KeyCode.Space)) { 28 Vector2 vel = Vector2.zero; 29 //vel.x = INIT_SPEED * Mathf.Cos (INIT_DEGREE * Mathf.PI / 180f); 30 vel.y = 32 * Spacetime ; 31 ball.GetComponent<Rigidbody2D> ().velocity = vel; 32 } 33 } 34 void OnTriggerEnter2D (Collider2D other) { 35 if (other.gameObject.tag == "ClearArea") { 36 Debug.Log ("aiueo"); 37 } 38 } 39} 40

現在詰まっているのが、プレハブのボールにあるBallManagerのscoreManagerの欄にScoreTextを追加できません。

イメージ説明

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

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

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

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

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

guest

回答1

0

方針

ScoreManagerに処理を作っておいて、ゴールに入ったときにBallManagerからその処理を実行ましょう。

コード

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.UI; 5 6public class ScoreManager : MonoBehaviour { 7 8 // 変数の型をTextに、名前をscore_textに変更。 9 // インスペクタから直接Text型を指定できる。 10 public Text score_text; 11 public int score = 0; 12 //public GameManager text; 13 14 // Use this for initialization 15 void Start () { 16 // もしGetComponentするならここ 17 } 18 19 // Update is called once per frame 20 void Update () { 21 // GetComponentは負荷が比較的高いのでUpdate()で行うべきではありません。 22 // GetComponentするならStart()で一度だけでいいです。 23 // それと、score_textは変数で設けたのでGetComponentの必要もありません。 24 // Text score_text = text.GetComponent<Text> (); 25 26 // スコアが加算されたときにテキスト表示も"一度だけ"更新すればいいので、これも同じくUpdate()でなくていい。 27 // score_text.text = "Score:" + score ; 28 } 29 30 // 関数の引数を使っています。 31 // もし見慣れない場合は「unity 関数 引数」で検索してみてください。 32 public void AddScore (int val) { 33 // scoreにval分を加算 34 Debug.Log("score加算"); 35 score += val; 36 37 // スコア加算と同時にUpdateScoreText()を実行してテキスト表示を更新する。 38 UpdateScoreText(); 39 } 40 41 private void UpdateScoreText () { 42 if (score_text == null) { 43 Debug.LogError("スコア用のテキストをセットしてください!"); 44 } else { 45 Debug.Log("テキスト更新"); 46 score_text.text = "Score:" + score; 47 } 48 } 49}

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class BallManager : MonoBehaviour { 6 7 float Spacetime; 8 public GameObject ballPrefab; 9 public GameObject ball; 10 11 // ScoreManagerを変数に追加。 12 // インスペクタから設定してください 13 [SerializeField] private ScoreManager scoreManager; 14 15 // Use this for initialization 16 void Start () { 17 18 } 19 20 // Update is called once per frame 21 void Update () { 22 shotBall (); 23 24 if(Input.GetKey(KeyCode.Space)){ 25 //Spacetimeに経過時間を記録 26 Spacetime += Time.deltaTime; 27 } 28 } 29 30 void shotBall() { 31 if (Input.GetKeyUp (KeyCode.Space)) { 32 Vector2 vel = Vector2.zero; 33 //vel.x = INIT_SPEED * Mathf.Cos (INIT_DEGREE * Mathf.PI / 180f); 34 vel.y = 32 * Spacetime ; 35 ball.GetComponent<Rigidbody2D> ().velocity = vel; 36 } 37 } 38 void OnTriggerEnter2D (Collider2D other) { 39 if (other.gameObject.tag == "ClearArea") { 40 // Debug.Log ("aiueo"); 41 42 if (scoreManager == null) { 43 Debug.LogError("scoreManagerをセットしてください!"); 44 } else { 45 // ScoreManagerのAddScore()を実行 46 scoreManager.AddScore(1); // 1点加算 47 // ↑ ちなみにマイナスを入れるとスコアを減算できます。 48 } 49 } 50 } 51}

補足

処理が走れば、何かしらログが出るようにしました。
もし「あれ、動かない…」なんてことがあればConsoleの確認と、自分のコーディングミス(OnTriggerEnter2D()が呼ばれていないなど)を疑ってみてください。

投稿2021/01/08 03:15

編集2021/01/08 03:21
PinoMatcha

総合スコア368

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

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

kassi

2021/01/09 13:03

アンサーありがとうございます。 1つ問題がありました。 scoreManagerをセットをセットすることができませんでした。 なぜ選択することができないのでしょうか?
PinoMatcha

2021/01/09 13:24

選択する対象のオブジェクトにScoreManagerスクリプトがアタッチされている必要があります。 アタッチされていますか?
kassi

2021/01/10 16:11

すみません追記にミスがありました。プレハブのボールにあるBallManagerのscoreManagerの欄にScoreTextが追加できません。 詳細は追加しました画像を参考にして頂けますと幸いです。
PinoMatcha

2021/01/10 16:18

scoreManagerには、ScoreManagerスクリプトが付いているオブジェクトを指定してください。 ScoreTextは、ScoreManagerのscore_textへセットをお願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問