前提・実現したいこと
現在UnityにてSTGを制作しております。(公式チュートリアルの物を改造しております)
画像の通り、
(1)敵が下りてくる
(2)弾を打つ
(3)弾を打つのを止める
(4)画面外に戻っていく
という動きを、12体に割り当てています。
発生している問題・エラーメッセージ
しかし、何故か1体目だけが弾を打ってくれません…。 更に不思議なことに、降りてくるタイミングを0.5秒差ずつに設定しておりますが、1秒にすると、打ってくれます。 2日程コードと睨み合っていますが、詰まっています…。
該当のソースコード
C#
1//public class Departure : MonoBehaviour 2IEnumerator Start() 3 { 4 // Enemy_3コンポーネントをシーン内から探して取得する 5 enemy_3 = FindObjectOfType<Enemy_3>(); 6 7 //配列の1番目から順番に、到達点に移動させる 8 for (int i = 0; i < enemys.Length; i++) 9 { 10 //スタート位置を記憶させる 11 startPoint[i] = enemys[i].transform.position; 12 //引数1動かす敵:引数2到達点:引数3行きか帰りか:を指定して、シーケンスを実行 13 enemy_3.AttackSequence(enemys[i], arrivalPointObj[i].transform.position, go); 14 // 0.5秒待ってから次の敵が移動 15 yield return new WaitForSeconds(0.5f); 16 } 17 18 19 //スタート位置に戻らせる 20 for (int j = 0; j < enemys.Length; j++) 21 { 22 go = false;//帰り 23 //引数1動かす敵:引数2到達点:引数3行きか帰りか:を指定して、シーケンスを実行 24 enemy_3.AttackSequence(enemys[j], startPoint[j], go); 25 // 0.5秒待ってから次の敵が移動 26 yield return new WaitForSeconds(0.5f); 27 } 28 }
C#
1//public class Enemy_3 : MonoBehaviour 2public Sequence AttackSequence(GameObject eN,Vector3 aP, bool Go) 3 { 4 //ここでオブジェクトを指定しないと、何故か配列の最後のオブジェクトが参照されてしまう 5 Transform eNtransform = eN.transform; 6 //子オブジェクト(ShotDirection)を取得 7 GameObject ob = eNtransform.Find("ShotDirection").gameObject; 8 //enemysの配列[i]番目のenemyの子の、ShotDirectionのコンポーネントShotScriptを取得して変数に格納する 9 shotScript = ob.GetComponent<ShotScript>(); 10 11 if(Go == false) 12 { 13 //帰る時打たせなくする 14 shotScript.canShot = false; 15 } 16 17 Sequence seq = DOTween.Sequence(); 18 //DOTweenで到達点まで移動 19 seq.Append(eN.transform.DOMove(aP, 1f).SetEase(Ease.OutCubic)).OnComplete(() => 20 { 21 if (Go == true) 22 { 23 //移動し終わったら、打ち始める 24 shotScript.canShot = true; 25 } 26 }); 27 28 return seq; 29 }
C#
1//public class ShotScript : MonoBehaviour 2 // 弾のPrefab 3 public GameObject bullet; 4 // 弾を撃つ間隔 5 public float shotDelay; 6 // 弾を撃つかどうか 7 public bool canShot; 8 //Update()関数で毎フレーム実行されるのを防ぐため 9 bool isKeepShot = false; 10 11 private void Update() 12 { 13 if (canShot == true && isKeepShot == false) 14 { 15 StartCoroutine("KeepShot"); 16 //実行を一度だけにする用 17 isKeepShot = true; 18 } 19 } 20 21 // Start is called before the first frame update 22 IEnumerator KeepShot() 23 { 24 GameObject Player = GameObject.Find("Player(Clone)"); 25 Vector3 myTransform = transform.position; 26 27 // canShotがfalseの場合、ここでコルーチンを終了させる 28 if (canShot == false) 29 { 30 yield break; 31 } 32 33 //Playerが死ぬか、停止命令まで繰り返す 34 while (Player != null || canShot != false) 35 { 36 37 // 子要素を全て取得する 38 for (int i = 0; i < transform.childCount; i++) 39 { 40 /////////ホーミング角度計算コード/////// 41 Transform shotPosition = transform.GetChild(i); 42 float aim = GetAim(this.transform.position, Player.transform.position); 43 aim += 90; 44 this.transform.rotation = Quaternion.Euler(0.0f, 0.0f, aim); 45 //////////////////////////////////////// 46 //打つ 47 Shot(shotPosition); 48 } 49 // shotDelay秒待つ 50 yield return new WaitForSeconds(shotDelay); 51 } 52 }
補足情報(FW/ツールのバージョンなど)
【司令塔】---動け---→【敵】---打て/打つな--→【弾】
という構造のつもりです。
わかりづらくてすみません…。
弾のコードは不要かもしれませんが、コルーチンも怪しいので一応載せました。
回答1件
あなたの回答
tips
プレビュー