비교적 간단할것 같던 데미지 수치의 표시를 하는 과정이 꽤 복잡한편이었다. 데미지 숫자를 계속 보여줄게 아니기때문에 State를 관리해서 시간이지나면 사라지게 만들어야하고 사라질때 서서히 흐려지며 사라지도록 애니메이션 효과가 필요했다.
총알 데미지를 화면에 표시하기
데미지 UI 클래스
- UIDamage 스크립트 생성
- using UnityEngine.UI 추가
- SerializeField로 Text damageText 변수 추가
- 상태 열거형 정의 None/SizeUp/Display/FadeOut
- ShowDamage 메소드
- Reset 메소드
- UpdateDamage 메소드
- string FilePath 프로퍼티
데미지 오브젝트 만들기
- Text UI를 추가해서 DamageText 라고 이름 변경
- 상하 좌우 모두 중앙 정렬
- 칼라 조정 : 붉은 색
- UIDamage 스크립트 어태치
- 프리팹으로 저장
데미지 오브젝트도 앞서 다른 오브젝트가 그랬던것처럼 생성과 삭제가 매우 반복이되기때문에 캐싱 시스템을 만든다.
앞에서 했던 작업과 동일한 작업을 적용한다고 볼 수 있다.
데미지 매니저 제작 (1)
- SystemManager에 DamageCacheSystem 추가
- DamageManager 스크립트 생성
- DamageManager에서 EffectManager와 유사하게 데미지를 로드해서 DamageCacheSystem을 사용
- SystemManager에 DamageManager의 참조 변수로 추가
데미지 매니저 제작 (2)
- UIDamage 클래스에서 상태가 None 으로 변할 때 DamageManager 에서 제거
- 게임 오브젝트를 생성해서 DamageManager 어태치
- SystemManager의 DamageManager 변수에 링크
데미지 매니저 제작 (3)
- PrefabCacheSystem의 GenerateCache 인자를 부모 Transform을 받을 수 있도록 확장하고 Instantiate 호출 시 같이 전달
- DamageManager에 Canvas의 Transform을 링크할 변수를 추가하고 GenerateCache를 호출할 때 인자로 전달
UI 데미지 생성 호출
- Enemy 클래스에 DecreaseHP를 오버라이드 하고 데미지 생성을 호출
- Player 클래스에 오버라이드 된 DecreaseHP에서 데미지 생성을 호출
3D 위치를 화면 위치로 계산하는 방법
- Camera.main.WorldToScreenPoint
- DamageManager의 Generate 메소드에서 데미지 UI의 위치 값을 넣어줄 때 WorldToScreenPoint로 변환해서 넘겨 줘야 정상적으로 출력
데미지 숫자가 나타나는 위치의 계산도 생각외로 복잡한 부분이 있다.
데미지 출력 잔여 처리
- Player와 Enemy 데미지 구분
- 데미지 위치의 보다 정확한 표현을 위해 데미지 발생시 위치값도 같이 전달
https://fastcampus.co.kr/dev_online_game
본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.