Unity 강의/Unity Course(2) - 절대강좌! 유니티
[Unity Course 2] 07. 유니티 UI 시스템 6
첨부엉.
2024. 6. 24. 20:36
반응형
위키북스 출판사 이재현 저자님의 '절대강좌! 유니티' 책을 참고하여 필기한 내용입니다.
생명 게이지 구현
Play씬으로 이동
| UI Scale Mode 옵션 | 설명 |
| Constant Pixel Size | 스크린 해상도와 관계없이 픽셀의 크기대로 UI를 표시 |
| Scale With Screen Size | 스크린 해상도에 맞게 UI를 조절, 해상도가 커지면 UI도 커짐 |
| Constant Physical Size | 스크린 해상도와 관계없이 설정한 물리적인 크기를 유지 |

Scale With Screen 으로 옵션을 변경하기
Canvas 하위에는 Pannel을 생성하고 이름을 Panel - Hpbar 변경한다.
Rect Transform의 앵커는 shift를 누르고 Also set pivot으로

넓이와 높이, 위치는 참고하여 적절히 배치하고
Image Type은 Sliced로 설정한

Color는 (0,255,255,255,)로 설정했다.
하위에 Text(TMP)를 생성하고 아래와 같이 설정을 변경한다.

Image를 아래와 같이 생성하고 이때 hpBar는 default에서 Sprite로 변경한다.


태그를 새로 생성하여 지정
using System.Collections;
using UnityEngine;
using UnityEngine.UI;
public class PlayerCtrl : MonoBehaviour
{
[SerializeField]
private Transform tr;
// 이동 속력 변수
public float moveSpeed = 10.0f;
// 회전 속도 변수
public float turnSpeed = 80.0f;
// Animation 컴포넌트를 저장할 변수
private Animation anim;
// 초기 생명 값
private readonly float initHP = 100.0f;
// 현재 생명 값
public float currHp;
// Hpbar 연결할 변수
private Image hpBar;
// 델리게이트 선언
public delegate void PlayerDieHandler();
// 이벤트 선언
public static event PlayerDieHandler OnPlayerDie;
IEnumerator Start()
{
// Hpbar 연결
hpBar = GameObject.FindGameObjectWithTag("HP_BAR")?.GetComponent<Image>();
// HP 초기화
currHp = initHP;
// 컴포넌트를 추출해 변수에 대입
tr = GetComponent<Transform>();
anim = GetComponent<Animation>();
// 애니메이션 실행
anim.Play("Idle");
turnSpeed = 0.0f;
yield return new WaitForSeconds(0.3f);
turnSpeed = 80.0f;
}
void Update()
{
...생략
}
void PlayerAnim(float h, float v)
{
...생략
}
// 충돌한 Collider 의 IsTrigger 옵션이 체크됐을 때 발생
private void OnTriggerEnter(Collider coll)
{
// 충돌한 Collider가 몬스터의 PUNCH이면 Player HP 차감
if(currHp >= 0.0f && coll.CompareTag("PUNCH"))
{
currHp -= 10.0f;
DisplayHealth();
Debug.Log($"Player hp = {currHp / initHP}");
// player 생명이 0 이하면 사망 처리
if (currHp <= 0.0f)
{
PlayerDie();
}
}
}
// Player 사망 처리
void PlayerDie()
{
Debug.Log("Player Die !");
// 주인공 사망 이벤트 호출(발생)
OnPlayerDie();
}
void DisplayHealth()
{
hpBar.fillAmount = currHp / initHP;
}
}
아까 Image - Hpbar는 Tag로 지정했으니 GameObject.FindGameObjectWithTag함수로 찾아온다.
? 연산자는 null을 체크할 때 코드를 간결하게 해주는 역할
태그값이 없다면 null을 반환한다.
// Hpbar 연결
hpBar = GameObject.FindGameObjectWithTag("HP_BAR")?.GetComponent<Image>();
currHp값을 감산한후 변경함
private void OnTriggerEnter(Collider coll)
{
// 충돌한 Collider가 몬스터의 PUNCH이면 Player HP 차감
if(currHp >= 0.0f && coll.CompareTag("PUNCH"))
{
currHp -= 10.0f;
DisplayHealth();
Debug.Log($"Player hp = {currHp / initHP}");
// player 생명이 0 이하면 사망 처리
if (currHp <= 0.0f)
{
PlayerDie();
}
}
}
반응형