質問: ### 前提・実現したいこと Unity5.0.2fを使用し マウスクリックや特定オブジェクトの消滅など、 さまざまなアクションをトリガーに、スプライトを使用した アニメーションによるエフェクトを発生させたいと考えております。 あらかじめシーンに大量のスプライトを配置するのは効率が悪いため、 エフェクトを発生させるタイミングでアセット内のスプライトを スクリプトで動的に作成したいのですが方法がわかりません。 お手数をおかけしますが、どなたかご教授お願いいたします。 ### 試したこと [https://blog.yagasuri.com/rakugaki/archives/905.html] こちらを参考に実装してみようとしたのですが、そもそも自分の環境に当てはめる場合、 どこを変更すればいいのか検討がつきませんでした。
回答: ### Resources.Loadを使うといいと思います。 **[下準備]** 1. エフェクトをprefab化 2. Resourcesという名前のフォルダをどこでもいいので作成 3. Resourcesフォルダの中にprefab化したオブジェクトを入れる 4. スクリプトからResources.Load("prefab名")で読み出し **[参考スクリプト]** ``` //読み出し var go = Resources.Load("prefab名"); //画面に配置 Instantiate(go,Vector3.zero,Quaternion.identity); ``` ### Instantiateで読み出したprefabのスクリプトを利用したい場合 どういったエフェクトか分かりませんが、エフェクトにスクリプトをアタッチしてそのスクリプトからアニメーション処理を読み出したいなどあるかもしれませんので追記しておきます。 ``` var prefab = Resources.Load("prefab名"); var go = Instantiate(prefab,Vector3.zero,Quaternion.identity) as GameObject; var script = go.GetComponent(); script.startAnime(); ``` ### (おまけ)InstantiateもDestroyも高コストなのでオブジェクトプールを利用されるといいと思います。 InstantiateもDestroyも高コストなので生成したオブジェクトを非表示にして消さずに保持しておくオブジェクトプールという方法を紹介します。コードを短くするため機能を省略したので使い勝手は悪いと思いますが参考にごらんください。コードは未検証です。 **[オブジェクトプール]** ``` using System.Collections.Generic; using UnityEngine; using System.Linq; public class poolObj : MonoBehaviour { //元のオブジェクトをキャッシュ GameObject obj; //オブジェクトをキャッシュする配列 public List cacheObj = new List(); //初期化 public static poolObj Initarize(GameObject obj) { var go = new GameObject("objPool"); var s = go.AddComponent(); s.setUp(obj); return s; } //インスタンスのセットアップ void setUp(GameObject obj) { this.obj = obj; } //オブジェクトを生成 外部から呼ばれる関数 public GameObject Create(Vector3 pos) { //キャッシュ中のオブジェクトで使用していないものがあればそこから使う if(cacheObj != null && cacheObj.Count > 0) { //表示されてないオブジェクトを取得 var hasObj = cacheObj.FirstOrDefault(x => !x.activeInHierarchy); //表示されていないオブジェクトがあれば返す if(hasObj != null) { hasObj.transform.position = pos; hasObj.SetActive(true); return hasObj; } } var go = Instantiate(obj, pos, Quaternion.identity) as GameObject; return go; } } ``` **[利用側]** ``` using UnityEngine; public class effector : MonoBehaviour { //プールをキャッシュ poolObj pool; void Start() { //プールの初期化 var prefab = Resources.Load("prefab名"); pool = poolObj.Initarize(prefab); //オブジェクトを生成 var obj = pool.Create(Vector3.zero); //オブジェクトを消す ※DestroyではなくSetActiveを使う obj.SetActive(false); } } ```