[Unity] 1인칭 FPS 게임 - 7. UI

홍예주·2021년 7월 17일
0

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가 얽혀서 그런 것 같은데, 로그로 찍어봐도 알 수가 없다...

profile
기록용.

0개의 댓글