Unityでゲームを作成しています。
現在「ゲームオーバー状態にあるか否か」を判別するためのboolを持ったplayerControllerというスクリプトがありまして、こちらをプレイヤーにアタッチしています。
C#
1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.UI; 5using UnityEngine.SceneManagement; 6 7public class PlayerController : MonoBehaviour 8{ 9 public ScoreController scorecontroller; 10 public ItemGenerator itemGenerator; 11 public ModeManager modeManager; 12 public UIController uiController; 13 14 //ゲームオーバー状態にあるか否かのbool 15 private bool _gameOver = false; 16 public bool GameOver 17 { 18 get { return _gameOver; } 19 set { _gameOver = value; } 20 } 21 private AudioSource _meron; 22 private AudioSource _specialMeron; 23 private Animator _anim; 24 private Vector2 _playerPos; 25 private float _playerX; 26 public float PlayerX 27 { 28 get { return _playerX; } 29 set { _playerX = value; } 30 } 31 private float _speed = 4f; 32 public float Speed { 33 get { return _speed; } 34 set { _speed = value; } 35 } 36 37 void Start() 38 { 39 AudioSource[] audioSources = GetComponents<AudioSource>(); 40 _meron = audioSources[0]; 41 _specialMeron = audioSources[1]; 42 _anim = GetComponent<Animator>(); 43 } 44 45 void Update() 46 { 47 if (Input.GetKeyDown(KeyCode.RightArrow) || Input.GetKeyDown(KeyCode.LeftArrow)) 48 { 49 _playerX = Input.GetAxisRaw("Horizontal"); 50 } else if (Input.GetKeyUp(KeyCode.RightArrow) || Input.GetKeyUp(KeyCode.LeftArrow)) { 51 _playerX = Input.GetAxisRaw("Horizontal"); 52 } 53 54 //ゲームオーバーしてなければ移動可能 55 if (!_gameOver) 56 { 57 if(_playerX != 0) 58 { 59 //移動制限 60 _playerPos = transform.position; 61 _playerPos.x = Mathf.Clamp(_playerPos.x, -1.9f, 1.9f); 62 transform.position = new Vector2(_playerPos.x, _playerPos.y); 63 _anim.SetBool("walk", true); 64 //移動 65 Vector2 temp = transform.localScale; 66 temp.x = _playerX; 67 transform.localScale = temp; 68 transform.Translate(_playerX * _speed * Time.deltaTime, 0, 0); 69 } else 70 { 71 _anim.SetBool("walk", false); 72 } 73 } else 74 { 75 Time.timeScale = 0; 76 StartCoroutine(WaitSceneChange()); 77 } 78 } 79 80 public IEnumerator WaitSceneChange() 81 { 82 //1秒待ってからゲームオーバー 83 yield return new WaitForSecondsRealtime(1f); 84 SceneManager.LoadScene("GameOver"); 85 Time.timeScale = 1; 86 } 87} 88
ゲームオーバー状態にしたいときや、ゲームオーバー状態だったらこの処理を通す、という記述がしたいときは以下のようにPublicの変数を用意し、inspectorに登録して、変数を見る等のやり方をしています。
C#
1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class SoundManager : MonoBehaviour 6{ 7 //PlayerControllerを取得 8 public PlayerController playerController; 9 10 private AudioSource audioSource; 11 12 void Start() 13 { 14 audioSource = this.GetComponent<AudioSource>(); 15 } 16 17 void Update() 18 { 19 //プレイヤーがゲームオーバーになったら音楽を止める 20 if (playerController.GameOver) 21 { 22 audioSource.Stop(); 23 } 24 } 25} 26
ですがゲームオーバー状態によって処理を変えたいクラスが出てくるたびにpublicで取得するのは手間ですし、あまりいいやり方ではないように思えてきました。(scorecontrollerなども呼び出したい毎にPublicで取得しており、同じような状態になっています)
この状態を改善するにはどのようなやり方がありますでしょうか?
staticなクラスにする、シングルトンにするなどしてアクセスしやすくするなど考えたのですが、使用したいのはゲームシーンでのみなのであまり適切ではないように思えました。
何かアドバイスいただけましたら幸いです。よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/10/12 14:56
2019/10/12 15:09