¡¡¤½¤ì¤Ç¤ÏGameManager¥¯¥é¥¹¤ò½¤Àµ¤·¤Æ¡¢Àë¸À¥Õ¥£¡¼¥ë¥É¤ËGameState(enum)¤òÄɲä·¡¢¥²¡¼¥à¤Î¾õÂÖ¤òÅÐÏ¿¤·¤Þ¤¹¡£
¤Þ¤¿¡¢¤³¤Îenum¤ò´ÉÍý¤¹¤ëÊÑ¿ô¤ò£±¤ÄÍÑ°Õ¤·¤Þ¤¹¡£¤³¤ÎÊÑ¿ô¤ÎÃͤ¬¸½ºß¤Î¥²¡¼¥à¤Î¾õÂ֤ˤʤê¤Þ¤¹¡£
¡¡³Æ¥á¥½¥Ã¥ÉÆâ¤ËGameState¤Ë¤è¤ëʬ´ô¤òÄɲ䷤Ƥ¤¤¤Þ¤¹¡£Äɲ乤ëÉôʬ¤¬Â¿¤¤¤Î¤Ç¡¢GameManager¥¯¥é¥¹¤òÁ´Ê¸·ÇºÜ¤·¤Þ¤¹¡£
½ñ¤±Ì¤é¤·¤¬¤¢¤ë¤ÈÀµ¾ï¤ËÆ°ºî¤·¤Þ¤»¤ó¤Î¤Ç¡¢¤â¤·¤âʬ´ô¤Î¥¿¥¤¥ß¥ó¥°¤ÇGameState¤¬Êѹ¹¤Ë¤Ê¤é¤Ê¤¤¾ì¹ç¤Ë¤Ï¡¢¤½¤ÎÁ°¸å¤Î½èÍý¤ò³Îǧ¤·¤Æ¤ß¤Æ¤¯¤À¤µ¤¤¡£
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¤Ë´ÉÍý¤µ¤»¤ë
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;
// ¥¹¥Æ¡¼¥¸Èֹ椫¤é¡¢¤É¤Î¥¹¥Æ¡¼¥¸¤«¤ò¸¡º÷¤·¤ÆStageData¤ò¼èÆÀ¡¡¡¤«¢¤Î¤É¤Á¤é¤«¤ò»È¤¦¡£
// ¡Find¥á¥½¥Ã¥É¡¡
currentStageData = stageList.stageDatas.Find(x => x.stageNo == currentStageNo);
// ¢foreach
//foreach (StageList.StageData stageData in stageList.stageDatas) {
// if (stage.stageNo == currentStageNo) {
// 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++;
// ¼¡¤Î¥¨¥ê¥¢¤ò¥»¥Ã¥È
SetUpNextArea();
}
}
////* ¤³¤³¤Þ¤Ç *////
¡¡¡¡¡¡¡¡// ¥¨¥ê¥¢¤´¤È¤ÎŨ¤ÎÀ¸À®¿ô¤È¸½ºß¤ÎÀ¸À®¿ô¤òÈæ¤Ù¤Æ¡¢¤¹¤Ù¤ÆÀ¸À®ºÑ¤Î¾ì¹ç¤Ë¤ÏÀ¸À®¤Î½èÍý¤ò¤·¤Ê¤¤
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("¥¨¥ê¥¢¡¡¥¯¥ê¥¢");¡¡¡¡¡¡¡¡//¡¡<=¡¡²¼µ¤ÎDebug.Log(gameState)¤òÄɲ乤ë¤Î¤Ç¥³¥á¥ó¥È¥¢¥¦¥È¡¢¤¢¤ë¤¤¤Ïºï½ü¤·¤Æ¤â¹½¤¤¤Þ¤»¤ó
////* ¤³¤³¤«¤éÄɲà *////
// ¼¡¤Î¥¨¥ê¥¢¤Ø°ÜÆ°²Äǽ¤Ë¤¹¤ë
gameState = GameState.Move;
¡¡¡¡¡¡¡¡¡¡¡¡Debug.Log(gameState);
////* ¤³¤³¤Þ¤Ç *////
}
}
}
¡¡½¤Àµ¤¬½ªÎ»¤·¤¿¤é¡¢GameManager¥²¡¼¥à¥ª¥Ö¥¸¥§¥¯¥È¤òÁªÂò¤·¡¢GameManager¤ò¥¤¥ó¥¹¥Ú¥¯¥¿¡¼¤Ç³Îǧ¤·¤Þ¤¹¡£
GameState¤òÅÐÏ¿¤¹¤ë¥¢¥µ¥¤¥ó¾ðÊó¤¬Äɲ䵤ì¤Æ¤ª¤ê¡¢¥×¥ë¥À¥¦¥ó¥á¥Ë¥å¡¼¤Çenum½¤¾þ»Ò(Play¡¢Move¡¢Wait)¤òÀßÄê½ÐÍè¤ë¤è¤¦¤Ë¤Ê¤Ã¤Æ¤¤¤ë¤Ï¤º¤Ç¤¹¡£
GameManager¥²¡¼¥à¥ª¥Ö¥¸¥§¥¯¥È¤Î¥¤¥ó¥¹¥Ú¥¯¥¿¡¼²èÁü
¸¡¾ÚÆ°²è¡¡GameState
https://gyazo.com/a1f90870456cc7546d450b02ff244ff7
¡¡GameState¤ÎÃͤϥ²¡¼¥à¤Î¼Â¹Ô¤ÈƱ»þ¤Ë Wait ¤ËÀßÄꤵ¤ì¤ë¤è¤¦¤ËÀ߷פ·¤Æ¤¢¤ê¤Þ¤¹¤Î¤Ç¡¢¤¤¤º¤ì¤ÎÃͤˤʤäƤ¤¤Æ¤âÌäÂê¤Ï¤¢¤ê¤Þ¤»¤ó¡£