본문 바로가기

Unity/기능 업데이트

[Unity] 더 강력한 좀비 추가 (유니티 언데드서바이버 강좌 기반 업그레이드 하기 #1)

 

 

 

 

 

 

 

유니티 기초 뱀서라이크🧟언데드서바이버

요즘 인기많은 장르인 뱀서라이크를 직접 유니티로 개발해보아요!

www.youtube.com

해당 게시글은 골드메탈님의 Undead Survivor 게임 강좌를 기반으로 진행되었습니다.

기능 업데이트를 통한 내용 복습의 목적으로 작성된 글입니다.

 

 

 

 


#1
기존에 추가했던 좀비 2종 이외의 제공된 에셋을 바탕으로
이동 속도가 빠르고 피통이 더 큰 3번째 좀비를 만들어보자.

 


 

 

 

1. 애니메이션 컨트롤러와 속성 할당


 

Enemy 프리펩 하나에 컨트롤러 배열(Anim Con)을 만들어 Enemy의 애니메이션을 관리했다.

 

크기 2로 되어 있던 기존 배열을 크기 3으로 늘린 뒤, 3번째 Enemy의 애니메이션 컨트롤러 삽입

 

 

 

Spawner 스크립트에서 작성한 클래스인 SpawnData를 Serializable 하여 인스펙터 창에서 관리할 수 있도록 했다.

 

Spawner 스크립트에서 선언한 SpawnData 클래스의 값을 담은 배열의 값 또한 3으로 늘린 뒤

3번째 Enemy의 Spawn Time / Sprite Type / Health / Speed 값을 설정

 

 


 

사실 이렇게만 해주어도 ( 전체 시간 / SpawnData 배열 크기 )에 따라 시간이 지나면 3번째 Enemy는 출연한다.

하지만 이렇게 추가된 3번째 Enemy는 Dead 애니메이션 실행 후 사라지지 않는 문제가 발생한다.

 

Enemy, Spawner, PoolManager 하다못해 GameManager까지 살펴봐도 Enemy를 비활성화하는 Dead 함수를 찾아볼 수 없어 강의를 다시 살펴보았고...

 

 

 

이는 해당 강좌의 17분대에서 해답을 찾을 수 있었다.

 

" 애니메이션 컨트롤러 속 이벤트 추가 "


 

 

 

2. Dead 애니메이션 컨트롤러 이벤트 추가


 

 

3번째 Enemy의 Dead 애니메이션을 살펴보자.

 

 

기존의 Enemy 1
새로 추가하려는 Enemy 3

 

기존 Enemy의 Dead 애니메이션에는 1초 뒤 Enemy가 사라지는 이벤트(함수)를 추가했다.

 

Enemy 3의 Dead 애니메이션에는 Enemy 스크립트의 Dead 함수를 추가해주는 이벤트가 없기 때문에 사라지지 않았던 것.

 

 

 

0:00 대에 키프레임을 복사해 1:00 (1초)에 붙여 넣고, Add event 로 이벤트 추가

 

 

 

컨트롤러가 존재하는 Enemy 프리펩을 더블 클릭한 뒤, Animator 항목의 Controller를 AcEnemy 3으로 변경

 

 

 

이후 애니메이션 컨트롤러로 돌아와 DeadEnemy 3로 변경한 뒤

 

 

 

추가한 Event (흰색 바) 클릭 후 인스펙터창에서 Dead() 함수 설정

 

 

 

 

짜잔!

새로 추가한 Enemy 3가 잘 생성되고, 잘 사라지는 모습을 확인할 수 있다.

 

 

 

오브젝트 풀링에서 생성되는 Enemy 3의 애니메이션 컨트롤러는 물론, 설정한 데이터 속성대로 잘 실행되는 모습을 확인할 수 있다.

 

 

 

 


 

Spawner 스크립트의 Spawn 함수 중 Enemy 컴포넌트로 접근해 초기화하는 부분을 이해할 필요성을 느낌

 

void Spawn()
    {
        // Get : GameObject 반환
        GameObject enemy = GameManager.instance.pool.Get(0); // Enemy 프리팹만 가져옴
        // 자식 오브젝트에서만 선택되도록 랜덤 시작은 1부터
        enemy.transform.position = spawnPoint[Random.Range(1, spawnPoint.Length)].position;
        // 오브젝트 풀에서 가져온 오브젝트를 Enemy 컴포넌트로 접근
        enemy.GetComponent<Enemy>().Init(spawnData[level]);
    }