質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

1回答

3013閲覧

スクリプトを使用しスプライトをアセットから呼び出し配置する方法

nama_uni

総合スコア8

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2017/09/20 09:41

編集2017/09/20 10:38

###前提・実現したいこと
Unity5.0.2fを使用し
マウスクリックや特定オブジェクトの消滅など、
さまざまなアクションをトリガーに、スプライトを使用した
アニメーションによるエフェクトを発生させたいと考えております。

あらかじめシーンに大量のスプライトを配置するのは効率が悪いため、
エフェクトを発生させるタイミングでアセット内のスプライトを
スクリプトで動的に作成したいのですが方法がわかりません。

お手数をおかけしますが、どなたかご教授お願いいたします。

###試したこと
[https://blog.yagasuri.com/rakugaki/archives/905.html]
こちらを参考に実装してみようとしたのですが、そもそも自分の環境に当てはめる場合、
どこを変更すればいいのか検討がつきませんでした。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

###Resources.Loadを使うといいと思います。

[下準備]

  1. エフェクトをprefab化
  2. Resourcesという名前のフォルダをどこでもいいので作成
  3. Resourcesフォルダの中にprefab化したオブジェクトを入れる
  4. スクリプトから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
IShix

総合スコア1724

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問