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

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

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

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

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

0回答

337閲覧

ObjectPoolを使ってInvokeしたGameObjectがコルーチン中のfor文で連続生成できない

退会済みユーザー

退会済みユーザー

総合スコア0

C#

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

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2017/09/17 07:47

###前提・実現したいこと
unityのHPに掲載されているObjectPoolのコードを使って敵機を生成したいです。
iTween(iTween.Pathを使ってます)を使って動かす機体(曲線挙動)と単純に直線的に動かす機体(直線挙動)で分けます。

###発生している問題
曲線挙動の機体はコルーチン中のfor文で複数を生成することができるのですが
直線挙動の機体は一つの機体を作った後、その機体が消えるまで次の行程に移動してくれません。
上記2種類の機体を同時に生成しようとすると、両方とも1機ずつ作成し、直線挙動の機体を消すと、両方とも次の行程に移ります。
###該当のソースコード

  • Waveを管理するスクリプト

c#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class Wave : MonoBehaviour { 6 public struct DENEMY //作成する敵機の特徴 7 { 8 public GameObject Module;//見た目 9 public string Line;//使う線 10 public iTween.EaseType ease;//動かし方 11 public int tamaNum;//敵が撃つ弾の数 12 public float time;//iTweenのtime 13 public float shottiming;//どれくらいのタイミングで撃ち始めるか 14 public DENEMY(GameObject module,string line,iTween.EaseType Ease,int TamaNum,float TIME,float Shottiming) 15 { 16 Module = module; 17 Line = line; 18 ease = Ease; 19 tamaNum = TamaNum; 20 time = TIME; 21 shottiming = Shottiming; 22 } 23 } 24 public GameObject[] mod; 25 public string[] lin; 26 public iTween.EaseType[] eas; 27 public int[] tam; 28 public float[] sho, tim; 29 List<DENEMY> enemy=new List<DENEMY>(); // Use this for initialization 30 IEnumerator Start () { 31 for(int i = 0; i < mod.Length; i++) 32 { 33 enemy.Add(new DENEMY(mod[i], lin[i], eas[i], tam[i], tim[i], sho[i]));//publicで入力した物を入れる。 34 35 } 36 StartCoroutine(Wave0()); 37 yield return StartCoroutine(Wave1()); 38 yield return new WaitForSeconds(2f); 39 yield return StartCoroutine(Wave2()); 40 yield return new WaitForSeconds(2f); 41 yield return StartCoroutine(Wave3()); 42 43 } 44 45 // Update is called once per frame 46 void Update () { 47 48 } 49 IEnumerator Wave0()//問題のコルーチン 50 { 51 for (int i = 0; i < 5; i++) 52 { 53 GameObject a = ObjectPool.instance.GetGameObject(enemy[0].Module, new Vector2(i * 2 - 4, 5), Quaternion.Euler(180, 0, 0)); 54 a.GetComponent<DEnemy>().useline = false;//iTweenを使わない設定にする。 55 a.GetComponent<Rigidbody2D>().velocity = -transform.up;//直線的に動かす 56 yield return new WaitForSeconds(0.5f);//ちょっと待つ 57 } 58 } 59 IEnumerator Wave1() 60 { 61 62 for (int i = 0; i < 4; i++) 63 { 64 Go(enemy[0], new Vector2(-5, 5)); 65 yield return new WaitForSeconds(0.5f); 66 Go(enemy[1], new Vector2(5, 5)); 67 yield return new WaitForSeconds(0.5f); 68 } 69 } 70 IEnumerator Wave2() 71 { 72 Go(enemy[2], new Vector2(5, 4.5f)); 73 Go(enemy[3], new Vector2(-5, 4.5f)); 74 yield return new WaitForSeconds(1f); 75 } 76 IEnumerator Wave3() 77 { 78 for (int i=0;i<3;i++) { 79 Go(enemy[4],new Vector2(3, 5)); 80 Go(enemy[5], new Vector2(-3, 5)); 81 yield return new WaitForSeconds(1f); 82 Go(enemy[6], new Vector2(5, 4.5f)); 83 Go(enemy[7], new Vector2(-5, 4.5f)); 84 } 85 } 86 void Go(DENEMY ene,Vector2 start) 87 { 88 GameObject a = ObjectPool.instance.GetGameObject(ene.Module, start, Quaternion.Euler(180, 0, 0)); 89 a.SetActive(false); 90 a.GetComponent<DEnemy>().Line=ene.Line; 91 a.GetComponent<DEnemy>().ease=ene.ease; 92 a.GetComponent<DEnemy>().time=ene.time; 93 a.GetComponent<DEnemy>().tamaNum=ene.tamaNum; 94 a.GetComponent<DEnemy>().shottiming = ene.shottiming; 95 a.SetActive(true); 96 } 97}
  • ObjectPool

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class ObjectPool : MonoBehaviour { 6 private static ObjectPool _instance; 7 8 //シングルトン 9 public static ObjectPool instance 10 { 11 get 12 { 13 if (_instance == null) 14 { 15 //シーン上から取得する 16 _instance = FindObjectOfType<ObjectPool>(); 17 18 if (_instance == null) 19 { 20 //ゲームオブジェクトを作成しObjectPoolオブジェクトコンポーネントを追加する。 21 _instance = new GameObject("ObjectPool").AddComponent<ObjectPool>(); 22 } 23 } 24 return _instance; 25 } 26 } 27 //ゲームオブジェクトのDictionary 28 private Dictionary<int, List<GameObject>> pooledGameObjects = new Dictionary<int, List<GameObject>>(); 29 30 //ゲームオブジェクトをpooledGameObjectsから取得する。必要であれば新たに生成する。 31 public GameObject GetGameObject(GameObject prefab, Vector2 position, Quaternion rotation) 32 { 33 //プレハブのインスタンスIDを取得する。 34 int key = prefab.GetInstanceID(); 35 36 //Dictionaryにkeyが存在しなければ作成する。 37 if (pooledGameObjects.ContainsKey(key) == false) 38 { 39 pooledGameObjects.Add(key, new List<GameObject>()); 40 } 41 List<GameObject> gameObjects = pooledGameObjects[key]; 42 43 GameObject go = null; 44 45 for(int i = 0; i < gameObjects.Count; i++) 46 { 47 go = gameObjects[i]; 48 49 //現在非アクティブ(未使用)であれば 50 if (go.activeInHierarchy == false) 51 { 52 //位置を設定する 53 go.transform.position = position; 54 55 //角度を設定する 56 go.transform.rotation = rotation; 57 58 //これから使用するのでアクティブにする 59 go.SetActive(true); 60 61 return go; 62 } 63 } 64 //使用できる物がないので新たに作成する 65 go = (GameObject)Instantiate(prefab, position, rotation); 66 67 //ObujectPoolの子要素にする 68 go.transform.parent = transform; 69 70 //リストに追加 71 gameObjects.Add(go); 72 73 return go; 74 } 75 //ゲームオブジェクトを非アクティブにする。これで再利用可能。 76 public void ReleaseGameObject(GameObject go) 77 { 78 go.SetActive(false); 79 } 80 // Use this for initialization 81 void Start () { 82 83 } 84 85 // Update is called once per frame 86 void Update () { 87 88 } 89}

###試したこと
GameObjectのaをListにしたり、配列にしてみたりしましたがダメでした。

###補足情報(言語/FW/ツール等のバージョンなど)
ObjectPool掲載ページ

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問