플레이어 캐릭터의 체력을 구현하기 전에 먼저 체력을 띄울 UI를 구현하겠습니다. 체력은 원형 슬라이더로 플레이어 캐릭터의 몸체에 표시됩니다.
- UI 슬라이더 준비
- 새 슬라이더 오브젝트 생성 : Create > UI > Slider
- 하이라키창에서 Cavas 게임오브젝트 선택
- Cavas 컴포넌트의 Render Mode를 Word Space로 변경 -> 플레이어 캐릭터를 따라 다녀야 하므로
- Canvas Scaler 컴포넌트의 Reference Pixels per Unit를 1로 변경 -> 깔끔하게 보임
- 캔버스의 위치와 크기 설정
- Canvas 게임 오브젝트를 Player Chracter 게임 오브젝트의 자식으로 만들기
- Canvas 게임 오브젝트 선택
- Rect Transform 컴포넌트의 위치를 0, 0.3, 0 Width와 height를 1로 변경
- Rect Transform 컴포넌트의 Rotation을 (90, 0, 0)으로 변경
- 슬라이더 크기 변경
- 하이라키창 Canvans 옆 펼치기 버튼을 Alt+클릭로 펼침
- Handle Slide Area 게임 오브젝트를 Delete
- Slider, Background, Fill Area, Fill 게임 오브젝트를 모두 선택
- 앵커 프리셋 클릭 > Alt를 누른채 우측 하단의 stretch클릭
- 슬라이더 컴포넌트 설정
- Slider게임 오브젝트 선택> 게임 오브젝트의 이름을 Health Slider로 변경
- Slider 컴포넌트에서 Interactable 체크 해제 - 상호작용 못하게
- Transition을 None으로 변경 - 색반응 못하게
- Max Value의 Value를 100으로 변경
- 슬라이더 배경 이미지 변경
- 하이라키창 Background게임 오브젝트 선택
- Image컴포넌트의 Source Image에 Health Circle 스프라이트 할당
- Image 컴포넌트의 칼라필드 클릭 > 알파를 30으로 변경
- 슬라이더 Fill이미지 변경
- Fill 게임 오브젝트 선택
- Image 컴포넌트의 Soruce Image에 Health Circle 스프라이트 할당
- Image 컴포넌트의 Color 필드 클릭> 컬러를 (255,0,0,150)으로 변경
- Image Type을 Filled로 변경
- PlayerHealth 스크립트
- LivingEntity의 생명체 기본 기능
- 체력이 변경되면 체력 슬라이더에 반영
- 공격받으면 피격 효과음 재생
- 사망시 플레이어의 다른 컴포넌트를 비활성화
- 사망시 사망효과음과 사망 애니메이션 재생
- 아이템을 감지하고 사용
- 스크립트 설명
- PlayerHealth 클래스는 LivingEntity를 상속합니다.
- healthSlider를 연결합니다.
- Awake() : 사용할 컴포넌트를 가져옵니다.
- LivingEntity로 상속된 메서드를 오버라이드 합니다.
- public override void OnEnable() : PlayerHealth컴포넌트가 활성화될 때마다 체력상태를 리셋하는 처리를 구현
- base.OnEnalbe()에 의해 부모메서드 health = startingHealth 가 먼저 실행됨
- 체력 슬라이드, Player, shotter등을 활성화합니다.
- public override void RestoreHealth()
- LivingEntity클래스의 ResotreHealth()를 오버라이드 합니다.
- 체력을 회복하는 처리는 이미 상속되었고 여기서는 슬라이더에 반영하는 처리를 추가합니다.
- public override void OnDamage()
- 상속되는 기능외에 효과음을 재생하고 체력 슬라이더를 갱신합니다.
- public override void Die()
- 상속되는 기능외에 사망 애니메이션과 효과음을 재생하고 체력 슬라이더를 비활성처리합니다.
- OnTriggerEnter()
- 트리거 충돌한 상대방 게임 오브젝트가 아이템인지 판단하고 아이템을 사용하는 처리
- 충돌한 객체를 IItem item으로 받아 item.Use()메서드로 느슨한 인터페이스 실행
private void OnTriggerEnter(Collider other) {
IItem item = other.GetComponent<IItem>();
item.Use(gameObject);
PlayerHealth.cs 전체코드 Player게임오브젝트에 추가.
using UnityEngine;
using UnityEngine.UI; // UI 관련 코드
// 플레이어 캐릭터의 생명체로서의 동작을 담당
public class PlayerHealth : LivingEntity {
public Slider healthSlider; // 체력을 표시할 UI 슬라이더
public AudioClip deathClip; // 사망 소리
public AudioClip hitClip; // 피격 소리
public AudioClip itemPickupClip; // 아이템 습득 소리
private AudioSource playerAudioPlayer; // 플레이어 소리 재생기
private Animator playerAnimator; // 플레이어의 애니메이터
private PlayerMovement playerMovement; // 플레이어 움직임 컴포넌트
private PlayerShooter playerShooter; // 플레이어 슈터 컴포넌트
private void Awake() {
// 사용할 컴포넌트를 가져오기
playerAnimator = GetComponent<Animator>();
playerAudioPlayer = GetComponent<AudioSource>();
playerMovement = GetComponent<PlayerMovement>();
playerShooter = GetComponent<PlayerShooter>();
}
protected override void OnEnable() {
// LivingEntity의 OnEnable() 실행 (상태 초기화)
base.OnEnable();
// 체력 슬라이더 활성화
healthSlider.gameObject.SetActive(true);
// 체력 슬라이더의 최대값을 기본 체력값으로 변경
healthSlider.maxValue = startingHealth;
// 체력 슬라이더의 값을 현재 체력값으로 변경
healthSlider.value = health;
// 플레이어 조작을 받는 컴포넌트들 활성화
playerMovement.enabled = true;
playerShooter.enabled = true;
}
// 체력 회복
public override void RestoreHealth(float newHealth) {
// LivingEntity의 RestoreHealth() 실행 (체력 증가)
base.RestoreHealth(newHealth);
// 체력 갱신
healthSlider.value = health;
}
// 데미지 처리
public override void OnDamage(float damage, Vector3 hitPoint,
Vector3 hitDirection) {
if (!dead)
{
// 사망하지 않은 경우에만 효과음을 재생
playerAudioPlayer.PlayOneShot(hitClip);
}
// LivingEntity의 OnDamage() 실행(데미지 적용)
base.OnDamage(damage, hitPoint, hitDirection);
// 갱신된 체력을 체력 슬라이더에 반영
healthSlider.value = health;
}
// 사망 처리
public override void Die() {
// LivingEntity의 Die() 실행(사망 적용)
base.Die();
// 체력 슬라이더 비활성화
healthSlider.gameObject.SetActive(false);
// 사망음 재생
playerAudioPlayer.PlayOneShot(deathClip);
// 애니메이터의 Die 트리거를 발동시켜 사망 애니메이션 재생
playerAnimator.SetTrigger("Die");
// 플레이어 조작을 받는 컴포넌트들 비활성화
playerMovement.enabled = false;
playerShooter.enabled = false;
}
private void OnTriggerEnter(Collider other) {
// 아이템과 충돌한 경우 해당 아이템을 사용하는 처리
// 사망하지 않은 경우에만 아이템 사용가능
if (!dead)
{
// 충돌한 상대방으로 부터 Item 컴포넌트를 가져오기 시도
IItem item = other.GetComponent<IItem>();
// 충돌한 상대방으로부터 Item 컴포넌트가 가져오는데 성공했다면
if (item != null)
{
// Use 메서드를 실행하여 아이템 사용
item.Use(gameObject);
// 아이템 습득 소리 재생
playerAudioPlayer.PlayOneShot(itemPickupClip);
}
}
}
}
PlayerHealth 컴포넌트 설정
'유니티좀비게임 > 생명과 좀비' 카테고리의 다른 글
좀비 스크립트 (0) | 2023.05.03 |
---|---|
좀비(Enemy) 오브젝트 준비 (0) | 2023.05.03 |
네비게이션 시스템 (0) | 2023.05.03 |
Event (0) | 2023.04.28 |
객체지향 다형성 LivingEntity (0) | 2023.04.28 |