teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

コメントを受けて追記

2018/12/01 02:31

投稿

sakura_hana
sakura_hana

スコア11429

answer CHANGED
@@ -34,4 +34,54 @@
34
34
  // 以下、hogeを使った処理
35
35
  }
36
36
  }
37
+ ```
38
+
39
+ ---
40
+
41
+ コメントを受けて追記。
42
+
43
+ 検知エリア内にプレハブから取得した不特定多数の敵キャラがいる状況でGetComponentを使わない方法の一例。
44
+ (GetComponentを使う方法とどっちがいいかはプロジェクトによる。単純にルートのクラス取りたいだけならGetComponentの方が楽チン。一方、今回のように事前にリストを持つ方法の利点は、任意のタイミングで「全ての敵に何かする」等の処理が楽。但し敵が消える場合は下手に組むとnullエラーを引き起こすので要注意。あくまでテスト用の例なので実際に使う場合は適宜手を加えてください)
45
+
46
+ ```C#
47
+ //敵キャラ生成スクリプト
48
+ public class EnemyManager : MonoBehaviour {
49
+ //敵のプレハブの一番親(ルート)にEnemyクラスが付いている想定
50
+ public Enemy prefab; //プレハブ作ってインスペクタからセットしておく
51
+
52
+ //生成した敵のリスト
53
+ public Dictionary<string, Enemy> enemyList;
54
+
55
+ //敵キャラ生成
56
+ public void Make () {
57
+ //とりあえずDictionaryの初期化をここでやっているが実際はちゃんと考えるべき
58
+ enemyList = new Dictionary<string, Enemy> ();
59
+
60
+ //敵を10体作る。GameObject名を「Enemy_数字」にしておく。そしてDictionaryに入れる。
61
+ //(最初の回答内で挙げた「InstantiateまたはAddComponentしたインスタンスを変数に格納」を使っている)
62
+ for (int i = 0; i < 10; i++) {
63
+ Enemy enemy = Instantiate(prefab);
64
+ enemy.name = "Enemy_"+i;
65
+ enemyList.Add(enemy.name, enemy);
66
+ }
67
+ }
68
+ }
69
+
70
+ //検知エリアスクリプト
71
+ public class Area : MonoBehaviour {
72
+ public EnemyManager enemyManager; //インスペクタからセットしておく
73
+
74
+ void OnTriggerEnter (Collider other) {
75
+ //DictionaryにあるかチェックしてからEnemy取得
76
+ if (enemyManager.enemyList.ContainsKey(other.transform.root.name)) {
77
+ Enemy enemy = enemyManager.enemyList[other.transform.root.name];
78
+ //以下、enemyに対する処理
79
+ }
80
+
81
+ //「transform.root」はそのオブジェクトのルートオブジェクトを示す。
82
+ //DictionaryのKeyには「Enemyクラスが付いているオブジェクト(つまり衝突対象のルートオブジェクト)の名前」、valueには「Enemyクラス」が入っている。
83
+ //なので上記の方法で「衝突対象のルートオブジェクトに付いているEnemyクラス」が取得出来る。
84
+ }
85
+ }
86
+
37
87
  ```