fork download
  1. //
  2. // 「管理者」と「被管理者」と言う考え方の、単純な管理構造サンプル
  3. //
  4. // ・透過的にボールを管理するマネージャと
  5. // ・その対象となるボール用のインタフェース
  6. // この二つを利用して、簡単に楽チン管理。
  7. //
  8. // 以下のサンプルでは、次々にプレハブから生成する(つもり)の「ボール」に対して
  9. // メインループから一斉に一発でアクセスする手法をアドリブで書いた。
  10. // 間に挟まっているマネージャが Singleton になっているのがイマイチだけど、
  11. // その辺はUnity環境の事情と言う事で一つ。
  12. //
  13. // 話の要点を簡単に言うなら、「複数のオブジェクトが参照する、共通の何かが間に挟まればいい」って事。
  14. // それの具体的な「点と点をつなぐ線」の実装例。応用はお好きに。
  15. //
  16.  
  17. using UnityEngine;
  18. using System.Collections;
  19. using System.Collections.Generic;
  20.  
  21. // 例えばボールを管理するマネージャクラス
  22. // MonoBehaviour と関係ないので AssemblyCSharp名前空間 に置いとく
  23. // 意味的に違和感無ければデフォルトでもいい
  24. namespace AssemblyCSharp
  25. {
  26. // 生成されるボールを管理するクラス
  27. public class BallManager {
  28.  
  29. // 唯一のインスタンス
  30. private static BallManager manager = new BallManager();
  31.  
  32. // インスタンス取得メソッド
  33. public static BallManager getInstance()
  34. {
  35. return manager;
  36. }
  37.  
  38. // ------------------------------------------------------------------
  39.  
  40. // 生成したボールのインスタンス参照を持っておくリスト…
  41. // だが、MonoBehaviour や GameObject でなく、
  42. // 自前のインタフェース
  43. private List<IBallProc> listBalls = null;
  44.  
  45.  
  46. // ここで行っているのはいわゆる Singleton なので privateコンストラクタ
  47. // 別に(どうせスレッド・アンセーフなんだから)全部 public static でも良いかもしれないが
  48. // 気持ち悪いのでシンプルにこう
  49. private BallManager()
  50. {
  51. listBalls = new List<IBallProc>();
  52. }
  53.  
  54. // 外部からマネージャにボールを登録する
  55. public void register(IBallProc go)
  56. {
  57. this.listBalls.Add(go);
  58. }
  59.  
  60. // このマネージャに登録されているボール全てに通知
  61. // この例で言えば、スケールの変更
  62. public void scaleChange(float r)
  63. {
  64. foreach(IBallProc mb in listBalls)
  65. {
  66. mb.scaleChange(r);
  67. }
  68. }
  69.  
  70. // 以下2つはベタなおまけなので説明略。lengthをpropertyにしないのはなんとなく
  71. public int length() { return this.listBalls.Count; }
  72. public IBallProc this[int index] { get { return this.listBalls[index]; } }
  73. }
  74. }
  75.  
  76. -----------------------------------------
  77.  
  78. using System;
  79.  
  80. // 肝心のインタフェース
  81. // これも MonoBehaviour と関係ないので AssemblyCSharp名前空間 に置いとくが、どちらでもいい
  82. namespace AssemblyCSharp
  83. {
  84. public interface IBallProc
  85. {
  86. // スケールチェンジの機能(のつもり)の約束
  87. void scaleChange(float r);
  88. }
  89. }
  90.  
  91.  
  92. -----------------------------------------
  93.  
  94. using UnityEngine;
  95. using System.Collections;
  96.  
  97. // 実際の プレハブに割り当てるボールコントローラ
  98. // 通常の MonoBehaviour のほか、上で定義している
  99. // AssemblyCSharp.IBallProc インタフェースもインプリメント
  100. //
  101. public class BallCtrl
  102. : MonoBehaviour, AssemblyCSharp.IBallProc
  103. {
  104. private AssemblyCSharp.BallManager man = AssemblyCSharp.BallManager.getInstance();
  105.  
  106. void Start () { /* 略 */ }
  107. void Update () { /* 略 */ }
  108.  
  109. // 初動時に自分をマネージャに登録
  110. void Awake()
  111. {
  112. man.register(this);
  113. }
  114.  
  115. // このメソッドは、「マネージャが叩いてくる」メソッド。そして…
  116. public void scaleChange(float r)
  117. {
  118. this.gameObject.transform.localScale *= r;
  119. }
  120. }
  121.  
  122.  
  123. -----------------------------------------
  124.  
  125. ~~~ Main Loop 処理などで ~~~
  126.  
  127. private AssemblyCSharp.BallManager ballManager;
  128. private float test = 1.0f;
  129.  
  130. void Awake()
  131. {
  132. ballManager = AssemblyCSharp.BallManager.getInstance();
  133. }
  134.  
  135. if(Input.GetKeyDown(KeyCode.Space))
  136. {
  137. Instantiate(goBlit, goPlayer.transform.position, goPlayer.transform.rotation);
  138.  
  139. // 生成されている全てに通知はこれだけ
  140. // メインループは、マネージャを叩く → マネージャは自分のリストを全て叩く
  141. // ただこれだけ
  142. ballManager.scaleChange(test);
  143. test *= 1.2f;
  144. }
  145.  
Not running #stdin #stdout 0s 0KB
stdin
Standard input is empty
stdout
Standard output is empty