[클론코딩_유니티_골드메탈] 뱀서라이크 따라만들기 10 (HUD📐제작하기)

2023. 5. 6. 22:29·게임개발/언데드서바이벌_골드메탈_클론코딩

https://www.youtube.com/watch?v=ip0xffLSWlk&list=PLO-mt5Iu5TeZF8xMHqtT_DhAPKmjF6i3x&index=13 


1. UI 캔버스

하이어라이키 UI > Canvas 메뉴로 캔버스 생성

RectTransform : 스크린 전용 Transform 역할 컴포넌트

Screen-Overlay : 스크린에 그대로 얹는 형태

Screen-Camera : 스크린을 카메라에 맞추는 형태

- 메인카메라를 드래그하면 크기가 메인 카메라로 된다.

World Space : 월드 공간에 배치하는 형태

 

테스트를 위한 Text 오브젝트 추가

- Canvas > UI > Legacy > Text

- width/hight = 400 100 , bold, white, scale : 70

 

문제점, 해상도에 따라 크기가 바뀜

UI Scale Mode를 Scale with Screen size로 변경

References Resolution을 픽셀 퍼펙트 카메라와 동일하게 적용

Match와 Pixel Per Unit도 적절하게 조절

- Match 0.5, Reference Pixel Per Unit 18(스프라이트가 대부분 18이기 때문에)


2. 스크립트 준비

HUD 스크립트 파일 생성(HeadUpDisplay)

 

다루게 될 데이터를 미리 열거형 enum으로 선언, 선언한 열거형을 타입으로 추가 선언

using UnityEngine.UI;

public class HUD : MonoBehaviour
{
    public enum InfoType { Exp, Level, Kill, Time, Health}
    public InfoType type;

    Text myText;
    Slider mySlider;

    void Awake()
    {
        myText = GetComponent<Text>();
        mySlider = GetComponent<Slider>();
    }
}

 

UI 컴포넌트를 사용할 때는 UnityEngine.UI 네임스페이스 사용(Text)(using UnityEngine.UI)

 

Text와 Slider 변수 선언 및 초기화

Text

void Awake()

 

LateUpdate()에서 switch ~ case문으로 로직 나누기


    private void LateUpdate()
    {
        switch (type)
        {
            case InfoType.Exp:

                break;
            case InfoType.Level:

                break;
            case InfoType.Kill:

                break;
            case InfoType.Time:

                break;
            case InfoType.Health:

                break;
        }
    }

 


3. 경험치 게이지

canvas > UI > Slider 메뉴로 슬라이더 추가하기

Rect Transform은 길이와 높이, 위치, 앵커로 구성

앵커 : UI 오브젝트의 기준점 설정, 변경시 오른쪽 속성이 달라짐

- Shift : 기준점 변경

- Alt : 위치(크기) 변경

우상단 클릭

Height 7로 설정

플레이어가 게이지를 임의로 수정하면 안되니, Slider의 Interactible 해제

Transition : 변환(None)

Navigation : UI의 Tab 포커싱 순서(None)

Handle Rect 항목을 선택하고 Delete 혹은 Backspace 눌러 비우기

 

자식 오브젝트로 있는 핸들 오브젝트를 과감히 삭제

자식 오브젝트(Background,Fill Area)들의 앵커를 전체 확장 늘리기로 선택

Fill 자식 오브젝트의 여백을 0으로 초기화(핸들 크기)

 

Sprite의 UI에서 Back0를 드래그

자식 오브젝트의 image 컴포넌트에서 스프라이트 변경

- FillArea에서 Back 0

- Fill 에서 Front 0  //적용이 되지 않아 임의의 Color 삽입

 

데이터 연동을 위해 HUD.cs로 이동

슬라이더에 적용할 값 : 현재 경험치 / 최대 경험치

    private void LateUpdate()
    {
        switch (type)
        {
            case InfoType.Exp:
                float curExp = GameManager.instance.exp;
                float maxExp = GameManager.instance.nextExp[GameManager.instance.level];
                mySlider.value = curExp / maxExp;
                break;

 

Slider에 HUD스크립트 추가

열거형을 변수로 활용하면 일고 사용하기 편해요.

EXP로 Slider이름 변경


4. 레벨, 킬수 텍스트

TextMesh Pro의 텍스트는 한글로 사용하기에 살짝 번거로워요

UI > Legacy > Text

앵커를 사용하여 오른쪽 상단에 고정

Text 컴포넌트의 Alignment에서 오른쪽 정렬 설정

X, Y 축 위치를 조절하여 정리된 UI 배치하기(X:-2 Y:-8)

미리 준비된 네오둥근모꼴 폰트를 Font에 적용

Font Size 6으로 수정

Text와 이름 변경

UI > Image 메뉴로 이미지 생성 후, 아이콘 스프라이트 적용

- UI에서 Icon 0 Scource Image에 할당

Set Native Size : 오브젝트 크기를 스프라이트의 원래 크기로 변경

이미지는 레벨 텍스트의 반대편으로 배치(X:-2 Y:-8)

레벨 텍스트를 한번 복사해서 킬수 이미지의 자식으로 넣기

Image의 Hight 8로 조정

Alignment의 세로 정렬을 중앙으로 설정

이름 변경(Kill, Kill Text)

 

HUD 스크립트

            case InfoType.Level:
                myText.text = string.Format("Lv.{0:F0}", GameManager.instance.level);
                break;
            case InfoType.Kill:
                myText.text = string.Format("{0:F0}", GameManager.instance.kill);
                break;

◆Format : 각 숫자 인자값을 지정된 형태의 문자열로 만들어주는 함수

●string.Format("Lv.{0:F0}",GameManager.instance.level);

▶인자 값의 문자열이 들어갈 자리를 {순번} 형태로 작성

▶F0,F1,F2 : 소수점 자리를 지정

 

스크립트 저장 후, 각 텍스트 오브젝트에 스크립트 추가 및 타입 설정


5. 타이머 텍스트

레벨 텍스트 복사하여 중앙으로 배치(앵커:ctrl+alt+위클릭, y:-8,size:9, 색상:white)

HUD 스크립트의 타입을 Timer로 설정

 

HUD에서 흐르는 시간이 아닌 남은 시간부터 구하기

            case InfoType.Time:
                float remainTime = GameManager.instance.maxGameTime - GameManager.instance.gameTime;
                int min = Mathf.FloorToInt(remainTime / 60);
                int sec = Mathf.FloorToInt(remainTime % 60);
                myText.text = string.Format("{0:D2}:{1:D2}", min,sec);

- 분과 초로 구분

- 60으로 나누어 분을 구하되 Mathf.FloorToInt()로 소수점 버리기

- A % B  : A를 B로 나누고 남은 나머지

▶D0,D1,D2 : 자리 수를 지정


6. 체력 게이지

게임 매니저에서 체력, 최대 체력 변수 선언

Canvas > Create Empty

캔버스에서 오브젝트 생성을 하면 RectTransform이 들어있어요.

이름을 Health로 넓이를 가로 12, 세로 4로 설정

Exp복사해서 Health의 자식으로 Health Slider 생성

슬라이드가 부모 오브젝트 넓이와 같도록 앵커 설정(shift+alt+클릭)

Height 4로, Pos Y -12로 설정 //문제발생으로 -8로 설정하였다.

슬라이드의 각 스프라이트를 변경

- UI > Back1를 Health Slider의 Background로 설정

- UI > Front1를 Fill Areas의 Background로 설정

 

HUD 스크립트로 와서 체력 로직은 경험치 코드를 재활용하여 작성

            case InfoType.Health:
                float curHealth = GameManager.instance.health;
                float maxHealth = GameManager.instance.maxHealth;
                mySlider.value = curHealth / maxHealth;
                break;
        }

HUD 스크립트의 타입을 Health로 설정

문제점

1. 비어있는 체력창

2. 시네머신에 따라 플레이어가 체력바와 유격이 발생함

 

시작할 때 현재 체력과 최대 체력이 같도록 로직 추가

public class GameManager : MonoBehaviour
{
	//...

    void Start()
    {
        maxHealth = 100;
        health = maxHealth;
        Debug.Log(maxHealth);
    }

 

플레어어 따라가는 Follow 스크립트 생성

RectTransform 변수 선언 및 초기화(UI는 RectTransform)

public class Follow : MonoBehaviour
{
    RectTransform rect;
    private void Awake()
    {
        rect = GetComponent<RectTransform>();

    }

    private void FixedUpdate()
    {
        rect.position = Camera.main.WorldToScreenPoint(GameManager.instance.player.transform.position);
    }

}

FixedUpdate단위로 플레이어가 움직여서 같게 구현

월드 좌표와 스크린 좌표는 서로 달라요

- Camera.main.WorldToScreenPoint() : 월드 상의 오브젝트 위치를 스크린 좌표로 변환

완성된 스크립트를 체력 UI 오브젝트에 추가

 


깃허브 올리기

Commit : ver 1.10
Description : HUD //It's a bit of a mess.

 

https://github.com/mekain80/CloneCode_Undead_Survivor

 

GitHub - mekain80/CloneCode_Undead_Survivor: https://www.youtube.com/watch?v=MmW166cHj54&list=PLO-mt5Iu5TeZF8xMHqtT_DhAPKmjF6i3x

https://www.youtube.com/watch?v=MmW166cHj54&list=PLO-mt5Iu5TeZF8xMHqtT_DhAPKmjF6i3x&index=1 - GitHub - mekain80/CloneCode_Undead_Survivor: https://www.youtube.com/watch?v=MmW166cHj54&li...

github.com

 

'게임개발 > 언데드서바이벌_골드메탈_클론코딩' 카테고리의 다른 글

[클론코딩_유니티_골드메탈] 뱀서라이크 따라만들기 11+ (플레이어 무기 장착 표현하기)  (0) 2023.05.10
[클론코딩_유니티_골드메탈] 뱀서라이크 따라만들기 11 (능력 업그레이드💪구현)  (0) 2023.05.10
[클론코딩_유니티_골드메탈] 뱀서라이크 따라만들기 9 (타격감🌟있는 몬스터 처치 만들기)  (0) 2023.05.06
[클론코딩_유니티_골드메탈] 뱀서라이크 따라만들기 8 (자동🎯원거리 공격 구현)  (0) 2023.04.10
[클론코딩_유니티_골드메탈] 뱀서라이크 따라만들기 7 (회전하는🪓근접무기 구현)  (0) 2023.04.10
'게임개발/언데드서바이벌_골드메탈_클론코딩' 카테고리의 다른 글
  • [클론코딩_유니티_골드메탈] 뱀서라이크 따라만들기 11+ (플레이어 무기 장착 표현하기)
  • [클론코딩_유니티_골드메탈] 뱀서라이크 따라만들기 11 (능력 업그레이드💪구현)
  • [클론코딩_유니티_골드메탈] 뱀서라이크 따라만들기 9 (타격감🌟있는 몬스터 처치 만들기)
  • [클론코딩_유니티_골드메탈] 뱀서라이크 따라만들기 8 (자동🎯원거리 공격 구현)
메카인
메카인
  • 메카인
    메카인의 지식창고
    메카인
  • 전체
    오늘
    어제
    • 분류 전체보기
      • 코딩 공부
        • TIL(Today I Learn)
        • TIL
        • 백준(C++)
        • Python
        • 알고리즘
        • 프로젝트 회고
      • C++
        • C++
        • C++ STL
        • C,C++ mCoding yotube
      • 게임개발
        • 언데드서바이벌_골드메탈_클론코딩
        • 3D_골드메탈_클론코딩
        • 유니티_문제해결
        • 게임 수학
      • Unreal 공부
        • UE5 GameDev
        • Unreal Engine 4 C++ The Ult..
      • 교재 문제 풀이
        • 운영체제
      • 정보처리기사
        • 정처기 요약
        • 정처기 오답노트
      • 학교수업
        • 데이터베이스
        • 프로그래밍 언어론
        • 리눅스 시스템
        • 네트워크
      • 일상
        • 주식
        • 독서
      • (비공개 전용)
        • memory
        • Build
        • OOP
        • Smart Pointer
        • lamda
        • 게임 수학
        • 모던 C++
        • 모던 C++ STL
        • 모던 C++ Concurrency, Paralle..
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
    • 글쓰기
    • 블로그 관리
  • 링크

  • 공지사항

    • 공지사항 - 인생과 블로그의 목표
  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
메카인
[클론코딩_유니티_골드메탈] 뱀서라이크 따라만들기 10 (HUD📐제작하기)
상단으로

티스토리툴바