Unityでゲームシーンでの最終スコアをクリアシーンに反映したいのですが、うまくいきません。
ネットに書いてあることも試してみたのですが、やり方が悪いのか上手くいきませんでした。
教えてほしいです。
流れとしては、ゲームシーンで、CursorShotScriptでRayがmatoPrefabを破壊しそのたびにUIDirectorのscoreincrease関数を起動します。
UIDirectorでscoreにmatoPrefabが破壊された回数を表示し、TimerScriptで制限時間が来たらクリアシーンでClearDirector内で最終的なスコアの数値をコンソールに表示するようにしたいです。
まずCursorShotScriptです。
c#
1using UnityEngine; 2using System.Collections; 3using UnityEngine.SceneManagement; 4 5public class CursorShotScript : MonoBehaviour { 6 7 // カーソルに使用するテクスチャ 8 [SerializeField] 9 private Texture2D cursor; 10 [SerializeField] 11 private matoGenerator matoGenerator; 12 public GameObject matoPrefab; 13 GameObject gameobject; 14 15 void Start () { 16 // カーソルを自前のカーソルに変更 17 Cursor.SetCursor(cursor, new Vector2(cursor.width / 2, cursor.height / 2), CursorMode.ForceSoftware); 18 } 19 20 void Update () { 21 // マウスの左クリックで撃つ 22 if(Input.GetButtonDown("Fire1")) { 23 Shot(); 24 } 25 } 26 27 // 敵を撃つ 28 void Shot() { 29 Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); 30 31 float maxDistance=10; 32 33 RaycastHit2D hit = Physics2D.Raycast((Vector2)ray.origin, (Vector2)ray.direction, maxDistance, LayerMask.GetMask("Enemy")); 34 35 if(hit.collider) { 36 matoGenerator.Create(); 37 Destroy(hit.collider.gameObject); 38 GameObject director = GameObject.Find("UIDirector"); 39 director.GetComponent<UIDirector>().scoreincrease(); 40 } 41 if(hit.collider.tag=="Enemy"){ 42 SceneManager.LoadScene("LoseScene"); 43 Debug.Log ("RayがPlayerに当たった"); 44 } 45 } 46} 47
次にUIDirectorです。
c#
1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.UI; 5 6public class UIDirector : MonoBehaviour { 7 8 public GameObject score; 9 public int score_current=0; 10 // Use this for initialization 11 void Start () { 12 this.score = GameObject.Find("score"); 13 } 14 public void scoreincrease(){ 15 this.score_current++; 16 this.score.GetComponent<Text>().text=score_current.ToString(); 17 } 18} 19
次にTimerScriptです。
c#
1using UnityEngine; 2using System.Collections; 3using UnityEngine.UI; 4using UnityEngine.SceneManagement; 5 6public class TimerScript : MonoBehaviour { 7 8 // トータル制限時間 9 private float totalTime; 10 // 制限時間(分) 11 [SerializeField] 12 private int minute; 13 // 制限時間(秒) 14 [SerializeField] 15 private float seconds; 16 // 前回Update時の秒数 17 private float oldSeconds; 18 private Text timerText; 19 20 void Start () { 21 totalTime = minute * 60 + seconds; 22 oldSeconds = 0f; 23 timerText = GetComponentInChildren<Text>(); 24 } 25 26 void Update () { 27 // 制限時間が0秒以下なら何もしない 28 if (totalTime <= 0f) { 29 return; 30 } 31 // 一旦トータルの制限時間を計測; 32 totalTime = minute * 60 + seconds; 33 totalTime -= Time.deltaTime; 34 35 // 再設定 36 minute = (int) totalTime / 60; 37 seconds = totalTime - minute * 60; 38 39 // タイマー表示用UIテキストに時間を表示する 40 if((int)seconds != (int)oldSeconds) { 41 timerText.text = minute.ToString("00") + ":" + ((int) seconds).ToString("00"); 42 } 43 oldSeconds = seconds; 44 45 if(totalTime <= 0f) { 46 SceneManager.LoadScene("ClearScene"); 47 } 48 } 49}
最後にClearDirectorです。
c#
1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.SceneManagement; 5using UnityEngine.UI; 6 7 8public class ClearDirector : MonoBehaviour { 9 public GameObject score; 10 11 void Start () 12 { 13 14 } 15 16 // Update is called once per frame 17 void Update () { 18 if(Input.GetMouseButtonDown(0)){ 19 SceneManager.LoadScene("Mainmenu"); 20 } 21 } 22} 23
変な文章で申し訳ありません。
###回答を受けての変更後
snowshinkさんの回答をいただいて変更したときのスクリプトとエラーです
変更したスクリプトはUIDirectorとClearDirectorです
UIDirector
1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.UI; 5 6public class UIDirector : MonoBehaviour { 7 8 public Text score; 9 public int score_current=0; 10 // Use this for initialization 11 void Start () { 12 score = GetComponent<Text>(); 13 DontDestroyOnLoad(this.gameObject); 14 } 15 public void scoreincrease(){ 16 this.score_current++; 17 this.score.text=score_current.ToString(); 18 } 19}
ClearDirector
1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.SceneManagement; 5using UnityEngine.UI; 6 7 8public class ClearDirector : MonoBehaviour { 9 public GameObject score; 10 void Start () 11 { 12 UIDirector loadScene = FindObjectOfType<UIDirector> (); 13 Debug.Log (loadScene.score); 14 } 15 16 // Update is called once per frame 17 void Update () { 18 if(Input.GetMouseButtonDown(0)){ 19 SceneManager.LoadScene("Mainmenu"); 20 } 21 } 22}
エラー画面はこんな感じです。
エラー文章は、
NullReferenceException: Object reference not set to an instance of an object
UIDirector.scoreincrease () (at Assets/UIDirector.cs:17)
CursorShotScript.Shot () (at Assets/CursorShotScript.cs:40)
CursorShotScript.Update () (at Assets/CursorShotScript.cs:24)
です。初期配置しているmatoPrefabを破壊したときに発生しました。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/11/09 06:45
2019/11/09 07:37
2019/11/09 09:02 編集
2019/11/09 13:15
2019/11/09 13:47
2019/11/10 13:15