ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Land Of Memories - Player Attack (Basic)
    유니티 프로젝트/RPG-2D

    우선 가장 먼저 수정 사항이 있어 작성하도록 하겠습니다.

     

     

    플레이어가 이동하려는 방향에  'Obstacle' 레이어를 갖은 콜라이더가 있으면

     

    이동이 안되게 구현이 되어있습니다.

     

     

    하지만 위와 같은 동작 구현이 되었을 때 위로 보는 방향키를 눌러도 위를 바라보지 않고 멈춰있는 현상이 있었습니다.

     

     

    코드를 보면 장애물이 있다면 if-else에 else로 들어와 이동했던 방향의 Idle 애니메이션을 실행하는데요.

     

    장애물이 있다고 판단하고 방향(direction)을 업데이트해주지 않아 발생한 문제였습니다.

     

     

    이제 이동을 할 때 장애물에 막혀있다면, 이동은 하지 않더라도 방향은 업데이트가 됩니다.

     

     

     


     

    다음은 플레이어의 기본 동작 구현 했습니다.

     

    크게 3가지를 구상해 보았는데요.

     

    1. 애니메이션 클립을 좌, 우, 업, 다운 4개를 갖는다.

    Attack_Basic_Up

    Attack_Basic_Down

    Attack_Basic_Left

    Attack_Basic_Right

     

    2. 이동중이 아닐 때만 공격이 가능하게 한다.

    PlayerMovement 스크립트의 이동 중인지 판단하는 isMoving 변수 활용

    PlayerMovement 스크립트의 방향을 나타내는 direction 변수 활용

     

    3. 방향에 맞게 애니메이션 클립을 재생한다.

    Play()

     


     

     

     

    첫번째로 Sprite Editor를 사용하여 중심점을 맞춰 주었습니다.

     

    제가 원하는건 재자리에서 '기본 공격'을 원하기에

     

    중심점을 맞추면서 동작 테스트를 해보는데

     

    시간이 약간 소요되었습니다.

     

     

    개인적으로 느낀점은 Sprite의 중심점만 잘 맞춰도

     

    다양한 연출을 무궁무진하게 펼칠 수 있겠다는 생각이 들었습니다.

     


     

     

    두 번째로는 스크립트의 direction 변수와 isMoving 변수를 public으로 선언하여 외부에서 접근이 가능하게 해 주고

     

    GET SET을 사용해서 get만 공개하여 읽기 전용으로 만들어 주었습니다.

     

    즉, 외부에서 수정할 수 없도록 구현해 보았습니다.

     


     

     

    다음은 PlayerAttack 스크립트를 생성해 주었습니다.

     

     

    위에서부터 살펴보겠습니다.

     

    먼저 PlayerMovement 스크립트와 플레이어의 Animator 컴포넌트를 받아와 주었습니다.

     

    다음 isAttacking Flag를 둔 이유는

     

    공격 중일 때 이동과 재공격이 안되게 하기 위함입니다.

     

     

    공격 키는 Space로 설정해 주었습니다.

     

    다음 Attack() 함수를 살펴보겠습니다.

     

    PlayerMovement의 읽기 전용인 isMoving의 값을 받아와 이동 중이 아닌지와

    현재 공격 중이 아닌지 판단할 변수 isAttacking을 활용해 조건문을 걸어 주었습니다.

     

    또한 공격을 하면 즉시 isAttacking을 true로 변경하여 공격중 재사용이 안되게 하였습니다.

     

    애니메이션을 선택하여 실행시킬 함수인

     

    SetAttackAnimation() 함수입니다.

     

    인자로는 direction = Playermovement의 direction 변수의 값입니다.

     

    마지막으로 isAttacking을 다시 false로 시켜줄 이벤트 함수입니다.

     

    애니메이션 클립의 끝 지점에 이벤트를 연결해 주고

     

    이벤트 함수를 연결시켜 주었습니다.

     


     

    여기서 원하지 않는 상황이 크게 2가지 있었습니다.

     

    초기 PlayerMovement의 direction 값이 정해지지 않아서,

     

    게임 시작 후 바로 Space를 눌러 공격을 하면

     

    공격이 실행되지 않는 점이었는데요.

     

    간단히 PlayerMovement 스크립트의 direction 값을

     

    Vector2 Int.zero -> Vector2 Int.down으로 변경해 주어 해결을 하였습니다.

     

    다음은 

     

    공격 애니메이션이 실행되지 않는 문제였습니다.

     

    공격 애니메이션만 보면 잘 실행이 되지만,

     

    공격 도중 이동을 하게 되면

     

    애니메이션 끝 지점에 isAttacking을 false로 변경시켜 주는 동작이 실행 안되어

     

    isAttacking이 true로 남아있게 되어 공격이 안 되는 현상이었습니다.

    (isAttacking을 public으로 변경하여 선언한 이유입니다.)

     

     

    playerAttack.isAttacking이(빨간펜 라인) false일 때 조건문을 걸어 

     

    기존 로직(파란펜 라인) 이 실행되게 하였습니다.

     

     

     


     

     

    뭔가 코드를 많이 작성한 건 아니지만, 중간중간 수정하는 일이 빈번했습니다.

     

     

    전체적인 흐름을 구성하고 생각하여서 코드를 짜는 사람과

     

    하나씩 테스트하면서 그때그때 바꿔 줘야 하는 사람의 

     

    일의 능률은 많이 크다고 생각합니다.

     


     

    무언가 생각이 많아지는 하루였는데요..

     

    비교적 작은 일을 하더라도 확실하게.

     

    전체적 흐름을 구상하고 계획하여 나아가는 습관을 기르겠습니다.

     


     

    감사합니다.

     

     

     

     

     

    '유니티 프로젝트 > RPG-2D' 카테고리의 다른 글

    Land Of Memories - Tile Map  (0) 2024.11.14
    Land Of Memories - Camera Follow  (0) 2024.11.13
    Land Of Memories - Player Movement (Anim)  (0) 2024.11.13
    Land Of Memories - Player Movement  (0) 2024.11.12
    Land Of Memories - Prolog  (0) 2024.11.12

    댓글

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