[Unity] 1인칭 FPS 게임 - 7. UI
1. Start Scene
게임을 시작하는 씬이다.
- C# Code
using UnityEngine.SceneManagement;
using UnityEngine;
public class Menu : MonoBehaviour
{
public GameObject tuto;
public void StartGame()
{
SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex + 1);
}
public void ShowTuto()
{
tuto.SetActive(true);
}
public void HideTuto()
{
tuto.SetActive(false);
}
}
- Tutorial
2. Failed UI
플레이어 사망 시 뜨는 화면이다.
(프리팹으로 생성 -> 프리팹인 GameManager에서 참조하기 위해)
- C# Code
using UnityEngine.SceneManagement;
using UnityEngine.UI;
using UnityEngine;
public class FailedUI : MonoBehaviour
{
public Text MaxLevel;
public Text KillCount;
public GameManager gameManager;
private void OnEnable()
{
//kill, max level
MaxLevel.text = gameManager.GetLevel().ToString();
KillCount.text = gameManager.GetKillcount().ToString();
}
public void Restart()
{
//Destroy(gameManager.gameInfo);
//gameManager.ResetGameInfo();
gameManager.gameInfo.Reset();
SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex);
}
public void GotoMain()
{
//gameManager.ResetGameInfo();
gameManager.gameInfo.Reset();
//Destroy(gameManager.gameInfo);
SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex-1);
}
public void Quit()
{
#if UNITY_EDITOR
UnityEditor.EditorApplication.isPlaying = false;
#else
Application.Quit();
#endif
}
}
3. Clear UI
레벨 클리어시 나타나는 화면이다.
약 2초 정도의 텀을 두고 사라진다.
(프리팹으로 생성 -> 프리팹인 GameManager에서 참조하기 위해)
- C# Code
using UnityEngine.SceneManagement;
using UnityEngine.UI;
using UnityEngine;
public class ClearUI : MonoBehaviour
{
public Text KillCount;
public GameManager gameManager;
private void Start()
{
Invoke("Next", 2f);
}
private void OnEnable()
{
//kill, max level
//gameManager.gameInfo.IncreaseLevel();
KillCount.text = gameManager.GetKillcount().ToString();
}
private void Next()
{
SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex);
}
}
4. Player UI
플레이 중에 보이는 화면이다.
프리팹으로 따로 생성했다. (이유는 하단에)
- 플레이어 HUD
- 일시정지
- C# Code
using UnityEngine.UI;
using UnityEngine;
public class PlayerUI : MonoBehaviour
{
GameManager gameManager;
public Player player;
public Image hpbar;
public Text hpText;
public GameObject PauseUI;
private bool isPause = false;
public void Start()
{
//gameManager = this.gameObject.transform.parent.gameObject.GetComponent<GameManager>();
//player = this.gameObject.transform.parent.gameObject.GetComponent<Player>();
//player = this.gameObject.transform.parent.transform.parent.gameObject.GetComponent<Player>();
}
private void Update()
{
PlayerHPbar();
if (Input.GetKeyDown(KeyCode.Escape))
{
PauseGame();
}
}
public void PlayerHPbar()
{
if (player != null)
{
//LivingEntity live = player.GetComponent<LivingEntity>();
float HP = player.getHealth();
//Debug.Log(HP);
hpbar.fillAmount = HP / 10;
hpText.text = string.Format("HP {0}/10", HP);
}
else
{
Debug.Log("No player");
}
}
public void PauseGame()
{
Time.timeScale = 0;
isPause = true;
if (isPause)
{
PauseUI.SetActive(true);
isPause = false;
}
}
}
5. 발생했던 문제점
1. 플레이어 UI 분리
처음에는 플레이어 UI를 플레이어 오브젝트의 자식으로 넣어뒀다. 하지만 이렇게 하니까 플레이어의 체력 정보를 받아오지 못하는 현상이 발생했다.
원인으로 예상되는 것은
- 플레이어가 프리팹이라
: 로그도 찍어보고 플레이 중 변수 값도 확인해보니 플레이어 UI가 체력값을 확인하는 곳이 플레이어 프리팹이 아니라 Instantiate로 생성된 객체를 참조했다. 그런데 EnemyAI 쪽에서는 플레이어 체력을 플레이어 프리팹쪽에서 참조했다. Enemy는 제대로 동작했으므로 플레이어 UI 쪽 참조 문제라고 생각했다.
-> 플레이어 UI를 분리해 프리팹으로 생성
2. 레벨 실패 시 잘못된 값 갱신
이건 아직 이유를 밝혀내지 못했다.
예상되는 이유는 GameInfo와 Manager가 얽혀서 그런 것 같은데, 로그로 찍어봐도 알 수가 없다...
Author And Source
이 문제에 관하여([Unity] 1인칭 FPS 게임 - 7. UI), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@yeju6540/Unity-1인칭-FPS-게임-7.-UI저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)