Unity

개발일지 - 프로토타입 구현 기획 작성 및 구현 내역

devrabbit22 2025. 10. 16. 17:25

현재 진행 중인 개발 내역이 혼동되지 않도록 Notion에서 문서를 통해 기획, 계획 및 작업 내용 정리

Notion에서 할 일 과 진행중인 일 완료된 작업 목록을 정리해 프로젝트 진행

  • 러너형 게임의 이동 메커니즘은 플레이어는 제자리에 있으며 맵이 크롤링하며 이동하는 것이다.
  • 플레이어는 제자리에서 점프, 슬라이딩, 공격과 같은 행동만 하고 직접적인 이동은 맵만 이동한다.
  • 각 스테이지마다 콘셉트에 맞게 개발된 각 스테이지마다 다른 배치의 함정들을 피해 골인 지점으로 이동하는 것이다.
  • 현재는 체력이 지속적으로 감소하는 것이 아닌 체력의 개수가 감소한다.
  • 우선은 이 기능을 그대로 구현했다.
예전에 임시로 구현한 점프런 게임인데 이때는 플레이어가 직접 오른쪽으로 이동하며 각 플랫폼에 밀려 떨어지기도 하며, 방해물에 밀려 좌측에 붉은 오브젝트에 닿거나 떨어지면 게임 오버되는 간단한 형식으로 구현하려 했다.

플레이어 행동

여러 가지 캐릭터들이 기본적으로 행동하게 되는 공통된 행동을 스크립트로 묶어 구현했습니다.

플레이어 행동과 정보를 플레이어 오브젝트가 보유 중

점프

  • 점프는 Space bar를 누르면 점프하도록 구현했습니다. (2단 점프까지 가능합니다)
  • 구현한 점프 메서드는 update에서 지정한 키를 누르면 Request를 받아 Fixedupdate에서 해당 Request가 true가 될 경우 실행되도록 구현했습니다.
  • 왜냐하면 Rigidbody의 물리 연산은 FixedUpdate 주기로 처리되므로, Update에서 직접 점프를 실행하면 프레임 속도에 따라 물리 계산이 달라질 수 있기에 점프 Request는 Update에서 받고, 실제 물리 처리는 FixedUpdate에서 수행하도록 분리했습니다.

슬라이딩

슬라이딩의 경우 Ctrl을 누르고 있는 동안 슬라이딩을 한다.현재 임시로 사용하고 있는 스프라이트와 애니메이션의 Pivot을 조절하지 않았고, 이에 따라 collider의 위치가 원하는 위치와 다른 곳에 배치되는 경우가 있었기에 코드를 통해 해당 스프라이트의 크기에 맞추도록 조절하도록 구현했습니다.

현재는 값을 고정해 놓았지만, 나중에 다른 스프라이트들을 사용하면 해당 스프라이트에 맞게 수정할 예정입니다.
슬라이딩 키가 입력되면 슬라이딩을 시작하고 키가 떨어지면 슬라이딩을 종료하는 형식으로 구현했습니다.

이렇게 분류한 이유

if (Input.GetKey(slideKey) && connectGround && !isSliding)
{
    isSliding = true;
    Slide(isSliding);
}

if ((Input.GetKeyUp(slideKey) || !connectGround) && isSliding)
{
    isSliding = false;
    Slide(isSliding);
}

처음에 빠르게 구현하려고 위와 같은 방식으로 구현했으나 한눈에 보기 편하도록 분리하게 되었습니다.추가로, 임시로 맵을 구현하다보니까 약간의 단차로 인해 지면에서의 접촉이 떨어지면서 슬라이딩이 끊기는 현상이 발견되었으나 임시로 OnCollisionStay2D에서도 지면을 감지하도록 추가해 해당 문제를 수정했습니다.

 

공격

공격은 z 키를 누르면 공격을 한다.

공격에 조건을 두었다.

코루틴으로 구현해 공격 쿨타임을 추가했고, 캐릭터의 자식 오브젝트로 공격 범위를 지닌 것이 아닌 Physics2D.OverlapBoxAll을 사용해 공격 범위와 공격할 수 있는 오브젝트를 추가했다.

맵을 추후에 프리펩으로 만들 것이며, 오브젝트 내부에는 여러 개의 자식 오브젝트들로 각 기능을 분류했다.

각 자식 오브젝트 중 파괴 가능한 오브젝트들은 자식 오브젝트에 포함되어 있어 파괴되지 않았던 현상이 존재했습니다. 그래서 자식 오브젝트인지 확인하고 해당 조건을 만족하는 함정만 파괴되도록 구현했습니다.

Attack Coroutine 내부의 오브젝트 탐색 및 파괴

함정

일반적으로 함정들은 충돌하면 플레이어의 체력이 감소한다.

바닥에 설치된 함정,  공중에 설치된 함정
일반 함정이기에 보유중인 컴포넌트들은 다음과 같다.

해당 함정들은 큰 기믹이 있는 것도 아니기에 단순히 충돌(Trigger)감지를 통해 플레이어에게 피해를 준다.

혹시 모를 피격이 되었음에도 점프나 슬라이딩으로 두 번 피격을 당하는 것을 방지하고자 bool 변수를 통해 공격이 성공하면 해당 변수를 true로 변경해 재공격을 방지하도록 구현했다.

 

파괴 가능한 함정

특수한 기능이 있지 않은 일반적인 파괴 가능한 함정은 일반 함정과 동일하게 플레이어와 충돌하면 피해를 주는 스크립트를 가지고 있지만, 플레이어의 공격을 통해 해당 콜라이더를 탐지 후 Layer가 일치하면 파괴되도록 구현했습니다.

 

가속 지점 일정 구간을 지나면 점차 가속되는 투명한 구간

  • 이 오브젝트는 우선 함정으로 분류하긴 했지만 게임이 진행되면서 루즈해지지 않고 난이도의 상승을 위한 오브젝트이다.
  • 게임이 시작되고 도착 지점까지 동일한 속도로 진행되는 것보다 점차 속도가 증가해 속도감을 주며 빠르게 다가오는 오브젝트들을 피하거나 파괴해 목적지까지 도달하는 것이 게임이 지루해지지 않기 위해 꼭 필요한 요소라고 생각하기 때문에 해당 오브젝트를 추가했다.
  • 해당 오브젝트는 Player를 Trigger를 통해 인식하며 Player를 인식하는 방법은 함정과 동일하게 인식합니다.해당 오브젝트는 GameController를 통해 맵의 이동 속도를 올립니다.

게임 진행

게임 시작

  • 타이머 이후 조건 만족 시 시작( 타이머는 지정된 시간이 감소되 0 이하가 되면 종료)
  • 맵의 이동은 일정한 속도로 이동시키기 위해 Translate를 사용해 이동하도록 구현했다. 
  • 게임이 시작하면 맵이 이동하며 장애물들을 피해 플레이어가 도착지까지 이동하면 된다.
  • 체력이 0 이하로 감소되면 게임 오버

아직 무적 상태는 구현되지 않았다. (무적 상태는 무적 Tag를 추가해 일정 시간 동안 무적 상태를 유지하도록 구현할 예정)

  • 골 지점에 도착하면 게임 클리어 (게임매니저에게 있는 GameClear 메서드 호출)

(기능 테스트로 설치한 임시 맵)

  • 골 지점 도착으로 인한 클리어 확인은 위의 함정, 가속 트리거와 동일하게 onTriggerEnter2D를 통해 감지한다.
  • 체력은 플레이어 캐릭터의 정보를 가져와서 GameManager가 체력을 관리한다.

플레이어 캐릭터, 맵의 정보

  • 플레이 중인 캐릭터들은 모두 Prefab으로 관리하며 맵의 정보 또한 Prefab으로 관리할 예정이다. 
  • Stage마다 Scene을 만드는 것이 아니라 게임이 진행되는 하나의 Scene에서 로딩을 활용해 이전 Stage 선택 Scene에서 받아온 Stage 정보를 바탕으로 해당 Scene에 선택한 캐릭터와 맵을 생성하는 방식으로 구현하려 한다.
  • 여기서 캐릭터는 프리펩으로 관리되지만, 기본적인 정보를 저장할 데이터는 ScriptableObj를 통해 Data 관리를 할 것이다.
  • SO를 선택한 이유는 각 캐릭터의 Prefab에 맞게 할당을 해주고 캐릭터의 정보 Data를 추가하면 빠른 캐릭터 추가 및 수정이 가능하므로 이 SO를 선택했다.


구현된 영상

구현된 영상

 

'Unity' 카테고리의 다른 글

개발 일지 - 간단한 기획 및 게임 틀 제작기획  (0) 2025.10.07
Unity-Firebase등록 및 추가  (0) 2025.09.26