1. UI Manager
2.HP bar
3. 씬 전환
4. 스킬 쿨타임 적용
이번 프로젝트를 시작할 때 Manager를 미리 구상한 뒤에 내부 제작에 들어갔다.
UI Manager에 대한 개념이 확실히 없고, 처음 만들 다보니 좀 꼬인 면이있다.
UIManager 프리펩에 스크립트를 넣고 모두 관리하려고 접근했었다.
그러다 보니, 씬이 넘어가면 해당 스크립트에 넣어놨던 요소들이 사라진다.
해결할 방법은 두가지 정도 생각했다.
프리팹 생성을 시도 해보았지만, 리소스 폴더를 사용하는 방식으로 갔다가 생성되지 않았다.
따라서 UIManager안에 UI를 넣어서 파괴되지 않는 것으로 이용했다.
Manager가 어디서든 접근 가능한 것들, 필요한 것들을 모아놓은 곳인데
지금 생각해보니 잘못 접근한것같다.
StatScene과 MainScene에서 공통적으로 호출하거나 필요한 것들을 넣어두면 됐을 것 같다.
# UIManager.cs
private void Update()
{
ChangeDisplayHealth();
}
public void ChangeDisplayHealth()
{
HP_Bar.fillAmount = (float)dataManager.PlayerCurrentStats.currentHealth / (float)dataManager.PlayerCurrentStats.maxHealth;
HP_txt.text = dataManager.PlayerCurrentStats.currentHealth + " / " + dataManager.PlayerCurrentStats.maxHealth;
}
처음에는 캐릭터가 피격 했을 때만 해당 코드를 발동시켰지만,
다른 상황에서도 캐릭터의 체력이 변경되는 상황이 자주 일어나서
Update
함수로 위치를 옮겼다.
# StartSceneManager.cs
public void ToMainScene()
{
SceneManager.LoadScene("MainScene_KHK");
GameManager.instance.UiManager.MainUIActive(); // 씬 넘어갈 때 UI 활성화
GameManager.instance.PlayerDataInitialiez(); // 데이터 초기화
}
다음 씬으로 넘어가는 간단한 코드다.
넘어가면서 UI Manager 안에 있는 UI를 활성화한다. 메인화면에서 사용할 UI이다.
게임을 다시 시작하는 경우가 있기 때문에 넘어가기 전에 데이터를 초기화 한다.
ESC 키를 누르면 게임이 일시정지되며 옵션이 보이는 키를 만들고자 했다.
Update를 쓰지 않는 방법을 알고 싶었으나 오래 알아볼 시간이 부족하여 일단 사용했다.
# UIManager.cs
private void Update()
{
if (Input.GetKeyDown(KeyCode.Escape))
{
if (PauseMenuPanel == null) return;
if (GameIsPaused)
{
Resume();
}
else
{
Pause();
}
}
}
Pause패널이 없으면 실행할 수 없도록 예외처리를 하였다.
해당 예외 처리로 StartScene에서 ESC 키를 눌러도 일시정지 되지 않는다.
GameIsPuased
함수로 게임이 멈춰있는지 확인하고 Resume
또는 Pause
한다.
# UIManager.cs
if (Input.GetKeyDown(KeyCode.Return) && IsGameOver == true)
{
ReturnToStartScene();
}
public void ReturnToStartScene()
{
IsGameOver = false;
SceneManager.LoadScene("StartScene");
UIClose(MainUI);
UIClose(GameOverText);
GameManager.instance.AudioManager.BGM("startSceneBGM");
Resume();
SkillIcon.sprite = basicSkillIcon;
}
GameOver가 되었을 때 엔터를 누르면 다시 Start Scene으로 돌아간다.
IsGameOver
로 Enter를 활성화, 비활성화 하고
UIManager 안에 있는 UI를 각 씬에 맞게 끄고 킨다.
ESC - Puase 패널에서 시작 씬으로 갔을 때 처리, 노래와 초기화 작업을 진행한다.
# BulletManager.cs
IEnumerator SkillCoolTime(SkillItemData data)
{
coolTime = data.CoolTime;
while (coolTime > 0.0f)
{
coolTime -= Time.deltaTime;
GameManager.instance.UiManager.disable.fillAmount = coolTime / data.CoolTime;
Debug.Log("fillAmount : " + GameManager.instance.UiManager.disable.fillAmount);
yield return new WaitForFixedUpdate();
}
_isCoolTime = false;
}
먼저 지역 필드coolTime
에 원하는 Skilldata.CooTime
만큼 집어넣는다.
coolTime
이 0이 되기 전까지 -Time.deltaTime
만큼 계산한다.
coolTime은 줄어드는 현재시간, data.CoolTime은 정해진 쿨타임이다.
원하는 Image
의 fillAmount를 coolTime / data.CoolTime
으로 값을 넣어둔다.
그러면 1 -> ... -> 0.5 -> ... -> 0
으로 소숫점으로 시간초만큼 줄어든다.
처음에는 조금 막막하고 시간도 오래걸려서 고되고 힘들었었다.
하지만, 이번 프로젝트로 조금 더 코드가 보이는 느낌이 들었다.
어떻게 만들어야 될지 윤곽이 잡히는 느낌이었다.
다음부터는 조금 더 체계적이고 깔끔한 코드로 작성해보고 싶다.