일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |
- Inventory
- BFS
- 포톤
- Unity3d
- 스택
- 스파르타내일배움캠프TIL
- UE4
- 알고리즘
- 내일배움캠프
- Unity
- 유니티
- unityui
- 워크플로
- 스파르타내일배움캠프
- 해시
- FSM
- 순열
- 프로그래머스
- 문자열
- UnrealEngine
- 구현
- 유클리드호제법
- c#
- Photon
- C++
- 이분탐색
- Firebase
- QueryDSL
- 언리얼엔진
- Unity2D
- Today
- Total
개발 낙서장
[Unity 3D] 몬스터 체력바 본문
※ https://www.youtube.com/watch?v=MO_XEHGzDLM 영상을 참고하여 제작하였습니다.
구현 동기
RPG라면 특수한 목적이 있지 않는 이상 몬스터의 HP를 표시해주어야 플레이어가 플레이에 불쾌감을 느끼지 않을 것이다.
체력바가 없는 게임의 대표 격인 '몬스터 헌터'이다.
몬스터 헌터는 몬스터를 한 번 사냥하는데 일반적으로 10분 이상의 시간 동안 전투를 해야 해서 체력바가 없으면 피곤할 것 같지만, 체력에 따른 패턴 설계와 부가적인 가시 요소로 인해 오히려 더욱 재미있게 플레이할 수 있다.
내가 제작하고 있는 게임 또한 일반적인 쿼터뷰 형식의 RPG이고 몬스터의 체력에 따른 패턴이 달라지는 구조는 아니라서 당연히 체력바가 있어야 플레이가 편할 것이다.
구현 내용
우선 화면에 표시되는 체력바를 타입이 'Filled'인 이미지 UI로 만들어 프리팹으로 저장한다.
UI가 메인 카메라와 겹치면 안되므로 UI Camera를 따로 만들어 Canvas에 지정하고 UI Camera에서 Clear Flags 속성을 'Depth Only'로 설정한다. 이렇게 해야 메인 카메라가 화면을 독점하지 않는다.
우선 체력바가 화면에 표시되는 로직은 다음과 같다.
- 카메라의 3D 월드 좌표를 2D 스크린 좌표로 변경하는 WorldToScreenPoint 함수를 이용해 저장한다.
- 위에서 저장했던 좌표값을 이용하여 2D 스크린 좌표를 UI Canvas의 좌표로 변경하는 ScreenPointToLocalPointInRectangle를 사용해 체력바의 위치를 설정해준다.
영상을 보기 전엔 구현하기 굉장히 어렵다고 생각했는데 꽤 구조가 간단해서 놀랐다.
몬스터가 스폰되면 체력바를 생성함과 동시에 오프셋과 타겟 트랜스폼이 지정된다.
몬스터 약간 위에 체력바가 생기도록 해서 좌표값을 구하고 Canvas에 좌표를 뿌려주면 끝이다.
LateUpdate문 중앙에 있는 _screenPos.z에 관한 조건문이 핵심이다. Canvas는 x축과 y축만 존재하기 때문에 몬스터가 카메라 뒤에 있는 상황에서는 체력바가 보여선 안된다. 그래서 _screenPos.z가 0 미만일 경우 오브젝트를 비활성화해주고 0 이상인 경우에만 활성화해줬다.
체력바가 생성되는 코드는 몬스터 스크립트에 있다.
몬스터가 생성되는 동시에 SetHpBar 함수가 호출되는데 체력바 프리팹으로부터 오브젝트를 가져와서 변수들을 설정해줬다.
몬스터가 데미지를 받았을 경우 현재 Hp / 전체 Hp 비율로 fillAmount 값을 설정해주면 때릴 때마다 체력바가 닳게 된다.
구현 후기
처음에 구현하려고 했던 방법은 몬스터 프리팹의 자식 오브젝트로 Canvas를 만들고 WorldSpace로 지정해서 각 몬스터마다 각자의 체력바를 가지도록 하려고 했는데 회전 값 때문에 실패했다.
위의 방법대로 할 경우 몬스터가 회전하면 UI도 같이 회전해버려서 제대로 볼 수 없었다. 이걸 해결하는 방법으로 빌보드(BillBoard)라는게 있다고는 한다.
어쨌든 UI를 자유자재로 활용하기 위해서는 3D 좌표와 2D 좌표에 대한 이해가 더 필요하다고 느꼈다. 여러 차원에서 좌표값을 다룰 수 있어야 가시성 좋은 UI를 만들 수 있을 것 같다.
'Unity > Devlog' 카테고리의 다른 글
[Unity 3D] 퀘스트 (0) | 2023.01.09 |
---|---|
[Unity 3D] Collider의 크기를 넘겨줄 때 주의사항 (0) | 2023.01.09 |
[Unity 3D] 몬스터 체력바 수정 (0) | 2023.01.06 |
[Unity 3D] 플레이어 스탯 관리 (0) | 2022.05.18 |
[Unity 3D] 범위 내의 적을 추적하는 스킬 구현 (2) | 2022.05.16 |