¡¡currentStageNo ÊÑ¿ô¤ò GameData ¥¯¥é¥¹¤Ø°ÜÆ°¤·¤Þ¤·¤¿¤Î¤Ç¡¢¤³¤ÎÊÑ¿ô¤Ï¥³¥á¥ó¥È¥¢¥¦¥È¤·¤Þ¤¹¡£
¤½¤ì¤Ë¹ç¤ï¤»¤Æ¡¢InitStage¥á¥½¥Ã¥ÉÆâ¤Î¤³¤ÎÊÑ¿ô¤òÍøÍѤ·¤Æ¤¤¤¿Éôʬ¤ò GameData ¥¯¥é¥¹¤ò»²¾È¤¹¤ë½ñ¼°
(currentStageNo => GameData.instance.currentStageNo)¤ËÊѹ¹¤·¤Þ¤¹¡£
¡¡GameData¥¯¥é¥¹¤Ï¥·¡¼¥óÁ«°Ü¤·¤Æ¤âÇË´þ¤µ¤ì¤Ê¤¤¥ª¥Ö¥¸¥§¥¯¥È¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¤Î¤Ç¡¢¥¯¥ê¥¢¤·¤Æ¤¤¤ë¥¹¥Æ¡¼¥¸¤ÎÈֹ椬ÊÝ»ý¤µ¤ì¤Æ¤¤¤Þ¤¹¡£
¤³¤ÎÃͤò»²¾È¤¹¤ë¤³¤È¤Ë¤è¤Ã¤Æ¡¢¥¹¥Æ¡¼¥¸¥¯¥ê¥¢¸å¤Ë¤¤¤º¤ì¤Î¥·¡¼¥ó¤ËÁ«°Ü¤·¤Æ¤¤¤Æ¤â¡¢¼¡¤ËÍÑ°Õ¤¹¤ë¥¹¥Æ¡¼¥¸¤ÎÈÖ¹æ¤ò»²¾È¤·¤Æ¥²¡¼¥à¤ò¿Ê¹Ô¤¹¤ë¤³¤È¤¬²Äǽ¤Ë¤Ê¤ê¤Þ¤¹¡£¡¡
¡¡¥¹¥Æ¡¼¥¸¥¯¥ê¥¢´ØÏ¢¤Î½èÍý¤È¤·¤Æ¡¢¿·¤·¤¯¥á¥½¥Ã¥É¤ò£³¤ÄÄɲ䷤Ƥ¤¤Þ¤¹¡£¥¹¥Æ¡¼¥¸¤Î¥¯¥ê¥¢È½Äê¤ò¹Ô¤¦¥á¥½¥Ã¥É¤ä¡¢
¥¹¥Æ¡¼¥¸¤ÎÁ«°Ü¡¢Ê̤Υ·¡¼¥ó¤Ø¤ÎÁ«°Ü¤Ê¤É¤Î½èÍý¤òÄɲ乤ë¥á¥½¥Ã¥É¤Ë¤Ê¤ê¤Þ¤¹¡£
¡¡Update¥á¥½¥Ã¥É¤Î½èÍý¤ò½¤Àµ¤·¤Æ¡¢¤³¤ì¤é¤ÎÄɲä·¤¿¥á¥½¥Ã¥É¤ò¼Â¹Ô¤·¤Æ¥¹¥Æ¡¼¥¸¥¯¥ê¥¢¤ÎȽÄê¤ä¥²¡¼¥à¥¯¥ê¥¢¤Î½èÍý¤Ë¡¢½èÍý¤ò¤Ä¤Ê¤²¤Æ¤¤¤¤Þ¤¹¡£
GameManager.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class GameManager : MonoBehaviour
{
public StageList stageList; // ¥¹¥¯¥ê¥×¥¿¥Ö¥ë¡¦¥ª¥Ö¥¸¥§¥¯¥È¤òÅÐÏ¿
public int areaIndex; // ¸½ºß¤Î¥¨¥ê¥¢¿ô¡£Å¨¤ò¤¹¤Ù¤ÆÅݤ¹¤È¥«¥¦¥ó¥È¥¢¥Ã¥×
//public int currentStageNo; // ¸½ºß¤Î¥¹¥Æ¡¼¥¸¿ô¡£¥Ü¥¹¤òÅݤ·¤Æ¥¯¥ê¥¢¤¹¤ë¤ÈÁý¤¨¤ë¡£GameData¤Ë´ÉÍý¤µ¤»¤ë¡¡¡¡¡¡<=¡¡¡ù¡¡GameData¥¯¥é¥¹¤Ë´ÉÍý¤µ¤»¤¿¤Î¤Ç»ÈÍѤ·¤Ê¤¤¡£¥³¥á¥ó¥È¥¢¥¦¥È¡¡
public PlayerController playerController;
public float leftLimitPos; // ¸½ºß¤Î¥¨¥ê¥¢¤Î°ÜÆ°À©¸Â¤Î³ÆÃÍ(³ÎǧÍÑ¡£ÉÔÍפˤʤ俤éºï½ü¤¹¤ë)
public float rightLimitPos;
public float forwordLimitPos;
public float backLimitPos;
public StageList.StageData currentStageData; // ¸½ºß¤Î¥¹¥Æ¡¼¥¸¤Î¥Ç¡¼¥¿
public int generateCount; // ¥¨¥ê¥¢Æâ¤ÇÀ¸À®¤·¤¿Å¨¤Î¿ô¤Î¹ç·×ÃÍ
public float generateTimer; // Ũ¤òÀ¸À®¤¹¤ë¤Þ¤Ç¤Î»þ´Ö¥«¥¦¥ó¥ÈÍÑ
public int appearTime; // Ũ¤òÀ¸À®¤¹¤ë¤Þ¤Ç¤ÎÂÔµ¡»þ´Ö
// À¸À®¤·¤¿Å¨¤òÆþ¤ì¤ë¥ê¥¹¥È
public List<Enemy> enemyList = new List<Enemy>();
// ¤³¤Î¥¨¥ê¥¢Æâ¤ÎÅݤ·¤¿Å¨¤Î¿ô
public int destroyCount;
// ¥¨¥ê¥¢Æâ¤ÎŨ¤ÎÀ¸À®¤¬¤¹¤Ù¤Æ½ªÎ»¤·¤Æ¤¤¤ë¤«³Îǧ¤¹¤ë¤¿¤á¤ÎÊÑ¿ô¡£ true ¤Ê¤éÀ¸À®´°Î»
public bool isCompleteGenerate;
// À¸À®¤¹¤ëŨ¤Î¥×¥ì¥Õ¥¡¥Ö
public List<Enemy> enemyPrefabs = new List<Enemy>();
public enum GameState {
Play,¡¡¡¡// ¥²¡¼¥à¿Ê¹ÔÃæ
Wait, // Update¥á¥½¥Ã¥É¤ò°ì»þŪ¤Ë»ß¤á¤ë
Move, // ¥¨¥ê¥¢¥¯¥ê¥¢¡¢¼¡¤Î¥¨¥ê¥¢¤Ø¤Î°ÜÆ°Ãæ
}
public GameState gameState = GameState.Wait;
void Start() {
// ¥¹¥Æ¡¼¥¸¤ÎÈÖ¹æ¤ò¼èÆÀ¤·¤Æ¥¹¥Æ¡¼¥¸¤Î½àÈ÷¤ò¹Ô¤¦
InitStage();
// ¥¨¥ê¥¢Èֹ椫¤é¥¨¥ê¥¢¤Î¾ðÊó¤ò¼èÆÀ¤·¤Æ¥¨¥ê¥¢¤Î½àÈ÷¤ò¹Ô¤¦
SetUpNextArea();
}
/// <summary>
/// ¥¹¥Æ¡¼¥¸¤ÎÈÖ¹æ¤ò¼èÆÀ¤·¤Æ¥¹¥Æ¡¼¥¸¤Î½àÈ÷¤ò¹Ô¤¦
/// </summary>
private void InitStage() {
// gameState ¤òWait¤ËÀßÄꤷ¤ÆUpdate¥á¥½¥Ã¥É¤ò»ß¤á¤Æ¤ª¤¯
gameState = GameState.Wait;
Debug.Log(gameState);
////* ¤³¤³¤«¤é½¤Àµ *////
// TODO GameData¤«¤é¥¹¥Æ¡¼¥¸ÈÖ¹æ¤ò¥»¥Ã¥È¡£¸½ºß¤Ï¥¹¥Æ¡¼¥¸£±¤È¤·¤Æ¤ª¤¯
//currentStageNo = 0; <= ¡ù¡¡GameData¥¯¥é¥¹¤«¤é¸½ºß¤Î¥¹¥Æ¡¼¥¸ÈÖ¹æ¤ò»²¾È¤¹¤ë¤è¤¦¤Ë¤Ê¤Ã¤¿¤Î¤Ç¥³¥á¥ó¥È¥¢¥¦¥È¤¹¤ë
// ¥¹¥Æ¡¼¥¸Èֹ椫¤é¡¢¤É¤Î¥¹¥Æ¡¼¥¸¤«¤ò¸¡º÷¤·¤ÆStageData¤ò¼èÆÀ¡¡¡¤«¢¤Î¤É¤Á¤é¤«¤ò»È¤¦¡£
// ¡Find¥á¥½¥Ã¥É¡¡
currentStageData = stageList.stageDatas.Find(x => x.stageNo == GameData.instance.currentStageNo); // <= ¡ù¡¡currentStageNo ÊÑ¿ô¤Ï GameData¥¯¥é¥¹¤Ë°Ü¹Ô¤µ¤»¤ë¤Î¤Ç¡¢°ú¿ô¤ò½ñ¤´¹¤¨¤ë
// ¢foreach
//foreach (StageList.StageData stageData in stageList.stageDatas) {
// if (stage.stageNo == GameData.instance.currentStageNo) { // <= ¡ù¡¡currentStageNo ÊÑ¿ô¤Ï GameData¥¯¥é¥¹¤Ë°Ü¹Ô¤µ¤»¤ë¤Î¤Ç¡¢°ú¿ô¤ò½ñ¤´¹¤¨¤ë
// currentStageData = stageData;
// }
//}
////* ¤³¤³¤Þ¤Ç *////
// ¥¨¥ê¥¢¤ÎÈÖ¹æ¤ò¥»¥Ã¥È
areaIndex = 0;
}
/// <summary>
/// ¥¨¥ê¥¢Èֹ椫¤é¥¨¥ê¥¢¤Î¾ðÊó¤ò¼èÆÀ¤·¤Æ¥»¥Ã¥È
/// </summary>
private void SetUpNextArea() {
// °ÜÆ°ÈÏ°ÏÀ©¸Â
leftLimitPos = currentStageData.areaDatas[areaIndex].areaMoveLimit.horizontalLimit.left;
rightLimitPos = currentStageData.areaDatas[areaIndex].areaMoveLimit.horizontalLimit.right;
forwordLimitPos = currentStageData.areaDatas[areaIndex].areaMoveLimit.depthLimit.forword;
backLimitPos = currentStageData.areaDatas[areaIndex].areaMoveLimit.depthLimit.back;
// Ũ¤ÎÀ¸À®¿ô¤ò½é´ü²½
generateCount = 0;
// Ũ¤ÎƤȲ¿ô¤ò½é´ü²½
¡¡¡¡¡¡¡¡destroyCount = 0;
// Ũ¤Î¥ê¥¹¥È¤ò¥ê¥»¥Ã¥È(¶õ¤Ë¤¹¤ë)
enemyList.Clear();
// ¥¨¥ê¥¢¤ÎŨ¤ò¤¹¤Ù¤ÆÀ¸À®¤·¤Æ¤¤¤ë¤«³ÎǧÍѤÎÊÑ¿ô¤ò½é´ü²½
isCompleteGenerate = false;
// ºÇ½é¤ËŨ¤¬½Ð¸½¤¹¤ë¤Þ¤Ç¤Î»þ´Ö¤òÀßÄê
appearTime = Random.Range(5, 10);
// ¥²¡¼¥à¥¹¥¿¡¼¥È
gameState = GameState.Play;
Debug.Log(gameState);
}
void Update() {
if (gameState == GameState.Wait) {
return;
}
if (gameState == GameState.Move) {
// ¥¨¥ê¥¢°ÜÆ°²Äǽ¤Ê¾õÂ֤ΤȤ¤Ë¡¢¥¥ã¥é¤Î°ÌÃÖ¤¬¥¨¥ê¥¢¤Î±¦Ã¼¤òĶ¤¨¤¿¤é¼¡¤Î¥¨¥ê¥¢¤Ø°Ü¤ë
if (playerController.transform.position.x >= rightLimitPos) {
// ¼¡¤Î¥¨¥ê¥¢ÀßÄê¤Î¤¿¤á¤ËGameState¤òWait¤Ë¤·¤ÆUpdate¥á¥½¥Ã¥É¤òÆ°¤«¤Ê¤¤¤è¤¦¤Ë¤¹¤ë
gameState = GameState.Wait;
Debug.Log(gameState);
// ¥¨¥ê¥¢¤ÎÈÖ¹æ¤ò¿Ê¤á¤ë
areaIndex++;
////* ¤³¤³¤«¤éÄɲᦽ¤Àµ *////
// ¥¹¥Æ¡¼¥¸¤ò¥¯¥ê¥¢¤·¤¿¤«³Îǧ
if (CheckStageClear() == true) { // true ¤«¤É¤¦¤«È½Äê.¡£½ñ¼°¤Ï¡¢if(CheckStageClear()){¡¡¤Ç¤â¤è¤¤
// ¥¯¥ê¥¢¤·¤Æ¤¤¤ì¤Ð¡¢¼¡¤Î¥¹¥Æ¡¼¥¸¤ò¥¹¥¿¡¼¥È
StartCoroutine(NextStage());
} else {
// ¥¯¥ê¥¢¤·¤Æ¤¤¤Ê¤±¤ì¤Ð¡¢¼¡¤Î¥¨¥ê¥¢¤ò¥¹¥¿¡¼¥È
SetUpNextArea();
}
}
}
// ÍÑ°Õ¤·¤Æ¤¢¤ë¥¨¥ê¥¢¤Î¿ô¤òĶ¤¨¤¿¤é½èÍý¤·¤Ê¤¤
if (areaIndex >= currentStageData.areaDatas.Count) {
return;
}
////* ¤³¤³¤Þ¤Ç *////
¡¡¡¡¡¡¡¡// ¥¨¥ê¥¢¤´¤È¤ÎŨ¤ÎÀ¸À®¿ô¤È¸½ºß¤ÎÀ¸À®¿ô¤òÈæ¤Ù¤Æ¡¢¤¹¤Ù¤ÆÀ¸À®ºÑ¤Î¾ì¹ç¤Ë¤ÏÀ¸À®¤Î½èÍý¤ò¤·¤Ê¤¤
if (generateCount >= currentStageData.areaDatas[areaIndex].appearNum.Length) {
return;
}
¡¡¡¡¡¡¡¡// Ũ¤ÎÀ¸À®¤Þ¤Ç»þ´Ö¤ò¥«¥¦¥ó¥È¥¢¥Ã¥×
generateTimer += Time.deltaTime;
// À¸À®¤Þ¤Ç¤Î»þ´Ö¤¬ÂÔµ¡»þ´Ö¤òĶ¤¨¤¿¤é
if (generateTimer >= appearTime) {
// ¥«¥¦¥ó¥È¤ò¸µ¤ËÌᤷ¡¢¼¡¤Î¥«¥¦¥ó¥È¤ËÈ÷¤¨¤ë
generateTimer = 0;
// Ũ¤òÀ¸À®
GenerateEnemy(playerController.transform.position, generateCount);
}
}
/// <summary>
/// Ũ¤ÎÀ¸À®(¤³¤Î¥á¥½¥Ã¥É¤Ï½¤Àµ¤Ê¤·)
/// </summary>
/// <param name="charaPos"></param>
/// <param name="enemyIndex"></param>
private void GenerateEnemy(Vector3 charaPos, int enemyIndex) {
// º¸±¦¤Î¤É¤Á¤é¤ËÀ¸À®¤¹¤ë¤«¥é¥ó¥À¥à¤Ç·è¤á¤ë
int direction = Random.Range(0, 2);
charaPos.x = direction == 0 ? charaPos.x += 2.5f : charaPos.x -= 2.5f;
// ¥é¥ó¥À¥à¤Ê°ÌÃÖ¤òÀßÄê
float posX = charaPos.x;
float posZ = charaPos.z;
Vector3 generatePos = new Vector3(posX + Random.Range(-0.5f, 0.5f), charaPos.y, posZ + Random.Range(-0.5f, 0.5f));
// StageList¤ËÅÐÏ¿¤·¤¿Å¨¤Î¾ðÊó¤ò¸µ¤ËŨ¤òÀ¸À®¡£À¸À®¤¹¤ëºÝ¤ËEnemy·¿¤Î¥×¥ì¥Õ¥¡¥Ö¤ò»ÈÍѤ¹¤ë¤Î¤Ç¡¢º¸ÊÕ¤ËÍÑ°Õ¤¹¤ëÊÑ¿ô¤Î·¿¤âEnemy·¿¤È¤·¤Æ¤¤¤ë
Enemy enemy = Instantiate(enemyPrefabs[currentStageData.areaDatas[areaIndex].appearNum[enemyIndex]], generatePos, Quaternion.identity);
// Enemy·¿¤ÇÀ¸À®¤·¤ÆÊÑ¿ô¤ËÂåÆþ¤·¤Æ¤¤¤ë¤Î¤Ç¡¢¤¹¤°¤Ë¥á¥½¥Ã¥É¤Î¸Æ¤Ó½Ð¤·¤¬¤Ç¤¤ë
enemy.SetUpEnemy(this);
// À¸À®¤µ¤ì¤¿Å¨¤Î¾ðÊó¤ò Enemy ¥¯¥é¥¹Ã±°Ì¤ÇList¤ËÄɲ乤ë
enemyList.Add(enemy);
// À¸À®¿ô¤ò²Ã»»
generateCount++;
¡¡¡¡¡¡¡¡// ¥¨¥ê¥¢Æâ¤ÎŨ¤ò¤¹¤Ù¤ÆÀ¸À®¤·¤¿¤«³Îǧ
if (generateCount >= currentStageData.areaDatas[areaIndex].appearNum.Length) {
¡¡¡¡¡¡¡¡¡¡¡¡// À¸À®¤¬½ªÎ»¤·¤Æ¤¤¤ë¾ì¹ç¤Ë¤Ï¡¢À¸À®´°Î»¤È¤¹¤ë
isCompleteGenerate = true;
} else {
// Ũ¤ÎÀ¸À®¤¬½ªÎ»¤·¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ë¤Ï¡¢¼¡¤ÎŨ¤¬½Ð¸½¤¹¤ë¤Þ¤Ç¤Î»þ´Ö¤òÀßÄê
appearTime = Random.Range(5, 10);
}
}
/// <summary>
/// ƤȲ¿ô¤ò²Ã»»¤·¤ÆenemyList¤«¤éÅݤ·¤¿Å¨¤òºï½ü(¤³¤Î¥á¥½¥Ã¥É¤Ï½¤Àµ¤Ê¤·)
/// </summary>
/// <param name="enemy"></param>
public void RemoveEmenyList(Enemy enemy) {
destroyCount++;
¡¡¡¡¡¡¡¡// Åݤµ¤ì¤¿Å¨¤Î¾ðÊó¤òListÆ⤫¤éºï½ü
enemyList.Remove(enemy);
// ¥¨¥ê¥¢Æâ¤ÎŨ¤Î¾õ¶·¤ò³Îǧ
CheckAreaClear();
}
/// <summary>
/// ¥¨¥ê¥¢Æâ¤ÎŨ¤ÎÀ¸À®¾õ¶·¤ÈƤȲ¾õ¶·¤ò³Îǧ¤·¤Æ¥¨¥ê¥¢¥¯¥ê¥¢¤«¤É¤¦¤«È½Äê
/// </summary>
private void CheckAreaClear() {
// Ũ¤ÎÀ¸À®¤¬¤¹¤Ù¤Æ½ªÎ»¤·¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ë¤Ï¥¯¥ê¥¢¤Ë¤·¤Ê¤¤
if (!isCompleteGenerate) {
return;
}
// ¥¨¥ê¥¢Æâ¤ÎÀ¸À®¤·¤¿Å¨¤Î¿ô¤ÈƤȲ¤·¤¿Å¨¤Î¿ô¤¬Æ±¿ô°Ê¾å¤Ê¤é
if (destroyCount >= generateCount) {
¡¡¡¡¡¡¡¡¡¡¡¡Debug.Log("¥¨¥ê¥¢¡¡¥¯¥ê¥¢");
// ¼¡¤Î¥¨¥ê¥¢¤Ø°ÜÆ°²Äǽ¤Ë¤¹¤ë
gameState = GameState.Move;
¡¡¡¡¡¡¡¡¡¡¡¡Debug.Log(gameState);
}
}
////* ¤³¤³¤«¤é¿·¤·¤¤¥á¥½¥Ã¥É¤ò£³¤ÄÄɲà *////
/// <summary>
/// ¥¹¥Æ¡¼¥¸¤Î¥¯¥ê¥¢È½Äê
/// </summary>
private bool CheckStageClear() {
// ¥¨¥ê¥¢¤ÎÈֹ椬¥¹¥Æ¡¼¥¸¤ÎºÇ¸å¤Î¥¨¥ê¥¢¤ÎÈֹ椫¤É¤¦¤«³Îǧ¤¹¤ë
if (areaIndex >= currentStageData.areaDatas.Count) {
Debug.Log("¥¹¥Æ¡¼¥¸¡¡¥¯¥ê¥¢");
return true;
}
Debug.Log("¥¹¥Æ¡¼¥¸¡¡Ì¤¥¯¥ê¥¢¡£¼¡¤Î¥¨¥ê¥¢¤Ø");
return false;
}
/// <summary>
/// ¼¡¤Î¥¹¥Æ¡¼¥¸¤Ø°Ü¹Ô
/// </summary>
private IEnumerator NextStage() {
// ¥¹¥Æ¡¼¥¸ÈÖ¹æ¤ò¼¡¤ËÁ÷¤ë
GameData.instance.currentStageNo++;
// ¤¹¤Ù¤Æ¤Î¥¹¥Æ¡¼¥¸¤ò¥¯¥ê¥¢¤·¤¿¤«³Îǧ¤¹¤ë
if (GameData.instance.currentStageNo >= stageList.stageDatas.Count) {
// ¥²¡¼¥à¥¯¥ê¥¢
Debug.Log("¥²¡¼¥à¥¯¥ê¥¢");
} else {
// ¤¹¤Ù¤Æ¤Î¥¹¥Æ¡¼¥¸¤ò¥¯¥ê¥¢¤·¤Æ¤¤¤Ê¤±¤ì¤Ð
Debug.Log("¼¡¤Î¥¹¥Æ¡¼¥¸¤Ø");
// TODO ¥¹¥Æ¡¼¥¸¥¯¥ê¥¢¤Î±é½Ð
yield return StartCoroutine(SceneStory());
// ¼¡¤Î¥¹¥Æ¡¼¥¸¤Î¥Ç¡¼¥¿¤ò¼èÆÀ
InitStage();
// ¼¡¤Î¥¹¥Æ¡¼¥¸¤ÎºÇ½é¤Î¥¨¥ê¥¢¤òÍÑ°Õ
SetUpNextArea();
}
}
/// <summary>
/// ¥¤¥Ù¥ó¥ÈÍÑ¥¹¥È¡¼¥ê¡¼¤ò¿Ê¤á¤ë¡¢¤¢¤ë¤¤¤Ï¥¤¥Ù¥ó¥ÈÍѤΥ·¡¼¥ó¤ØÁ«°Ü¤¹¤ë
/// </summary>
/// <returns></returns>
private IEnumerator SceneStory() {
// TODO ¤³¤Î¥·¡¼¥óÆâ¤Ç¥¹¥È¡¼¥ê¡¼Å¸³«
// TODO ¤¢¤ë¤¤¤Ï¥¤¥Ù¥ó¥ÈÍѤΥ·¡¼¥ó¤ØÁ«°Ü¤¹¤ë
yield return null;
}
////* ¤³¤³¤Þ¤Ç *////
}