Ch 13. 메뉴 구현 & 게임 리셋
카테고리: Unity Lesson 4
태그: Unity Game Engine
케이디님의 [유니티 강좌] 리듬 게임 유튜브 강의를 듣고 정리한 필기입니다. 😀
🌜 강의 들으러 가기 Click
🚀 메뉴 구현
메인 메뉴에서 플레이 버튼 누르면 타이틀 메뉴로 넘어감. (메인 메뉴 비활, 타이틀 메뉴 활성화)
타이틀 메뉴에서 Back 버튼을 누르면 메인 메뉴로 돌아가고, Play 버튼을 누르면 게임 시작!
또 다른 씬을 만들어서 전환할 필요 없이 이렇게 이미지 엄청 크게 만들어서 다 가려버리게 하고(검은 배경.. 이미지 UI이다.) 이 이미지를 비활, 활성화 하여 씬 전환하는 효과를 주는 것도 좋은 방법인 것 같다.
✈ 타이틀 메뉴
📜TitleMenu
public class TitleMenu : MonoBehaviour
{
[SerializeField] GameObject goStageUI = null;
public void BtnPlay() // 버튼 이벤트 등록
{
goStageUI.SetActive(true); // 스테이지 메뉴 활성화
this.gameObject.SetActive(false); // 타이틀 메뉴 끄고
}
}
✈ 스테이지 메뉴
📜StageMenu
public class StageMenu : MonoBehaviour
{
[SerializeField] GameObject TitleMenuUI = null;
public void BtnBack() // 버튼 이벤트 등록
{
TitleMenuUI.SetActive(true); // 타이틀 메뉴 활성화
this.gameObject.SetActive(false); // 스테이지 비활
}
public void BtnPlay() // 버튼 이벤트 등록
{
GameManager.instance.GameStart(); // 게임 매니저를 통해 게임 스타트 (밑에서 작성)
this.gameObject.SetActive(false); // 스테이지 비활
}
}
✈ 게임 시작/종료시 해야될 처리
📜GameManager
public class GameManager : MonoBehaviour
{
[SerializeField] GameObject[] goGameUI = null; // 게임이 시작되어야 비로소 활성화 되는 모든 오브젝트들 이 배열에 할당해둔 상태
[SerializeField] GameObject goTitleUI = null;
public static GameManager instance;
public bool isStartGame = false;
private void Start()
{
instance = this; // 싱글톤
}
public void GameStart()
{
for(int i = 0; i < goGameUI.Length; i++)
{
goGameUI[i].SetActive(true);
}
isStartGame = true;
}
public void MainMenu()
{
for (int i = 0; i < goGameUI.Length; i++)
{
goGameUI[i].SetActive(false);
}
goTitleUI.SetActive(true);
}
}
📜NoteManager
void Update()
{
if (GameManager.instance.isStartGame)
{
//...
}
}
public void RemoveNote()
{
GameManager.instance.isStartGame = false;
📜PlayerController
void Update()
{
if (GameManager.instance.isStartGame)
{
📜Result
public void BtnMainMenu() // 버튼 이벤트 등록 (메인 메뉴로 돌아각기)
{
goUI.SetActive(false);
GameManager.instance.MainMenu();
theCombo.ResetCombo();
}
🚀 게임 리셋하기
- 게임을 새롭게 다시 시작하면 초가화 상태에서 게임할 수 있도록! (이전 게임 기록들 리셋)
- 스테이지를 프리팹으로 만들어서 게임이 시작되면 스테이지가 Instantiate 되도록 하고 게임이 끝나면 Destroy 되도록 함
✈ 초기화
// 📜ScoreManager
public void Initialized()
{
currentSrore = 0;
txtScore.text = "0";
}
// 📜TimingManager
public void Initialized()
{
for (int i = 0; i < judgementRecord.Length; i++)
judgementRecord[i] = 0;
}
// 📜StatusManager
public void Initialized()
{
currentHp = maxHp;
currentShield = 0;
currentShieldCombo = 0;
shieldGauge.fillAmount = 0;
isDead = false;
SettingHPImage();
SettingShieldImage();
}
// 📜PlayerController
public void Initialized()
{
transform.position = Vector3.zero;
destPos = Vector3.zero;
realCube.localPosition = Vector3.zero;
canMove = true;
s_canPressKey = true;
isFalling = false;
myRigid.useGravity = false;
myRigid.isKinematic = true;
}
// 📜CenterFlame
public void ResetMusic()
{
musicStart = false;
}
✈ 스테이지 프리팹 생성 파괴
// 📜StageManager
GameObject currentStage;
public void RemoveStage()
{
if (currentStage != null)
Destroy(currentStage);
}
public void SettingsStage()
{
stepCount = 0;
currentStage = Instantiate(stage, Vector3.zero, Quaternion.identity);
stagePlates = currentStage.GetComponent<Stage>().plates;
totalPlateCount = stagePlates.Length;
📜GameManager
private void Start()
{
instance = this;
theCombo = FindObjectOfType<ComboManager>();
theScore = FindObjectOfType<ScoreManager>();
theTiming = FindObjectOfType<TimingManager>();
theStatus = FindObjectOfType<StatusManager>();
thePlayer = FindObjectOfType<PlayerController>();
theStage = FindObjectOfType<StageManager>();
}
public void GameStart()
{
for(int i = 0; i < goGameUI.Length; i++)
{
goGameUI[i].SetActive(true);
}
theStage.RemoveStage();
theStage.SettingsStage();
theCombo.ResetCombo();
theScore.Initialized();
theTiming.Initialized();
thePlayer.Initialized();
theStatus.Initialized();
isStartGame = true;
}
✈ 겜 다시 시작하면 결과창 비활
// 📜Result
public void closeResult()
{
goUI.SetActive(false);
}
// 📜StageMenu
Result result;
result = FindObjectOfType<Result>();
[SerializeField] GameObject resultUI = null; // Result UI
public void BtnPlay()
{
if (resultUI.activeSelf)
theResult.closeResult();
//..
}
// 📜MainMenu
Result result;
result = FindObjectOfType<Result>();
[SerializeField] GameObject resultUI = null; // Result UI
public void MainMenu()
{
if (resultUI.activeSelf)
result.closeResult();
🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄
댓글 남기기