/// <summary> /// Enemyの生成 /// </summary> private void Create() { //生成したenemyをしまう親オブジェクトを設定 enemyParent = new GameObject("Enemys").transform; rowAliveEnemyNum = rowAliveEnemyNum.Select(i => enemyWidthNum).ToArray(); //全要素にenemyの1行に設置する数を代入する //全ての列のidをListに追加 for (int i = 0; i < enemyWidthNum; i++) { columnEnemyAliveCash.Add(i); } //行ごとにContollerを作成 enemyRows = new EnemyRowController[enemyHeightNum]; for (int i = 0; i < enemyHeightNum; i++) { //行に関するControllerの作成 int lineNumber = i + 1; string rowControllerPrefabName = "Enemy" + lineNumber + "RowController"; GameObject column = new GameObject(rowControllerPrefabName); //行のControllerとなるオブジェクトを生成 EnemyRowController controller = column.AddComponent <EnemyRowController>(); enemyRows[i] = controller; column.transform.parent = transform; //列に対して与える情報を設定 EnemyRowCreateInfo rowInfo = new EnemyRowCreateInfo(); rowInfo.rowId = i; rowInfo.rowInfo = FindEnemyInfo(i); rowInfo.enemyHeightNum = enemyHeightNum; rowInfo.enemyWidthNum = enemyWidthNum; rowInfo.startUpStageId = stageNum - 1; //TODO ステージ数によって変化させる rowInfo.enemyWidthInterval = enemyWidthInterval; rowInfo.stageNum = stageNum; rowInfo.enemyMinPos = new Vector3(minPos.x, minPos.y + enemyBottomPosYDiff, 0); rowInfo.enemyMaxPos = new Vector3(maxPos.x, maxPos.y - enemyTopPosYDiff, 0); controller.Create(rowInfo, enemyParent, onAddScore, (id) => { rowAliveEnemyNum[id]--; if (rowAliveEnemyNum.Sum() == 0) //敵が全員死んだ時 { onDeathAll(); } if (rowAliveEnemyNum[id] == 0) //idの行のEnemyが全滅した時 { // TODO } }); } }
/// <summary> /// 行に対してのEnemy作成 /// </summary> public void Create(EnemyRowCreateInfo rowInfo, Transform enemyCrowdParent, UnityAction <int> _onAddScore, UnityAction <int> _onDeath) { this.rowInfo = rowInfo; int enemyWidthNum = rowInfo.enemyWidthNum; //親となる空オブジェクトを生成し、その中にこの後生成するenemyオブジェクトを入れていく Transform enemyRowParent = new GameObject("Enemys" + rowInfo.rowId + "Rows").transform; enemyRowParent.parent = enemyCrowdParent; // 前に移動する際の移動量 float verticalDiff = (rowInfo.enemyMaxPos.y - rowInfo.enemyMinPos.y) / (rowInfo.stageNum - 1); enemy = new GameObject[enemyWidthNum]; //メモリの確保 //enemyの生成 for (int i = 0; i < enemyWidthNum; i++) { // enemyの生成・登録 GameObject obj = Instantiate(rowInfo.rowInfo.Prefab); enemy[i] = obj; //親オブジェクトに登録していく obj.transform.parent = enemyRowParent; int upperNumber = rowInfo.enemyHeightNum - rowInfo.rowId - 1; //Enemy全体で上から数えて何番目の行か(一番上の行は0) int stageNumber = rowInfo.startUpStageId - 2 * upperNumber; //前から何行目か Vector3 enemyPos = new Vector3(rowInfo.enemyMinPos.x + rowInfo.enemyWidthInterval * i, rowInfo.enemyMinPos.y + stageNumber * verticalDiff, 0); //位置の確定 obj.transform.position = enemyPos; EnemyController controller = obj.GetComponent <EnemyController>(); controller.BootUp(i, rowInfo.rowInfo.Point, _onAddScore, () => { _onDeath(rowInfo.rowId); }, rowInfo.enemyWidthInterval / moveNextEnemyActionNum, verticalDiff, rowInfo.enemyMinPos, rowInfo.enemyMaxPos); } }