ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 2D 슈팅게임 04. Enemy 제작
    유니티 프로젝트/2D.SpaceShooter

    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가 생성되는 모습이 완성되었습니다.

     

    오브젝트 풀 방식이 처음엔 이해도 되지 않고 복잡한 면이 있었는데, 쓰면 쓸수록 코드가 손에 익어지고 기억에 더 오래 남는것 같습니다. 앞으로도 다양한 코드를 접하며 손으로 직접 쳐보고 보다 더 많은것을 구현해 보고 싶습니다.

     

    코드 설명을 해야하는데, 제가 봐도 기법 수준이 매우 낮은것 같습니다. 보다 더 높은 기법들과 경험을 토대로 퀄리티 높은 작품을 만들어 보여드리고 싶습니다. 조금만 기다려 주세요 ㅎㅎ..

    댓글

김효겸 / Tel. 010-7735-0580 / E-mail. dollzzang2@hanmail.net