-
Enemy로 사용될 Bird Sprite 들은 유니티 에셋 스토어에서 무료로 다운로드하였습니다.
이 새(Enemy) 들은 맵의 좌/우 한 방향으로 이동을 하며
1. 총 3종류로 각 스피드가 다릅니다.
2. Atk(공격 물체)에 맞으면 드롭되는 아이템들도 다릅니다.
3. 종류 : 코인 / 똥 / 버프
로 크게 3가지를 구성 계획으로 잡았습니다.
이제부턴 Monster/새/ 등을 Enemy로 칭하겠습니다.
Enemy에게 RigidBody2 D 컴포넌트를 추가시켰습니다.
중력을 받으면 안 되기에 RigidBody2 D 영역에 있는 Gravity Scale은 0으로 바꿔 주었습니다.
스크립트에 들어가기에 앞서 애니메이션을 Idle로 칭해 만들어 주겠습니다.
Enemy의 스크립트입니다.
birdSpeed_를 public으로 Enemy의 스피드를 인스펙터 창에서 변경되도록 하였고
birdDir로 Enemy의 방향을 지정하게 하게끔 만들려고 선언해 두었습니다.
BirdSet함수를 보면 birdSpeed는 지정한 birdSpeed_ 와 + 랜덤 1f - 3f의 값을 받아온 뒤
Enemy의 속도를 변경해 일정하지 않게 만들어 주었습니다.
이후 Enemy의 x축이 0보다 크다면 birdDir은 -1 (왼쪽)
그리고 SpriteRenderer의 flipX의 true/false를 통해 방향을 지정해 주었습니다.
이 함수는 OnEnable 함수에서 실행하게 하여
Enemy가 생성된다면 방향을 잡도록 만들었고
Update 대신 코 루틴 함수로 Translate 함수를 사용하여 이동시키게 했습니다.
Translate( 방향 * 지정 방향 * 스피드 * Time.deltaTime)입니다.
if(Mathf.Abs의 절댓값을 사용하여 Enemy의 현재 위치가 5보다 클 시 StopCorutine을 실행해 주었고
(Mathf.Abs의 함수는 -5 or 5 여도 절대값을 나타내 주는 함수입니다.)
SetActive를 사용해 비활성화를 시켜 주었습니다.
이제 Enemy가 피격받는 모션과 피격받았을 때 나오는 아이템들, 그리고 생성만 하면 완료될 것 같습니다.
우선 Enemy가 생성되는 부분부터 만들어 보겠습니다.
Enemy가 Create 되는 스크립트의 선언 부분입니다.
각 3종류의 Enemy들을 담아올 변수들과
생성될 시간의 변수들입니다.
코 루틴 함수로 이어서 만들어도 되지만, 코드 내용이 길어져 복잡해 지기에 CreateBird라는 함수를 새로 만들었습니다.
CreateBird(GameObject [] birdBox) : Enemy들이 담겨있는 변수를 GameObject []로 받아옵니다.
Enemy들은 맵 밖에서 소환되어야 하기 때문에 맵에 벗어난 x축 최소와 최대를 -4와 4로 체크하였고
int x를 랜덤 값으로 0과 1을 받도록 하여
50%의 확률로 0이면 x는 -4 / 1이면 x는 4로 지정해 주었습니다.
이후 for문을 통하여 Enemy들을 0부터 검색을 해주고
if(! birdBox [i]. activeSelf)의 조건문을 통하여 i번째의 Enemy가 비활성화되어 있다면
birdBox [i]. transform.position = new Vector2(x, Random.Range(1f, 5.5f))로
그 Enemy의 위치 중 x값을 -4 혹은 4로 지정,
y값은 체크한 맵 가운데와 최상단 사이로 랜덤 지정을 해주었습니다.
birdBox [i]. SetActive(true)
return마지막으로 그 Enemy를 활성화해주고 return으로 함수를 나가는 구현입니다.
CreateBird함수를 코 루틴 함수에서 실행시켜 주는 부분입니다.
코 루틴 함수에선 BirdCreate(GameObject [] Enemy, float time)을 받아 왔고
wile(true) 문으로 통하여
yield return new WaitForSeconds(time) 지정된 초를 기다렸다가
CreateBird(birdBox) 함수를 실행시킵니다.마지막으로 이 코 루틴 함수를 Start 함수에서 StartCorutine으로 실행시켜 줍니다.
BirdCreate(GameObject [] Enemy, 지정된 시간)
GameObject - Bird Creator 컴포넌트 x축 : -4 혹은 4의 값을 받은 위치와 y값 은 1f - 5.5f의 값으로 생성되어
랜덤 스피드로 날아가는 Enemy가 생성되는 모습이 완성되었습니다.
오브젝트 풀 방식이 처음엔 이해도 되지 않고 복잡한 면이 있었는데, 쓰면 쓸수록 코드가 손에 익어지고 기억에 더 오래 남는것 같습니다. 앞으로도 다양한 코드를 접하며 손으로 직접 쳐보고 보다 더 많은것을 구현해 보고 싶습니다.
코드 설명을 해야하는데, 제가 봐도 기법 수준이 매우 낮은것 같습니다. 보다 더 높은 기법들과 경험을 토대로 퀄리티 높은 작품을 만들어 보여드리고 싶습니다. 조금만 기다려 주세요 ㅎㅎ..
'유니티 프로젝트 > 2D.SpaceShooter' 카테고리의 다른 글
2D 슈팅게임 06. 시연 영상 (0) 2022.04.11 2D 슈팅게임 05. Enemy Hit 및 아이템 드롭 (0) 2022.04.11 2D 슈팅게임 03. 점프 및 공격 모션 (0) 2022.04.11 2D 슈팅게임 02. 캐릭터 이동구현 (0) 2022.04.10 2D 슈팅게임 01. 게임 디자인 및 준비단계 (0) 2022.04.09