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

回答編集履歴

2

コードを訂正

2017/09/21 04:23

投稿

IShix
IShix

スコア1729

answer CHANGED
@@ -70,6 +70,7 @@
70
70
  if(hasObj != null)
71
71
  {
72
72
  hasObj.transform.position = pos;
73
+ hasObj.SetActive(true);
73
74
  return hasObj;
74
75
  }
75
76
  }

1

追記

2017/09/21 04:23

投稿

IShix
IShix

スコア1729

answer CHANGED
@@ -14,4 +14,93 @@
14
14
  var go = Resources.Load<GameObject>("prefab名");
15
15
  //画面に配置
16
16
  Instantiate(go,Vector3.zero,Quaternion.identity);
17
+ ```
18
+ ###Instantiateで読み出したprefabのスクリプトを利用したい場合
19
+ どういったエフェクトか分かりませんが、エフェクトにスクリプトをアタッチしてそのスクリプトからアニメーション処理を読み出したいなどあるかもしれませんので追記しておきます。
20
+
21
+ ```C#
22
+ var prefab = Resources.Load<GameObject>("prefab名");
23
+ var go = Instantiate(prefab,Vector3.zero,Quaternion.identity) as GameObject;
24
+
25
+ var script = go.GetComponent<MyEffectScript>();
26
+ script.startAnime();
27
+ ```
28
+ ###(おまけ)InstantiateもDestroyも高コストなのでオブジェクトプールを利用されるといいと思います。
29
+
30
+ InstantiateもDestroyも高コストなので生成したオブジェクトを非表示にして消さずに保持しておくオブジェクトプールという方法を紹介します。コードを短くするため機能を省略したので使い勝手は悪いと思いますが参考にごらんください。コードは未検証です。
31
+
32
+ **[オブジェクトプール]**
33
+ ```C#
34
+ using System.Collections.Generic;
35
+ using UnityEngine;
36
+ using System.Linq;
37
+
38
+ public class poolObj : MonoBehaviour
39
+ {
40
+ //元のオブジェクトをキャッシュ
41
+ GameObject obj;
42
+
43
+ //オブジェクトをキャッシュする配列
44
+ public List<GameObject> cacheObj = new List<GameObject>();
45
+
46
+ //初期化
47
+ public static poolObj Initarize(GameObject obj)
48
+ {
49
+ var go = new GameObject("objPool");
50
+ var s = go.AddComponent<poolObj>();
51
+ s.setUp(obj);
52
+ return s;
53
+ }
54
+
55
+ //インスタンスのセットアップ
56
+ void setUp(GameObject obj)
57
+ {
58
+ this.obj = obj;
59
+ }
60
+
61
+ //オブジェクトを生成 外部から呼ばれる関数
62
+ public GameObject Create(Vector3 pos)
63
+ {
64
+ //キャッシュ中のオブジェクトで使用していないものがあればそこから使う
65
+ if(cacheObj != null && cacheObj.Count > 0)
66
+ {
67
+ //表示されてないオブジェクトを取得
68
+ var hasObj = cacheObj.FirstOrDefault(x => !x.activeInHierarchy);
69
+ //表示されていないオブジェクトがあれば返す
70
+ if(hasObj != null)
71
+ {
72
+ hasObj.transform.position = pos;
73
+ return hasObj;
74
+ }
75
+ }
76
+
77
+ var go = Instantiate(obj, pos, Quaternion.identity) as GameObject;
78
+
79
+ return go;
80
+ }
81
+ }
82
+ ```
83
+
84
+ **[利用側]**
85
+
86
+ ```C#
87
+ using UnityEngine;
88
+
89
+ public class effector : MonoBehaviour
90
+ {
91
+ //プールをキャッシュ
92
+ poolObj pool;
93
+
94
+ void Start()
95
+ {
96
+ //プールの初期化
97
+ var prefab = Resources.Load<GameObject>("prefab名");
98
+ pool = poolObj.Initarize(prefab);
99
+
100
+ //オブジェクトを生成
101
+ var obj = pool.Create(Vector3.zero);
102
+ //オブジェクトを消す ※DestroyではなくSetActiveを使う
103
+ obj.SetActive(false);
104
+ }
105
+ }
17
106
  ```