공부/Unity

[Unity] 좀비 서바이벌 동그란 체력바 + 좀비 Ai (nav) + 피격판정

굴러다니다니 2023. 5. 2. 16:35
728x90

살아있는 것들의 공통 사항을 Script로 만들어 상속시켜주자

생명체로 동작할 오브젝트들이 모두 상속받을 클래스를 생성한다

Living Entity

- 체력을 가짐

- 체력 회복 가능

- 공격을 받을 수 있음

- 살거나 죽기 가능

 

필요한 부분들에 대해 변수 선언 및 처음 불릴때 상태 리셋을 해주었다.

여기서 health와 dead 친구들의 프로퍼티에 protected를 걸어준 이유는 접근 한정자 protected는 클래스 외부에서는 접근이 불가하고, 자식 클래스에서만 접근이 가능한데, LivingEntity를 모두 상속할 것이기에 상속하는 자식 개체에서만 변경할 수 있게끔 만들었다.

 

지지난 나의 게시글을 보면 Unity event를 다뤘는데, 이 부분을 이용하기 위해서였다.

사망시 onDeath에 저장된 이벤트들을 실행하기 위해 위에서 선언해주었다.

2023.05.01 - [공부/Unity] - [Unity] Unity event와 C# event의 차이점

 

[Unity] Unity event와 C# event의 차이점

C# event delegate vs Unity event Unity Event? 어떤 이벤트가 발생되면 그 이벤트에 등록해둔 기능이 발동 → 이벤트 발생시키는 쪽과 이벤트를 등록해둔 쪽 서로 관심이 없다 (언제 어떻게 등록, 실행이 되

dani2344.tistory.com

 

피해를 입는 OnDamage 메소드와 죽는 Die 메소드, 아이템등을 먹어 회복했을 때의 진행할 RestoreHealth 메소드를 선언해주었다.

 


플레이어를 감싸는 둥근 체력바 만들기!

이번의 체력바는 플레이어를 따라다니게 만들고 싶기 때문에 Player에서 Canvas를 추가해준다

 

캔버스의 render mode를 World Space (전역공간)으로 바꿔 준 다음, Rect Transform을 위에와 같이 맞춰준다

 

다음으로 UI > Slider를 눌러 slider를 만들어 준 뒤

Handle뭐시기는 삭제해버리고 아래에 3개를 전부 잡아 Anchor를 눌러 alt를 누르면서 오른쪽 아래 친구를 선택해준다

쭉쭉 늘어나버린 슬라이더의 모습

 

체력바의 이름을 바꿔주고 클릭해서 체력을 바꿀수 있게 할 것이 아니기에 Interactable 꺼주기

또한 클릭시에 컬러가 바뀌는 부분은 안필요해서 Transition -> None으로 하고 최대 체력값인 100으로 설정해두었다

 

Background 친구에게서 source image를 흰색 둥근 원의 png로 설정하고, color는 빨간색 + alpha값을 15로 바꿔주었다

 

Fill 친구는 괴상하게 늘어나있어서 stretch를 다시 해주고, 마찬가지로 이미지와 색을 넣고, 색의 alpha값을 115로 설정, 원으로 채워지게 Image Type을 Filled로 바꿔 잘 작동하는지 확인해준다

 

이런 식으로 나왔다면 성공!

 

이를 연결시키기 위한 PlayerHealth Script를 만들어보자

 

playerHealth는 Monobehaviour이 아닌 만들어둔 LivingEntity를 상속받아 필요한 부분들을 선언하고 Awake로 받아왔다

 

LivingEntity에서 선언해둔 OnEnable과 RestoreHealth를 override로 가져와 한번씩 실행하고, 체력바 관련 변수를 추가하고 playerMovement, playerShooter를 활성화시켰다

 

onDamage를 가져와 살아있다면 다친 소리를 내주고, 체력을 깎아준다.

만일 죽었다면 체력창을 비활성화하고 죽는 소리와 애니메이션을 실행하며 플레이어의 움직임을 막아준다.

 

Player에게 Player Health 컴포넌트를 넣어주고 연결시켜준다!  play on awake를 끈 audio Source를 넣어준다 끝!

 


유니티 내장 내비게이션을 이용한 좀비 AI 구현

프리팹의 좀비를 들고와 unpack 해준 뒤, animator를 연결해준다

 

Unity에서 제공하는 AI navigation을 누르고 Bake -> 꿉꿉 구워준다!

 

우상단 Gizmos를 누르면 맵이 구워진 모습이 보인다

 

좀비의 위치를 판단하기 위한 캡슐 콜라이더와 공격 범위를 지정할 박스 콜라이더가 필요하다

위와 같이 설정하고 만들어주자 + 오디오 소스는 덤

 

내비게이션을 사용하기 위해 nav mesh agent 컴포넌트를 추가해주고, Zombie Controller Script를 만들어서 넣어줬다.

 

Zombie Control에서 필요한 변수를 선언하고 awake문으로 이를 가져와준다.

Renderer를 가져오기 위해 자식개체에 접근해 가져오고, 추적할 대상이 존재하는지 프로퍼티를 작성해 확인해준다

 

그 전에 좀비 데이터를 저장하기 위한 scriptable object를 만들기 위해 zombieData script를 위에와 같이 작성해준다

 

그리고 Zombie controller script에서 setup 함수를 만들어 이를 연결시켜준다

 

override를 통해 총알에 맞으면 해당 방향으로 effect를 만드는  onDamage를 재정의하고, Die상태도 collider가 box, capsule 두개이기 때문에 그 둘을 전부 false처리하고, 내비게이션도 멈추게 만든다

 

코루틴과 navMesh를 이용해 player의 위치를 찾고 살아있는지 판별해 이를 타겟으로 만드는 코루틴을 만든다

시작시 코루틴으르 시작하고 update문을 통해 target이 있는지 없는지를 zombie bool 값에 연결해 걷는 애니메이션을 보일지 말지를 설정한다

 

living entity에서의 ondamage와 die를 override로 참조해 맞은 위치로 피가 튀게 만들거나 소리재생, 활성화를 끈다

 

좀비의 ontriggerstay문을 만들어준다

만일 내가 안죽었고, 마지막 공격 속도에 들어왔고, 부딪힌 친구가 livingEntity를 가지고있고, 내가 추적하는 대상과 같은 대상이라면 실행한다.

피격 포인트와 방향을 설정하고, player가 다친 메소드를 호출한다

 

플레이어의 태그와 layer를 player로 설정해준다

 

zombie의 자식으로 피가 튀는 파티클을 넣어주고, zombie Controller의 값을 위와같이 설정해준다

 

놓친부분!

인터페이스 상속시켜주자!

 

OnTriggerStay 대문자 맞춰서 쓰기

 

죽으면 죽는 애니메이션까지 연결

 

맞으면 체력바가 줄어든다!

 

좀비도 잘 죽는다! 오케이!

728x90