###前提・実現したいこと
Unity5.0.2fを使用し
マウスクリックや特定オブジェクトの消滅など、
さまざまなアクションをトリガーに、スプライトを使用した
アニメーションによるエフェクトを発生させたいと考えております。
あらかじめシーンに大量のスプライトを配置するのは効率が悪いため、
エフェクトを発生させるタイミングでアセット内のスプライトを
スクリプトで動的に作成したいのですが方法がわかりません。
お手数をおかけしますが、どなたかご教授お願いいたします。
###試したこと
[https://blog.yagasuri.com/rakugaki/archives/905.html]
こちらを参考に実装してみようとしたのですが、そもそも自分の環境に当てはめる場合、
どこを変更すればいいのか検討がつきませんでした。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答1件
0
ベストアンサー
###Resources.Loadを使うといいと思います。
[下準備]
- エフェクトをprefab化
- Resourcesという名前のフォルダをどこでもいいので作成
- Resourcesフォルダの中にprefab化したオブジェクトを入れる
- スクリプトからResources.Load<GameObject>("prefab名")で読み出し
[参考スクリプト]
C#
1//読み出し 2var go = Resources.Load<GameObject>("prefab名"); 3//画面に配置 4Instantiate(go,Vector3.zero,Quaternion.identity);
###Instantiateで読み出したprefabのスクリプトを利用したい場合
どういったエフェクトか分かりませんが、エフェクトにスクリプトをアタッチしてそのスクリプトからアニメーション処理を読み出したいなどあるかもしれませんので追記しておきます。
C#
1var prefab = Resources.Load<GameObject>("prefab名"); 2var go = Instantiate(prefab,Vector3.zero,Quaternion.identity) as GameObject; 3 4var script = go.GetComponent<MyEffectScript>(); 5script.startAnime();
###(おまけ)InstantiateもDestroyも高コストなのでオブジェクトプールを利用されるといいと思います。
InstantiateもDestroyも高コストなので生成したオブジェクトを非表示にして消さずに保持しておくオブジェクトプールという方法を紹介します。コードを短くするため機能を省略したので使い勝手は悪いと思いますが参考にごらんください。コードは未検証です。
[オブジェクトプール]
C#
1using System.Collections.Generic; 2using UnityEngine; 3using System.Linq; 4 5public class poolObj : MonoBehaviour 6{ 7 //元のオブジェクトをキャッシュ 8 GameObject obj; 9 10 //オブジェクトをキャッシュする配列 11 public List<GameObject> cacheObj = new List<GameObject>(); 12 13 //初期化 14 public static poolObj Initarize(GameObject obj) 15 { 16 var go = new GameObject("objPool"); 17 var s = go.AddComponent<poolObj>(); 18 s.setUp(obj); 19 return s; 20 } 21 22 //インスタンスのセットアップ 23 void setUp(GameObject obj) 24 { 25 this.obj = obj; 26 } 27 28 //オブジェクトを生成 外部から呼ばれる関数 29 public GameObject Create(Vector3 pos) 30 { 31 //キャッシュ中のオブジェクトで使用していないものがあればそこから使う 32 if(cacheObj != null && cacheObj.Count > 0) 33 { 34 //表示されてないオブジェクトを取得 35 var hasObj = cacheObj.FirstOrDefault(x => !x.activeInHierarchy); 36 //表示されていないオブジェクトがあれば返す 37 if(hasObj != null) 38 { 39 hasObj.transform.position = pos; 40 hasObj.SetActive(true); 41 return hasObj; 42 } 43 } 44 45 var go = Instantiate(obj, pos, Quaternion.identity) as GameObject; 46 47 return go; 48 } 49}
[利用側]
C#
1using UnityEngine; 2 3public class effector : MonoBehaviour 4{ 5 //プールをキャッシュ 6 poolObj pool; 7 8 void Start() 9 { 10 //プールの初期化 11 var prefab = Resources.Load<GameObject>("prefab名"); 12 pool = poolObj.Initarize(prefab); 13 14 //オブジェクトを生成 15 var obj = pool.Create(Vector3.zero); 16 //オブジェクトを消す ※DestroyではなくSetActiveを使う 17 obj.SetActive(false); 18 } 19}
投稿2017/09/20 11:47
編集2017/09/21 04:23総合スコア1724
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。