現在Unityにてキャラクターを移動させ、落ちてきたアイテムを拾いスコアを稼ぐゲームを作成しています。
落ちてくるアイテムはプレハブ化したものをインスタンス化して使用していて、以下のスクリプトをアタッチしているのですが
C#
1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class ItemController : MonoBehaviour 6{ 7 private PlayerController _playerController; 8 private ItemGenerator _itemGenerator; 9 private ModeManager _modeManager; 10 private UIController _uiController; 11 private ScoreController _scorecontroller; 12 private AudioSource _meron; 13 private AudioSource _specialMeron; 14 private AudioSource _bad; 15 16 void Start() 17 { 18 //prefabなのでFind 19 _playerController = GameObject.Find("Player").GetComponent<PlayerController>(); 20 _itemGenerator = GameObject.Find("ItemGenerator").GetComponent<ItemGenerator>(); 21 _modeManager = GameObject.Find("ModeManager").GetComponent<ModeManager>(); 22 _uiController = GameObject.Find("UIController").GetComponent<UIController>(); 23 _scorecontroller = GameObject.Find("ScoreText").GetComponent<ScoreController>(); 24 AudioSource[] audioSources = GameObject.Find("SE").GetComponents<AudioSource>(); 25 _meron = audioSources[0]; 26 _specialMeron = audioSources[1]; 27 _bad = audioSources[2]; 28 } 29 30 void FixedUpdate() 31 { 32 //アイテム落下 33 transform.Translate(0, _itemGenerator.Speed * Time.deltaTime, 0); 34 } 35 36 void OnTriggerEnter2D(Collider2D collision) 37 { 38 //床より下に行ったとき 39 if (collision.gameObject.tag == "DestroyFloor") 40 { 41 Destroy(gameObject); 42 } 43 44 //床についとき 45 if (collision.gameObject.tag == "Floor") 46 { 47 if (gameObject.tag == "Meron" || gameObject.tag == "SpecialMeron") 48 { 49 if (!_modeManager.MaxMode && _modeManager.ItemDrop) 50 { 51 _bad.PlayOneShot(_bad.clip); 52 _playerController.GameOver = true; 53 } 54 } 55 else 56 { 57 Destroy(gameObject); 58 } 59 } 60 61 //プレイヤーに当たったとき 62 if (collision.gameObject.tag == "Player") 63 { 64 if (!_playerController.GameOver) 65 { 66 if (gameObject.tag == "Meron") 67 { 68 _meron.PlayOneShot(_meron.clip); 69 _uiController.PlusScoreSetActiveTrue(10); 70 _scorecontroller.ScorePlus(gameObject); 71 Destroy(gameObject); 72 } 73 74 if (gameObject.tag == "SpecialMeron") 75 { 76 _specialMeron.PlayOneShot(_specialMeron.clip); 77 _uiController.PlusScoreSetActiveTrue(100); 78 _scorecontroller.ScorePlus(gameObject); 79 _modeManager.MaxMode = true; 80 _modeManager.ItemDrop = false; 81 Destroy(gameObject); 82 } 83 } 84 85 if (gameObject.tag == "Onigiri") 86 { 87 _bad.PlayOneShot(_bad.clip); 88 _playerController.GameOver = true; 89 } 90 } 91 } 92} 93
毎回FindでほかのManagerがアタッチされたオブジェクトを探しており、メモリに負荷をかける原因になるのではないだろうかと思いました。
Publicで登録するなどにしたいのですがPrefabなのでそれもできず、どのようにすればいいか悩んでおります。
Findで検索する以外にどのようなやり方がありますでしょうか?何かアドバイスいただけますと幸いです。
ちょっと暇つぶしに質問主さんの過去の質問を見てましたが、シングルトンパターンに抵抗があるように見受けられました。
その場合、Game.Sceneみたいに、シーンのオープンと開始に本ゲームが始まるのであれば
・Stage生成時に「StageManager」を生成
・StageManagerのStartで、主要6つをFindで取得。StageManagerのメンバ変数とする。
・主要6つの相互のやり取りをStageManagerで統括する
こうするとゲーム終了で、Game.Sceneの終了と同時に
StageManagerも破棄され、変に生きてる実体も無くなり、すっきりした処理になる思います。
一番きれいな回答ですが、説明が難しく、言葉足らずなのはご容赦ください…
回答1件
あなたの回答
tips
プレビュー