🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C#

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

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

1457閲覧

○○Controllerなどの取得の仕方について

kanata_02

総合スコア25

C#

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

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2019/10/12 12:18

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なクラスにする、シングルトンにするなどしてアクセスしやすくするなど考えたのですが、使用したいのはゲームシーンでのみなのであまり適切ではないように思えました。
何かアドバイスいただけましたら幸いです。よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

静的クラスを作成しその中に全てのデータを格納してはどうでしょうか?
私はこの方法をよく使っていますが不便に感じたことはありません。

その変数を使うのが限られたシーン内であれ、よほど巨大なデータでなければ最近のコンピュータなら易々扱ってくれると思います。

もし巨大なデータを扱うのであれば、
GameObject data = GameObject.FindGameObjectWithTag("Data");
と書いて私は満足しています。

投稿2019/10/12 12:47

KanazawaKureha

総合スコア368

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

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

kanata_02

2019/10/12 14:56

静的クラスの中にplayerController、scorecontroller等をすべて格納して静的クラスを呼び出すようにする、という解釈でよろしいでしょうか?
KanazawaKureha

2019/10/12 15:09

静的クラスに記述するのは_gameoverなどのパラメーターのみで、メソッドは自作のイベントを用いて呼び出すようにしています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問