ABOUT ME

천리 길도 한 걸음부터

Today
Yesterday
Total
  • Land Of Memories - Monster Movement & Player Attack
    유니티 프로젝트/RPG-2D

    안녕하세요.

     

    오늘 한 작업은 몬스터의 이동 구현과 

     

    플레이어의 공격 기능을 추가 작업 하였습니다.

     

     

     

    먼저 코드를 살펴보겠습니다.

     

    "MonsterMovement" 스크립트입니다.

     

    선언된 변수는 다음과 같습니다.

     

    특이사항으로는 obstacleLayer에는 Obstacle 레이어와 Player 레이어를 설정해 주었습니다.

     

     

     

    다음은 OnEnable() 함수를 통해 오브젝트(몬스터)가 활성화될 때 현재 

    리스폰이 될 때 사용할 저장 포지션인 initialPosition과

    이동될 때마다 저장될 현재 위치인 targetPosition입니다.

     

    다음은 InvokeRepeating를 사용하여 함수를 실행시켜주었는데요. 

    인자로는 (함수명, 첫 시작 시간, 반복 시간)입니다.

     

    정적 느낌을 없애기 위해 invokeTimer를 3~6초로 랜덤 하게 설정해 주었습니다.

     

    다음은 실제 실행될 함수 MoveRandomDirection()입니다.

     

    Vector2 Int 배열에 각 up, down, left, right를 설정해 주었으며

     

    이를 랜덤으로 받아왔습니다.

     

     

    다음은 if-else 조건으로 장애물이 있는지 판단을 하였는데요.

     

    먼저 장애물이 있을 때 실행될 IsObstacleInDirection()부터 살펴보겠습니다.

     

     

    이동 방향으로 레이를 발사하여 true, false를 나누어 주었습니다.

     

    다음은 else입니다.

    targetPosition(목표 위치)를 현재 방향을 더해주어 업데이트해주었습니다.

     

    Vector2(0, 0) + Vector2.right = Vector2(1, 0) 이 됩니다.

     

    이동은 코루틴을 활용하여 while문에서 MoveTowards로 해주었고

     

    조건은 현재 포지션이 목표 위치가 아니라면 실행이 되게 해 주었습니다.

     

    또한 이전에도 사용한 것과 같이 MoveTowards의 인자는

     

    (현재 위치, 목표 위치, 스피드)입니다.

     


     

     

    Hit()는 플레이어가 공격을 할 때 호출될 함수입니다.

     

    애니메이션은 Die의 Falg로 해주었으며,

     

    몬스터가 죽게 되면 CancelInvoke()로 모든 실행 중인 인보크 함수를 중지시킵니다.

     

    다음은 연출을 위해서 Invoke 함수를 사용했는데

     

    2초 후 실행될 AllReset()은 

    false였던 isDead 변수를 true로 변경시켜주고

    죽음 애니메이션 실행 중인 몬스터 오브젝트를 비활성화시켜줍니다.

     

    10초 후 실행될 ReviveAfterDelay() 함수는

    애니메이션을 Move 상태로 변경시켜주며

     

    초기 위치로 변경시켜 주어 활성화하여 리스폰되는 구현을 해보았습니다.

     


     

     

    다음은 PlayerAttack 스크립트에 추가된 플레이어가 공격을 할 때 실행될 함수입니다.

     

    레이캐스트의 인자를 살펴보자면

     

    (현재 위치, 공격 방향, 거리, 몬스터 레이어)입니다.

     

    현재 거리는

     

    로 1로 되어있습니다.

     

    예를 들어 공격 범위를 3으로 두어서

     

    몬스터를 한꺼번에 죽는 효과를 구현할 수 있겠다는 생각을 했습니다 ㅎㅎ

     

     

    코드를 이어서 보자면, hit 된 몬스터가 있을 경우 그 몬스터의 GetComponent로 접근하여

     

    "MonsterMovemet" 스크립트를 가져와 주었고

     

    이 안에 있는 Hit() 함수를 실행시켜 주었습니다.

     


     

    마지막으로 몬스터가 이동을 할 때 플레이어 레이어를 감지하는 것과 같이

     

    플레이어도 이동할 때 몬스터와 겹쳐지지 않기 위해 레이어를 추가하였습니다.

     


     

    중간중간 오류 및 수정이 약간 빈번했던 작업이었는데요.

     

    가장 크게 다시 한번 상기하게 된 점이.

     

    코루틴은 오브젝트가 비활성화되면 실행이 안된다는 점입니다.

     

     

    네 맞습니다. 현재 코드는 아닌 걸로 수정을 완료했습니다.

     

     

    또한 주석을 남기는 습관을 잘 들이자입니다.

     

    분명 명확한 의도를 갖고 작성한 코드인데

     

     작업을 다가 다른 작업을 하고 다시 와보면 '왜 이렇게 했지?'라고 생각이 들 때가 종종 있는데요

     

    흐름상 따라가서 보면 이해는 할 수 있었지만 시간이 약간 든다는 문제? 아닌 문제가 있었습니다.

     

     

    한 줄을 작성하더라도 주석 처리 작업을 잘해야겠습니다.

     

    (그냥 보이고 생각나면 주석으로 간단히 작성해 놓는 게 좋지 않을까..?라고 조심스레 생각을 합니다)

     


     

     

    감사합니다.

     

    댓글

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