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

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

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

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

Q&A

解決済

2回答

1439閲覧

ゲームオーバーになったらスコアの更新を止めたい

ryoya_

総合スコア4

C#

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

0グッド

0クリップ

投稿2020/03/17 08:44

編集2020/03/17 23:03

前提・実現したいこと

unityでスクロールされてくる木を通り抜ける(フラッピーバード)ゲームを作っています。
木に当たるとゲームオーバーです。
ゲームオーバーになったら木を通過してもスコアが加算されないようにしたいです。

ゲームオーバーになったら木を通過してもスコアが加算されないような機能を
実装中に以下のエラーメッセージが発生しました。
同じような質問を見つけたのですが、よくわかりませんでした。

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

Assets\Script\ScoreScript.cs(32,14): error CS0103: The name 'gameover' does not exist in the current context

該当のソースコード

C#  スコアのコードになります

using UnityEngine; using UnityEngine.UI; using System.Collections; using System.Collections.Generic; public class ScoreScript : MonoBehaviour { //------------------ public static int score = 0; //---------------------- void Start() { //------------ if (score > 0) { reset(); } //------------ GetComponent<Text>().text = "SCORE: " + score.ToString(); } //------------------- void reset() { score = 0; } //-------------------- public void ScoreUp(int point) { if (!gameover) { score += point; GetComponent<Text>().text = "SCORE: " + score.ToString(); } } //------------------------------- public static int GetScore() { return score; } //------------------------------- }

C#  プレイヤーのコードになります

using UnityEngine; using System.Collections; using UnityEngine.SceneManagement; public class playerScript3 : MonoBehaviour { public GameObject Score; private Rigidbody2D rb2D; private float jumpForce = 10.0f; private float downForce = -10.0f; private float rightForce = 0.2f; private float leftForce = -0.2f; //GameOverのGUITextを指定 public GameObject GameOverGUI; //gameoverフラグ private bool gameover = false; //Animator変数 private Animator anim; void Start() { rb2D = GetComponent<Rigidbody2D>(); //AnimatorをGetComponentしておく anim = GetComponent("Animator") as Animator; } void Update() { //gameoverフラグがtrueになった時、ジャンプできないようにする if (Input.GetMouseButtonDown(0) && !gameover) { Jump(); } //------------------ if (Input.GetMouseButtonDown(1) && !gameover) { down(); } if(Input.GetKey(KeyCode.D) && !gameover) { right(); } if(Input.GetKey(KeyCode.A) && !gameover) { left(); } //------------------- if (gameover == true) { //アニメーションの切替 anim.SetBool("gameover", true); //GAME OVERのGUIを表示する GameOverGUI.SendMessage("Lose"); } } void Jump() { GetComponent<AudioSource>().Play(); // 効果音を鳴らす rb2D.velocity = new Vector2(rb2D.velocity.x, jumpForce); } //------------------ void down() { rb2D.velocity = new Vector2(rb2D.velocity.x, downForce); } void right() { //rb2D.velocity = new Vector2(rb2D.velocity.rightForce, y); transform.Translate(rightForce, 0, 0); } void left() { //rb2D.velocity = new Vector2(rb2D.velocity.leftForce, y); transform.Translate(leftForce, 0, 0); } //-------------------- void OnTriggerEnter2D(Collider2D col) { Score.SendMessage("ScoreUp", 1); Destroy(col.gameObject); } //Trigger以外の何か障害物に当たった置き、GameOverメソッドを実行 void OnCollisionEnter2D(Collision2D col) { StartCoroutine(GameOver()); } IEnumerator GameOver() { // ゲームオーバーのフラグをtrueにする gameover = true; // マウス連打してたらスコアを見る暇もなくタイトルへ戻ってしまう対策 1秒待機 yield return new WaitForSeconds(1f); // マウスクリックしたらゲームの最初に戻る while (!Input.GetMouseButtonDown(0)) { yield return 0; } //------------------- Application.LoadLevel("result"); //------------------ } }

C# ゲームオーバーのコードになります。

using UnityEngine; using UnityEngine.UI; using System.Collections; public class gameOverScript : MonoBehaviour { void Start() { gameObject.GetComponent<Text>().enabled = false; } public void Lose() { gameObject.GetComponent<Text>().enabled = true; } }

試したこと

scoreScriptにif(!gameover)で判定しようとしたが、できなかった。

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

unity2018.4.17f1を使用しています。

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

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

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

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

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

y_waiwai

2020/03/17 08:45

このままではコードが読みづらいので、質問を編集し、<code>ボタンを押し、出てくる’’’の枠の中にコードを貼り付けてください
ryoya_

2020/03/19 05:53

修正しました。 できれば回答お願いします。
guest

回答2

0

自己解決

C#

1using UnityEngine; 2using System.Collections; 3using UnityEngine.SceneManagement; 4 5public class playerScript3 : MonoBehaviour 6{ 7 8 public GameObject Score; 9 private Rigidbody2D rb2D; 10 private float jumpForce = 10.0f; 11 private float downForce = -10.0f; 12 private float rightForce = 0.2f; 13 private float leftForce = -0.2f; 14 //GameOverのGUITextを指定 15 public GameObject GameOverGUI; 16 //gameoverフラグ 17 private bool gameover = false; 18 //Animator変数 19 private Animator anim; 20 21 void Start() 22 { 23 rb2D = GetComponent<Rigidbody2D>(); 24 //AnimatorをGetComponentしておく 25 anim = GetComponent("Animator") as Animator; 26 } 27 28 void Update() 29 { 30 //gameoverフラグがtrueになった時、ジャンプできないようにする 31 if (Input.GetMouseButtonDown(0) && !gameover) 32 { 33 Jump(); 34 } 35 36 //---------------------------------------- 37 if (Input.GetMouseButtonDown(1) && !gameover) 38 { 39 down(); 40 } 41 42 if(Input.GetKey(KeyCode.D) && !gameover) 43 { 44 right(); 45 } 46 47 if(Input.GetKey(KeyCode.A) && !gameover) 48 { 49 left(); 50 } 51 //-------------------------------------------- 52 53 if (gameover == true) 54 { 55 //アニメーションの切替 56 anim.SetBool("gameover", true); 57 //GAME OVERのGUIを表示する 58 GameOverGUI.SendMessage("Lose"); 59 } 60 } 61 62 void Jump() 63 { 64 GetComponent<AudioSource>().Play(); // 効果音を鳴らす 65 rb2D.velocity = new Vector2(rb2D.velocity.x, jumpForce); 66 } 67 68 //--------------------------------------------------- 69 void down() 70 { 71 rb2D.velocity = new Vector2(rb2D.velocity.x, downForce); 72 } 73 74 void right() 75 { 76 //rb2D.velocity = new Vector2(rb2D.velocity.rightForce, y); 77 transform.Translate(rightForce, 0, 0); 78 } 79 80 void left() 81 { 82 //rb2D.velocity = new Vector2(rb2D.velocity.leftForce, y); 83 transform.Translate(leftForce, 0, 0); 84 } 85 //----------------------------------------------------- 86 87 void OnTriggerEnter2D(Collider2D col) 88 { 89 //-------------------------------------------------- 90 if (!gameover) 91 { 92 Score.SendMessage("ScoreUp", 1); 93 } 94 //------------------------------------------------- 95 Destroy(col.gameObject); 96 } 97 98 //Trigger以外の何か障害物に当たった置き、GameOverメソッドを実行 99 void OnCollisionEnter2D(Collision2D col) 100 { 101 StartCoroutine(GameOver()); 102 } 103 104 IEnumerator GameOver() 105 { 106 // ゲームオーバーのフラグをtrueにする 107 gameover = true; 108 // マウス連打してたらスコアを見る暇もなくタイトルへ戻ってしまう対策 1秒待機 109 yield return new WaitForSeconds(1f); 110 // マウスクリックしたらゲームの最初に戻る 111 while (!Input.GetMouseButtonDown(0)) { yield return 0; } 112 //------------------------------------------------ 113 Application.LoadLevel("result"); 114 //------------------------------------------------ 115 } 116}

スコア加算のコードをScoreScriptに書いていると勘違いしていました。

void OnTriggerEnter2D(Collider2D col)
{
//--------------------------------------------------
if (!gameover)
{
Score.SendMessage("ScoreUp", 1);
}
//-------------------------------------------------
Destroy(col.gameObject);
}

この部分の修正で治りました。

投稿2020/03/20 03:54

ryoya_

総合スコア4

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

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

0

playerScript3 にgameoverは定義されていますが、ScoreScript には gameover は定義されていません
ScoreScript内でgameoverでは、ScoreScript.gameoverを意味するので、playerScript3.gameover とはなりません

ScoreScript に public playerScript3 ps; というのを追加し、InspectorでD&Dして、ps.gameover としてアクセスするといいでしょう

投稿2020/03/17 08:50

izmktr

総合スコア2856

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

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

ryoya_

2020/03/18 00:51

回答ありがとうございます。 プログラミング初心者で、わからないことがあるので再度質問させてください。 ScoreScriptにD&DするのはPlayerScriptで大丈夫ですか?   ScoreオブジェクトにScoreScriptをアタッチ。ScoreScriptにPlayerScriptをドラッグさせています。                 今はコンパイルエラーが出ています。
izmktr

2020/03/18 02:06

コンパイルエラーはD&Dする前から直してください
ryoya_

2020/03/19 02:36

if(!gameover)を外すとコンパイルエラーがなくなるので、おそらく原因はこれだと思うんですが・・・
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問