티스토리 뷰

뭔가 점점 1주 1회에서 벗어나고 있는 것 같긴 하지만

이번주의 개인 프로젝트가 종료되었습니다.

다소 아쉬운 점도 있었고, 전체적으로 헤맸던 느낌도 컸었지만, 어떻게 마무리는 되었네요.

 

※ 해당 git에 유료 Asset이 포함되어 있어서, URL을 지웠습니다.
    조만간 유료 Asset을 기본 Asset으로 대체하여 새로운 git을 제작, 업로드 하겠습니다.

 

플레이 영상 [BGM, 효과음은 게임 안에도 없습니다.]

 

 

 

목차

  • 구현된 기능 일람
    • 필수 구현 과제
    • 선택 구현 과제
    • 개인 구현 항목
  • 트러블 슈팅
    • 딪고 있는 물체와 함께 이동하기
    • 날라감! 처리하기.
    • 3인칭 시점과 그에 따른 이동 처리
  • 회고

 

구현된 기능 일람

필수 기능

기본 이동 및 점프

더보기
  • Input System을 이용하여 플레이어의 입력을 지원하였습니다.
  • 현재 적용 된 기능에는 이동, 점프, 대쉬, 달리기, 카메라 회전, 상호작용(습득)이 있습니다.

체력바 UI

더보기
  • 캐릭터의 능력치 자원을 최대치와 현재 수치, 회복량으로 구성한 뒤, Image를 가지고 있게 하여 해당 Image의 fillAmount를 조절하도록 구성하였습니다.
  • 체력바와 스테미너 바를 해당 방식으로 구현하였습니다.

동적 환경 조사

더보기
  • 카메라의 가운데에서 Raycast를 통해서 물체를 판별하도록 구성하였습니다.

점프대

더보기
  • 플레이어나 적, 아이템에 해당하는 Layer를 가진 물체가 닿을 시 위쪽으로 AddForce를 하도록 하는 초록 발판을 추가하였습니다.

아이템 데이터

더보기
  • 아이템의 데이터를 Scriptable Object로 구성하여 객체의 내부 데이터로 원활하게 사용할 수 있게끔 구성하였습니다.
  • 또한, 해당 데이터를 가지고 있는 Dictionary도 GameManager에서 들고 있도록 구성하여 전 객체에서 원활하게 정보를 받아올 수 있도록 구성하였습니다.

아이템 사용

더보기
  • 아이템을 습득 후 사용하도록 하지 않고, 필드에 놓여진 아이템에 상호작용하면 바로 사용되도록 구성하였습니다.
  • 아이템의 효과는 효과 종류 별로 개별로 적용되며, 효과 시간이 끝나면 효과가 없어지도록 구성하였습니다.
  • 구체적인 방식은 아이템 습득 시 효과를 캐릭터에게 부여하면서 능력치가 증가하고, 효과가 만료되면 효과가 제거되면서 증가한 능력치를 다시 감소시키는 방식입니다.

도전 기능

추가 UI

더보기
  • 상술한 캐릭터 자원(체력, 스테미너) 이외에도 점수, 제한 시간, 곰(추적자) 체력, 열차 지연도를 표시하게끔 구성하였습니다.

3인칭 시점

더보기
  • 캐릭터는 반드시 정면으로 이동하고, 이동 방향에 맞춰서 캐릭터가 회전하도록 구성하였습니다.
  • 추가로, 플레이어 캐릭터는 카메라 위치에 맞춰서 이동 방향이 보정되도록 구성되어 있습니다.

움직이는 플랫폼 구현

더보기
  • 캐릭터가 바닥에 닿아있는 지 판단할 때, 해당 바닥의 정보를 가지고 있으면서 해당 바닥의 위치 변화를 캐릭터에게도 적용하도록 구성하였습니다.
  • 본 프로젝트에서는 열차 상단부로 테스트가 가능합니다.

벽타기 및 매달리기 [미구현]

더보기
  • 캐릭터에 정면을 판정하는 Raycast를 높이가 다르게 3개를 구성, 전방 장애물의 높이를 없음 제외 3단계로 나눠서 판정한다 [구현 완료]
  • 만약 Raycast에 물체가 감지되었다면 이동 기능을 비활성화 한다. [미구현]
  • 높이 단계가 1이나 2라면, 전방 장애물의 높이에 맞춰서 타고 올라가는 기능을 추가한다 [미구현]
  • 높이 단계가 3일 때, 현재 체공 중이라면 중력이 무효화된 이후 이동 기능이 벽타기 기능으로 전환된다. [미구현]

다양한 아이템 구현

더보기
  • 본 프로젝트에는 총 5개의 아이템이 구현되어 있습니다.

장비 장착

더보기
  • 상호작용 시 영구 지속되는 아이템이 비치되어 있습니다.
  • 클래스는 소모품과 동일하게 사용하나, enum값을 이용하여 종류를 구분하고, 이를 습득하는 과정에서 종류에 따라서 다른 효과가 발휘되도록 구성하였습니다.

레이저 트랩

더보기
  • 열차의 전면부에 Raycast를 이용해서 플레이어 캐릭터를 감지하고, 감지되면 화면의 주의 문구를 활성화 하는 기능을 추가하였습니다.

상호작용 가능한 오브젝트 표시

더보기
  • 동적 환경 조사에서 사용한 Raycast에 감지된 물체에게 감지되었음을 알리는 기능을 추가하였습니다.
  • 아이템 오브젝트는 감지된 상태라면 World Space로 제작된 UI가 활성화되고, 감지 상태가 해제되면 비활성화 되도록 구성하였습니다.
  • 상호작용 정보 UI는 카메라 위치에 맞춰서 회전하도록 구성되어 있습니다.

플랫폼 발사기

더보기
  • 지정된 시간 동안 닿아있다면 정해진 방향으로 발사하는 빨간 발판을 추가하였습니다.
  • 추가로, 열차에도 전면부에 닿을 시 피해를 주면서 날려버리는 기능을 추가하였습니다.
  • 작동 방식은 AddForce로 구현하되, 일정 시간 및 조건에 따라서 캐릭터가 이동할 수 없게끔 구성하였습니다.

발전된 AI

더보기
  • 곰에게 AI Navigator 패키지의 Nav Mesh Agent를 부여하여 플레이어를 최적경로로 추적하도록 구성하였습니다.
    • 지면은 이동 가능 영역(비용 1)으로 구성하였습니다.
    • 건물과 분수는 이동 불가 영역으로 구성하였습니다.
    • 열차는 Nav Mesh Obstacle을 이용하여 방해물으로 판정되어 회피하도록 구성되어 있습니다.
    • 점프대 초록 발판은 이동 가능 영역(비용 2)으로, 발사대 빨간 발판은 이동 가능 영역(비용 3)으로 구성되어 있습니다.
  • 일정 거리 안에 있다면 멈춰서서 플레이어를 향해서 방향을 바꾸게끔 구성하였습니다.
  • 일정 거리 안에 있다면 일정 주기로 플레이어를 공격하도록 구성하였습니다.

개인 추가 기능

게임의 로직을 추가하였습니다.

더보기
  • 플레이어는 지정된 시간(200초) 안에 곰과 열차를 피해서 최대한 많은 공을 습득하여야 합니다.
  • 습득한 공에 따라서 점수 경험치가 축적되고, 경험치가 최대치를 넘길 시 점수 레벨이 높아지면서 경험치도 갱신됩니다.
  • 점수 레벨에 따라서 공의 출현 빈도가 상승합니다.
  • 최종적으로 결과 화면에서는 플레이어가 모은 레벨과 경험치 비율이 점수로서 표시됩니다.

타이틀 화면을 추가하였습니다.

더보기
  • 제목의 컨셉에 맞춰서 곰과 공이 자동으로 전환되는 방식으로 구성되어 있습니다.

 

트러블 슈팅

  • 딪고 있는 물체와 함께 이동하기
    • 얼마전에 TIL으로 작성한 바 있는 항목. Rigidbody를 이용해서 움직이는 물체에 캐릭터를 태울려고 하니 움직임을 따라가지를 않았습니다.
    • 1차적으로는 상단부에 Collider을 Trigger로 배치하여, 상단부에 접촉한 캐릭터를 움직이는 물체의 하위 오브젝트로 넣었다가 접촉이 끝나면 다시 빼는 방식으로 구현했었습니다.
      • 이 때에도 물체가 Rigidbody를 통해서 움직이고 있으니 캐릭터가 따라가지 못했었습니다.
      • 물체의 이동을 transform.position 변화로 변경하자, 이 때에는 정상적으로 작동하였습니다.
    • 다만, 이렇게 상단에 collier를 두는 방식으로 진행하면 '상단 측면에 닿으면 닿아있는 동안은 함께 이동한다'는 점을 깨닫고 방식을 바꾸기로 결정, 캐릭터에게 지면을 딪고 있는 판정을 하는 Raycast에서 딪고 있는 바닥의 정보를 가져와서 그 바닥의 이동에 따라가는 기능을 추가하는 방식으로 수정하였습니다.
  • 날라감! 처리하기.
    • 본 프로젝트는 캐릭터의 이동을 velocity 변화로 작성하였기에 단순히 AddForce만 사용하면 캐릭터가 날라가지 않습니다.
      [점프 방식을 구현하기 위해서 y축은 AddForce가 적용되도록 구성한 결과, 위로는 잘 날려지긴 합니다.]
    • 때문에, 날려지면 0.2초(변동 가능) 동안 이동 불가 상태로 만든 뒤, 공중에 있다면 이동 불가 상태가 풀리지 않도록 구성하여 정상적으로 날려지게끔 구성하였습니다.
  • 3인칭 시점과 그에 따른 이동 처리
    • 3인칭 시점일 경우, 카메라의 방향이 플레이어 캐릭터의 방향을 의미하지 않습니다. 카메라는 카메라 대로 회전해야 하며, 캐릭터도 캐릭터 대로 회전해야하는 구조입니다.
    • 다만, 그냥 단순히 카메라를 떼어놓는다면 기존에는 캐릭터의 방향 기준으로 입력값에 따른 이동을 했던 요소가 어그러지게 되어, 카메라의 위치에 관계 없이 입력값에 따른 이동 방향이 고정되게 됩니다.
    • 처음에는 이를 단순히 캐릭터에게 이동 방향으로 회전하도록 구성하여 해결하려고 했었습니다.
      • 다만, 이 경우에는 '캐릭터가 회전한다' → '캐릭터 기준 방향이 변경된다' → '무한 회전 캐릭터' 라는 문제가 발생하였습니다.
    • 이후에는 이동 방향 산정 기준을 카메라로 바꿔서 이동 방향을 제어하도록 구성했었습니다.
      • 이번에는 좌우 이동 속도는 괜찮은데 전진 및 후진 속도가 과하게 느려지는 문제가 발생했습니다.
    • 그래서 이번에는 카메라를 회전시키는 역할을 하는 '카메라 컨테이너'의 방향을 기준으로 하도록 수정하였습니다.
      • 각도 계산에 다소 시행착오가 있긴 했으나, 수정 결과 정상적으로 작동하는 것을 확인하였습니다.

 

회고

전체적으로 3D 환경을 처음 접하는 것이다 보니 숙련도 관련해서 난점이 많이 발생한 거 같습니다.

기능 구현과 버그 수정에서 이전에 2D 환경에서 작업할 때에 비해서 많이 버벅이고 느리다는 것을 체감했었습니다.

이외에도 후반부에는 시간에 쫓겨서 그렇다고는 해도 다소 난잡하게 구성되지 않았나 싶은 부분도 있습니다.

이외에도 방어 코드에 대해서도 익숙해질 필요가 있다고 느꼈습니다.

 

아무래도 연습이랑 공부를 좀 더 해서 더욱 원활하게 작업할 수 있는 숙련도를 가질 수 있도록 노력해야 할 거 같습니다.

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
글 보관함