유니티 체력바 표시
Intro
유니티 체력바 구현
플레이어 체력바
캔버스에 Slider
를 추가하고 슬라이더 핸들을 제거한뒤 Fill Area
의 색상을 붉게하고 Right Margin을 15에서 5로 수정하면 체력바 모양이된다.
그리고 체력의 숫자를 나타낸 텍스트도 추가했다.
체력 업데이트 C# 스크립트
public override void TakeDamage(int damage)
{
int realDamage = damage - def <= 0 ? 1 : damage - def;
InGameUIManager.instance.UpdateHpText(HP-realDamage); // 체력 텍스트 업데이트
InGameUIManager.instance.HP = HP - realDamage; // 체력바 업데이트
}
피격시 UIManager
에서 텍스트와 체력수치를 변경하고
private void Update()
{
CurHP = (float)HP / (float)MaxHP;
UpdateHpSlider();
}
public void UpdateHpText(int hp) // 피격시 실행
{
if(hp<0)
{
hp = 0;
}
hpText.text = hp.ToString();
}
private void UpdateHpSlider()
{
hpSlider.value = Mathf.Lerp(hpSlider.value, CurHP, Time.deltaTime * 10); // 체력 감소 선형보간
}
UIManager
에서는 hp 감소시 선형 보간을 통해 슬라이드가 깎이는듯한 효과를 주었다.
몬스터 체력바
캔버스 추가
몬스터의 체력바를 표시할 캔버스와 이를 합성할 카메라를 생성한다. HPCanvas
의 Render Mode
를 HPCamera
로 설정
카메라 추가
HPCamera
의 Clear Flag
설정을 Depth only
로 설정해 빈공간을 투명처리하여 표시되는 체력바를 메인 카메라 화면에 합성되도록 한다. Depth
는 1로 설정
체력바 프리팹 추가
슬라이더로 화면에 표시될 몬스터 체력바 프리팹 생성
체력바 스크립트
void Start()
{
canvas = GetComponentInParent<Canvas>();
hpCamera = canvas.worldCamera;
rectParent = canvas.GetComponent<RectTransform>();
rectHp = GetComponent<RectTransform>();
}
private void LateUpdate()
{
var screenPos = Camera.main.WorldToScreenPoint(targetTr.position + offset); // 몬스터의 월드 3d좌표를 스크린좌표로 변환
if (screenPos.z < 0.0f)
{
screenPos *= -1.0f;
}
var localPos = Vector2.zero;
RectTransformUtility.ScreenPointToLocalPointInRectangle(rectParent, screenPos, hpCamera, out localPos); // 스크린 좌표를 다시 체력바 UI 캔버스 좌표로 변환
rectHp.localPosition = localPos; // 체력바 위치조정
}
LateUpdate
를 통해 update
함수가 끝나면 받아온 몬스터의 월드 좌표를 스크린 좌표계로 변환시키고 이를 다시 HPCanvas
의 로컬 좌표로 변환해서 업데이트 한다.(몬스터 위치에 맞게 체력바 이동)
이때 if문으로 스크린 좌표가 0보다 작을 때 -1을 곱해주는 이유는 메인카메라가 몬스터와 반대 방향을 바라보았을때도 체력바가 표시되는걸 막기위함이다.
체력바 생성 스크립트
hpCanvas = GameObject.Find("HPCanvas").GetComponent<Canvas>(); // 체력바 캔버스
hpBar = Instantiate<GameObject>(hpBarPrefab, hpCanvas.transform); // 체력바 생성
hpSlider = hpBar.GetComponentInChildren<Slider>();
var _hpbar = hpBar.GetComponent<MonsterHPBar>();
_hpbar.targetTr = this.gameObject.transform; // 체력바의
_hpbar.offset = hpBarOffset; // 위치설정
몬스터 스크립트에서 캔버스에 체력바 프리팹을 생성시키고 체력바 위치값을 몬스터의 현재 위치를 넣어준다.
댓글남기기