回答編集履歴

2

コードを訂正

2017/09/21 04:23

投稿

IShix
IShix

スコア1724

test CHANGED
@@ -142,6 +142,8 @@
142
142
 
143
143
  hasObj.transform.position = pos;
144
144
 
145
+ hasObj.SetActive(true);
146
+
145
147
  return hasObj;
146
148
 
147
149
  }

1

追記

2017/09/21 04:23

投稿

IShix
IShix

スコア1724

test CHANGED
@@ -31,3 +31,181 @@
31
31
  Instantiate(go,Vector3.zero,Quaternion.identity);
32
32
 
33
33
  ```
34
+
35
+ ###Instantiateで読み出したprefabのスクリプトを利用したい場合
36
+
37
+ どういったエフェクトか分かりませんが、エフェクトにスクリプトをアタッチしてそのスクリプトからアニメーション処理を読み出したいなどあるかもしれませんので追記しておきます。
38
+
39
+
40
+
41
+ ```C#
42
+
43
+ var prefab = Resources.Load<GameObject>("prefab名");
44
+
45
+ var go = Instantiate(prefab,Vector3.zero,Quaternion.identity) as GameObject;
46
+
47
+
48
+
49
+ var script = go.GetComponent<MyEffectScript>();
50
+
51
+ script.startAnime();
52
+
53
+ ```
54
+
55
+ ###(おまけ)InstantiateもDestroyも高コストなのでオブジェクトプールを利用されるといいと思います。
56
+
57
+
58
+
59
+ InstantiateもDestroyも高コストなので生成したオブジェクトを非表示にして消さずに保持しておくオブジェクトプールという方法を紹介します。コードを短くするため機能を省略したので使い勝手は悪いと思いますが参考にごらんください。コードは未検証です。
60
+
61
+
62
+
63
+ **[オブジェクトプール]**
64
+
65
+ ```C#
66
+
67
+ using System.Collections.Generic;
68
+
69
+ using UnityEngine;
70
+
71
+ using System.Linq;
72
+
73
+
74
+
75
+ public class poolObj : MonoBehaviour
76
+
77
+ {
78
+
79
+ //元のオブジェクトをキャッシュ
80
+
81
+ GameObject obj;
82
+
83
+
84
+
85
+ //オブジェクトをキャッシュする配列
86
+
87
+ public List<GameObject> cacheObj = new List<GameObject>();
88
+
89
+
90
+
91
+ //初期化
92
+
93
+ public static poolObj Initarize(GameObject obj)
94
+
95
+ {
96
+
97
+ var go = new GameObject("objPool");
98
+
99
+ var s = go.AddComponent<poolObj>();
100
+
101
+ s.setUp(obj);
102
+
103
+ return s;
104
+
105
+ }
106
+
107
+
108
+
109
+ //インスタンスのセットアップ
110
+
111
+ void setUp(GameObject obj)
112
+
113
+ {
114
+
115
+ this.obj = obj;
116
+
117
+ }
118
+
119
+
120
+
121
+ //オブジェクトを生成 外部から呼ばれる関数
122
+
123
+ public GameObject Create(Vector3 pos)
124
+
125
+ {
126
+
127
+ //キャッシュ中のオブジェクトで使用していないものがあればそこから使う
128
+
129
+ if(cacheObj != null && cacheObj.Count > 0)
130
+
131
+ {
132
+
133
+ //表示されてないオブジェクトを取得
134
+
135
+ var hasObj = cacheObj.FirstOrDefault(x => !x.activeInHierarchy);
136
+
137
+ //表示されていないオブジェクトがあれば返す
138
+
139
+ if(hasObj != null)
140
+
141
+ {
142
+
143
+ hasObj.transform.position = pos;
144
+
145
+ return hasObj;
146
+
147
+ }
148
+
149
+ }
150
+
151
+
152
+
153
+ var go = Instantiate(obj, pos, Quaternion.identity) as GameObject;
154
+
155
+
156
+
157
+ return go;
158
+
159
+ }
160
+
161
+ }
162
+
163
+ ```
164
+
165
+
166
+
167
+ **[利用側]**
168
+
169
+
170
+
171
+ ```C#
172
+
173
+ using UnityEngine;
174
+
175
+
176
+
177
+ public class effector : MonoBehaviour
178
+
179
+ {
180
+
181
+ //プールをキャッシュ
182
+
183
+ poolObj pool;
184
+
185
+
186
+
187
+ void Start()
188
+
189
+ {
190
+
191
+ //プールの初期化
192
+
193
+ var prefab = Resources.Load<GameObject>("prefab名");
194
+
195
+ pool = poolObj.Initarize(prefab);
196
+
197
+
198
+
199
+ //オブジェクトを生成
200
+
201
+ var obj = pool.Create(Vector3.zero);
202
+
203
+ //オブジェクトを消す ※DestroyではなくSetActiveを使う
204
+
205
+ obj.SetActive(false);
206
+
207
+ }
208
+
209
+ }
210
+
211
+ ```