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

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

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

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

Q&A

解決済

2回答

1446閲覧

敵を撃った時のスコア加算の方法について

kogarashi0917

総合スコア12

C#

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

0グッド

0クリップ

投稿2021/06/28 07:50

Unityの2Dアクションゲームにて、無限湧きの敵を撃つごとにスコア加算をしていきたいが、Prefabどうしだとスクリプトの参照ができず思い通りの挙動が確認できません。
PrefabどうしのOnTriggerEnter2D内でScoreスクリプトを参照するにはどうすればよいですか?

c#

1Score.cs 2 3using System.Collections; 4using System.Collections.Generic; 5using UnityEngine; 6using UnityEngine.UI; 7using UnityEngine.SceneManagement; 8 9public class Score : MonoBehaviour 10{ 11 /* public変数 */ 12 public static int scoreA, scoreB, scoreC; 13 14 /* private変数 */ 15 Text scoreTextA, scoreTextB, scoreTextC; 16 17 void Awake() 18 { 19 if (SceneManager.GetActiveScene().name == "Main" && SceneManager.GetActiveScene().name != "Main2" && SceneManager.GetActiveScene().name != "Main3") 20 { 21 scoreA = 0; 22 scoreTextA = GetComponent<Text>(); 23 } 24 25 else if (SceneManager.GetActiveScene().name != "Main" && SceneManager.GetActiveScene().name == "Main2" && SceneManager.GetActiveScene().name != "Main3") 26 { 27 scoreB = 0; 28 scoreTextB = GetComponent<Text>(); 29 } 30 31 else if (SceneManager.GetActiveScene().name != "Main" && SceneManager.GetActiveScene().name != "Main2" && SceneManager.GetActiveScene().name == "Main3") 32 { 33 scoreC = 0; 34 scoreTextC = GetComponent<Text>(); 35 } 36 } 37 38 void Update() 39 { 40 if (SceneManager.GetActiveScene().name == "Main" && SceneManager.GetActiveScene().name != "Main2" && SceneManager.GetActiveScene().name != "Main3") 41 { 42 scoreTextA.text = $"Score : { scoreA.ToString("0000") }"; //「score : ~~」表記 43 } 44 45 else if (SceneManager.GetActiveScene().name != "Main" && SceneManager.GetActiveScene().name == "Main2" && SceneManager.GetActiveScene().name != "Main3") 46 { 47 scoreTextB.text = $"Score : { scoreB.ToString("0000") }"; //「score : ~~」表記 48 } 49 50 else if (SceneManager.GetActiveScene().name != "Main" && SceneManager.GetActiveScene().name != "Main2" && SceneManager.GetActiveScene().name == "Main3") 51 { 52 scoreTextC.text = $"Score : { scoreC.ToString("0000") }"; //「score : ~~」表記 53 } 54 } 55 56 public static int GetScoreA() 57 { 58 return scoreA; 59 } 60 61 public static int GetScoreB() 62 { 63 return scoreB; 64 } 65 66 public static int GetScoreC() 67 { 68 return scoreC; 69 } 70 71 public void ScorePlus() 72 { 73 if (SceneManager.GetActiveScene().name == "Main" && SceneManager.GetActiveScene().name != "Main2" && SceneManager.GetActiveScene().name != "Main3") 74 { 75 scoreA += 100; 76 } 77 78 else if (SceneManager.GetActiveScene().name != "Main" && SceneManager.GetActiveScene().name == "Main2" && SceneManager.GetActiveScene().name != "Main3") 79 { 80 scoreB += 120; 81 } 82 83 else if (SceneManager.GetActiveScene().name != "Main" && SceneManager.GetActiveScene().name != "Main2" && SceneManager.GetActiveScene().name == "Main3") 84 { 85 scoreC += 150; 86 } 87 } 88}

c#

1EnemyMove.cs 2 3using System.Collections; 4using System.Collections.Generic; 5using UnityEngine; 6 7public class EnemyMove : MonoBehaviour 8{ 9 /* public変数 */ 10 [Header("移動速度")] public float speed; 11 [Header("周期")] public float thetaScale; 12 [Header("高低差")] public float sinScale; 13 public Score score; 14 15 /* private変数 */ 16 Vector3 pos; 17 float theta; 18 19 void Start() 20 { 21 score = GameObject.Find 22 23 pos = transform.position; 24 } 25 26 void FixedUpdate() 27 { 28 pos = transform.position; 29 30 pos.x -= 0.05f * speed; 31 32 theta += Time.deltaTime * thetaScale; 33 pos.y = Mathf.Sin(theta) * sinScale; 34 35 transform.position = new Vector3(pos.x, pos.y, -3); 36 37 if (pos.x < -12.0f) 38 { 39 Destroy(gameObject); 40 } 41 } 42 43}

c#

1BulletMove.cs 2 3using System.Collections; 4using System.Collections.Generic; 5using UnityEngine; 6 7public class BulletMove : MonoBehaviour 8{ 9 void Start() 10 { 11 Destroy(this.gameObject, 1.5f); 12 } 13 14 void Update() 15 { 16 17 } 18 19 private void OnTriggerEnter2D(Collider2D collision) 20 { 21 if(collision.tag == "Enemy") 22 { 23 Destroy(collision.gameObject); 24 } 25 } 26}

ちなみに、Bulletの移動速度そのものはPlayerのほうで管理しています。

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

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

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

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

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

guest

回答2

0

コードだけを見ると、わざわざクラスの参照とか探さず
public static void ScorePlus() { }
にしてしまって、
Score.ScorePlus();
ってアクセスすれば現時点ではとりあえずは問題ない気がします。

なんでpublic staticにゲッターがあるのか?とかよく分からんですし、見える範囲の分岐でscoreTextA,B,Cと分ける必要性、理由もよく分からんです。

投稿2021/06/29 07:36

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

kogarashi0917

2021/06/30 09:18

すみません、詳細を書いてなかったので必要性が見出せないのもうなずけます。 実は、3ステージでそれぞれカウントアップタイムとスコアを別にしたくて、scoreを3つに分けていました。
guest

0

ベストアンサー

Score.cs はPlayerにアタッチされているわけではなく、スコア表示するテキストにアタッチされているという認識で大丈夫でしょうか。
であれば、BulletMove.csから、Score.csがアタッチされているオブジェクトをGameObject.Find(string name);で取得して、そのオブジェクトからGetComponent<Score>();すればアクセスできると思います。
下のスクリプトでは、スコアを表示するテキストの名前を「ScoreText」としています。
参考になれば幸いです。

BulletMove

1public class BulletMove : MonoBehaviour 2{ 3 //Score.csの参照を取得しておく変数 4 private Score score; 5 6 void Start() 7 { 8 //オブジェクトを探して参照を追加 9 score = GameObject.Find("ScoreText").GetComponent<Score>(); 10 Destroy(this.gameObject, 1.5f); 11 } 12 13 private void OnTriggerEnter2D(Collider2D collision) 14 { 15 if(collision.tag == "Enemy") 16 { 17 Destroy(collision.gameObject); 18 //Score.csのScorePlus()を呼び出す 19 score.ScorePlus(); 20 } 21 } 22}

余談ですが、Score.cs内の記述について……

if (SceneManager.GetActiveScene().name == "Main" && SceneManager.GetActiveScene().name != "Main2" && SceneManager.GetActiveScene().name != "Main3") { //処理1 } else if (SceneManager.GetActiveScene().name != "Main" && SceneManager.GetActiveScene().name == "Main2" && SceneManager.GetActiveScene().name != "Main3") { //処理2 } else if (SceneManager.GetActiveScene().name != "Main" && SceneManager.GetActiveScene().name != "Main2" && SceneManager.GetActiveScene().name == "Main3") { //処理3 }

とされている場所が見受けられますが、if文、else if文を使用している時点で、

if (条件Aが正しい) { //処理A } else if (条件Bが正しい) { //処理B }

となっていれば、処理Bが行われるのは「条件Aが正しくなく、かつ、条件Bが正しい」ときになります。
よって、シーン名による場合分けは、

if (SceneManager.GetActiveScene().name == "Main") { //処理1 } else if (SceneManager.GetActiveScene().name == "Main2") { //処理2 } else if (SceneManager.GetActiveScene().name == "Main3") { //処理3 }

でも大丈夫だと思いますよ。

投稿2021/06/28 14:15

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問