2017-02-16 5 views
1

私は単純な2Dゲームを1つにまとめるだけで、開始シーン、ゲームシーン、およびゲームオーバーシーンの3つのシーンを持っています。私はゲームのゲームのスコアを画面上に表示したい。私はDontDestroyOnLoad()関数を使って画面上にゲームを引き継ぐゲームシーンでスコアマネージャのゲームオブジェクトを作成しました。ゲームマネージャが管理するスコアにアクセス権を与えました。私は自分のコードをデバッグしていましたが、スコアはスコアマネージャに変換され、画面上のゲームが読み込まれても維持されますが、何らかの理由でスコアテキストオブジェクトを更新できません。ここに私のコードは次のとおりです。ゲームで画面上のスコアを統一的に表示するためにプログラムでテキストを変更する

using System.Collections; 
using System.Collections.Generic; 
using UnityEngine; 
using UnityEngine.UI; 

public class ScoreManager : MonoBehaviour { 

    public static ScoreManager Instance; 

    private GameController gameController; 

    private int scoreInstance; 

    private Text scoreText; 

    // When scene is first loaded 
    void Awake() { 

     this.InstantiateController(); 

    } 

    // Use this for initialization 
    void Start() { 

     GameObject gameControllerObject = GameObject.FindWithTag("GameController"); 

     if (gameControllerObject != null) 
     { 
      gameController = gameControllerObject.GetComponent<GameController>(); 
     } 

     GameObject scoreTextObject = GameObject.FindWithTag("ScoreText"); 

     if (scoreTextObject != null) 
     { 
      scoreText = scoreTextObject.GetComponent<Text>(); 
     } 

     scoreInstance = 0; 

     scoreText.text = ""; 

    } 

    // Update is called once per frame 
    void Update() { 

     scoreInstance = gameController.score; 
     Debug.Log("Score: " + scoreInstance.ToString()); 

     scoreText.text = scoreInstance.ToString(); 

    } 

    private void InstantiateController() 
    { 
     if (Instance == null) 
     { 
      Instance = this; 
      DontDestroyOnLoad(this); 
     } 
     else if (this != Instance) 
     { 
      Destroy(this.gameObject); 
     } 
    } 
} 

私はちょうどスコアマネージャーので、テキストコンポーネントで、それが公共およびドラッグすることはできません考え出しので、だから私は、プログラム起動機能で「スコアテキスト」UIコンポーネントを集めてみました実際にはスコアテキストオブジェクトとは異なるシーンにあります。私はまた、スコアマネージャが実際に画面上のゲームの一部であるときにそれを行うことができるように、更新機能にテキストコンポーネントを集めるためにこの全部のコードを追加しようとしました。何も動作していないと私は理由が分からない。誰も私にこれを手伝ってもらえますか?また、私は "NullReferenceException:オブジェクト参照がオブジェクトのインスタンスに設定されていない"エラーを取得し続けます。助けを前にありがとう。

+0

startメソッドとアップデートのすべての行の最後の行を与えることができますオブジェクトが初期化されているかどうかわからないのでnullの例外ですが、そのプロパティにはアクセスします。 "GetComponents"をデバッグして、何かが使用されているかどうかを確認してください。 –

+0

ありがとう! :)私は両方のGetComponentsをデバッグしました。エラーは、実際には、@ JasonLangメソッドがNullReferenceエラーを修正したことを示唆して、スコアの更新を維持した同じ問題によって引き起こされました。 – jedimaster7

答えて

1

ユニティスタート機能は、スクリプトが最初に有効になったときにのみ、つまりDontDestroyOnLoadオブジェクトのシーンが変更されるたびに呼び出されます。

シーンチェンジ後にいくつかの変更を配線する必要がある場合は、シーンチェンジを検出するか、そのシーンで開始するオブジェクトを実行するコードをトリガする必要があります。

新しいシーントリガものに別のオブジェクトを持つことは簡単ではかなりフールプルーフですが、あなたは他のオブジェクトに追加できる組み込み関数があります:

void OnLevelWasLoaded(int currentLevel) 
{ 
} 

これは、レベルの変更に呼び出されます、とあなたにレベルの番号を教えてください(名前は悲しいことではありません)。しかし、上記の非推奨と彼らはあなたがユニティののSceneManagerを使用したいので、これを設定する適切な方法は今です:

Unity 5 OnLevelWasLoaded?

Start() 
{ 
    SceneManager.sceneLoaded += this.OnLoadCallback; 
} 

void OnLoadCallback(Scene scene, LoadSceneMode sceneMode) 
{ 
    // you can query the name of the loaded scene here 
} 
+0

これは私の問題を解決した素晴らしいです。私はUnityのSceneManagerを使ってアクティブなシーンをチェックしてしまい、それがゲームオーバーシーンに等しいときはGetComponentコードを実行しました。助けてくれてありがとう! :) – jedimaster7

関連する問題