UIManager라는 UI를 관리하는 스크립트를 UIManager폴더를 만들어 저장후 Canvas에 어태치합니다.

앞에서 만든 아이템이나 HP표시 UI를 갱신하는 기능을 수행합니다.

UIManager의 내용은 다음과 같습니다.

변수

UI를 연결한 리소스의 참조들입니다.

public GameObject arrowText;        //화살의 수를 표시하는 Text
public GameObject keyText;          //열쇠 수를 표시하는Text
public GameObject hpImage;          //HP의 수를 표시하는 Image
public Sprite life3Image;           //HP3 이미지
public Sprite life2Image;           //HP2 이미지
public Sprite life1Image;           //HP1 이미지
public Sprite life0Image;           //HP0 이미지
public GameObject mainImage;        // 이미지를 가지는 GameObject
public GameObject resetButton;      // 리셋 버튼
public Sprite gameOverSpr;          // GAME OVER 이미지
public Sprite gameClearSpr;         // GAME CLEAR 이미지
public GameObject inputPanel;       //버추얼 패드와 공격 버튼을 배치한 조작 패널

소지품의 개수, 플레이어의 HP, 재시도하는 씬이름등입니다.

int hasKeys = 0;                    //열쇠 수
int hasArrows = 0;                  //화살 소지 수
int hp = 0;                         //플레이어의 HP

public string retrySceneName = "";  //재시도하는 씬 이름

Start()

아이템수와 HP를 갱신하기 위해 UpdateItemCont()와 UpdateHP()를 호출합니다. 기타 필요없는 버튼을 숨깁니다.

void Start()
{
    UpdateItemCount();  //아이템 수 갱신
    UpdateHP();         //HP갱신
    //이미지를 숨기기
    Invoke("InactiveImage", 1.0f);
    resetButton.SetActive(false);  //버튼 숨기기
}

Update()

Start()와 똑같이 아이템수와 HP를 갱신하기 위해 UpdateItemCont()와 UpdateHP()를 호출합니다. 

void Update()
{
    UpdateItemCount();  //아이템 수 갱심
    UpdateHP();         //HP갱신
}

UpdateItemCount()

static 변수인 ItemKeeper가 가진 각 아이템수가 현재UI와 다르면 UI를 변경합니다.

void UpdateItemCount() {
    //화살
    if (hasArrows != ItemKeeper.hasArrows)  {
        arrowText.GetComponent<Text>().text = ItemKeeper.hasArrows.ToString();
        hasArrows = ItemKeeper.hasArrows;
    }
    //열쇠
    if (hasKeys != ItemKeeper.hasKeys)  {
        keyText.GetComponent<Text>().text = ItemKeeper.hasKeys.ToString();
        hasKeys = ItemKeeper.hasKeys;
    }
}

UpdateHP()

레벨의 플레이어를 찾아 플레이어의 HP와 UI의 HP가 다르다면 갱신합니다. 만일 플레이어가 사망했다면 게임종료 상태로 변경하고 적절한 UI 를 표시합니다.

void UpdateHP() {
    //Player 가져오기
    if (PlayerController.gameState != "gameend")   {
        GameObject player = GameObject.FindGameObjectWithTag("Player");
        if (player != null)   {
            if (PlayerController.hp != hp)  {
                hp = PlayerController.hp;
                if (hp <= 0)  {
                    hpImage.GetComponent<Image>().sprite = life0Image;
                    //플레이어 사망!!
                    resetButton.SetActive(true);    //버튼 표시
                    mainImage.SetActive(true);      //이미지 표시
                                                    // 이미지 설정
                    mainImage.GetComponent<Image>().sprite = gameOverSpr;
                    inputPanel.SetActive(false);      //조작 UI 숨기기
                    PlayerController.gameState = "gameend";   //게임 종료
                }  else if (hp == 1) {
                    hpImage.GetComponent<Image>().sprite = life1Image;
                } else if (hp == 2) {
                    hpImage.GetComponent<Image>().sprite = life2Image;
                }   else {
                    hpImage.GetComponent<Image>().sprite = life3Image;
                }
            }
        }
    }
}

Retry()

게임오버가 되면 첫번째 Stage를 로딩합니다.

public void Retry()
{
    //HP 되돌리기
    PlayerPrefs.SetInt("PlayerHP", 3);
    //게임 중으로 설정
    SceneManager.LoadScene(retrySceneName);   //씬 이동
}

Cavas에 어태치된 UIManger 스크립트의 publc 변수들을 하이라키에서 끌어다 적용시킵니다.

 

여기까지 만들었으면 Cavas를 프로젝트뷰 UIManager에 놓고 프리팹으로 만듭니다.

 

다른씬에 프리팹 배치하기

dunjeon1 씬을 로딩하고 Canvas를 끌어다 놓습니다. 

Canvas의 인스펙터뷰에서 RenderCamera에 MainCamera를 설정합니다. 이제서야 UI가 나옵니다.ㅎ

마지막으로 하이라키의 +>UI>EventSystem을 선택해 추가해줍니다. 이미 있다면 생략해도 됩니다.

 

+ Recent posts