항목 | 내용 |
---|---|
📅 작업 기간 | 2023.08.28 ~ 2023.12.12(약 4개월) |
🎮 장르 | 어드밴처 공포게임 |
💻 개발 언어 | C# |
👥 팀 구성 | 기획 2명 , 디자인 1명 , 개발자 2명 |
🧩 담당 파트 | 플레이어 (플레이어 애니메이션 , 플레이어 상호작용) |
🛠️ 개발 엔진 | 유니티 엔진 |
GitHub | https://github.com/MinKimS/Regma |
타이틀
거실맵
주방맵
욕실맵
거실맵
베란다맵
진실 엔딩 – 모든 퍼즐을 해결하고 진상을 파악해 탈출
탈출 실패 엔딩 – 핵심 오브젝트 누락 or 잘못된 선택
Chmoving.cs
<플레이어 기본 이동>
<플레이어 점프>
<플레이어 밀기>
플레이어 캐릭터의 기본 이동, 점프, 걷기/달리기, 물속 동작, 사다리 오르기, 리스폰 처리, 애니메이션 연동 등을 통합적으로 제어하는 스크립트입니다. 다양한 상태에 따라 이동 로직을 분기하여, 자연스럽고 상황에 맞는 캐릭터 컨트롤이 가능하도록 구성하였습니다.
1. Capsule Collider 2D
: 충돌 영역 설정
플레이어 캐릭터의 충돌 영역을 캡슐 형태로 설정하여, 부드러운 바닥 접촉과 모서리 끼임 최소화를 구현합니다.
항목 | 값 | 설명 |
---|---|---|
Material | nofriction |
마찰 없는 Physic Material 사용 → 멈췄을 때 마찰로 밀리는 현상 제거 |
Offset | (0, 0) | 충돌 영역의 중심을 오브젝트의 중앙에 위치시킴 |
Size | (1.68, 2.99) | 충돌 영역을 캐릭터 크기에 맞춰 수직 캡슐 형태로 설정 |
Direction | Vertical | 세로 방향으로 충돌 감지 |
Rigidbody 2D : 물리 속성 설정
Rigidbody2D
는 중력을 적용받는 Dynamic
타입으로 설정되었고, 반응성을 높이기 위해 Mass
는 0.2로 조정하였으며, 드래그 값은 최소화하여 즉각적인 이동 반응이 가능하도록 설계하였습니다.pos
오브젝트의 용도 : 지면 감지용 위치 기준점
OverlapCircle
을 통해 지면과의 충돌 여부를 감지합니다.
이를 통해 점프 가능 여부(isGround
)를 판단하며, 점프 중인지 상태를 애니메이션과 함께 동기화합니다.HandleJumpInput()
: 점프 입력 처리
플레이어가 점프 키(Space)를 눌렀을 때 점프 가능한 조건을 만족하면 공중으로 튀어오르도록 하고,
공중에 떠 있는 동안에는 다시 점프하지 않도록 중복 점프를 방지하며,
지면에 착지했을 때 isJumping
상태를 초기화하여 다음 점프가 가능하도록 만듭니다.
Animator
컴포넌트를 참조하는 변수를 통해 현재 실행 중인 애니메이션 상태 정보를 가져오는 함수를 호출하여 현재 재생 중인 애니메이션이 "DieInwater"
인지 확인합니다.
이를 통해 죽는 애니메이션이 재생되는 동안에는 플레이어가 점프하지 못하도록 입력을 제한하였습니다.
점프 실행을 위해Rigidbody2D.velocity
를 통해 상향 힘을 직접 적용합니다.
캐릭터가 사다리나 물과 같은 특수 구간에서는 중력을 0으로 꺼두는데,
이 상태로 점프할 경우 낙하가 제대로 이루어지지 않으므로, 점프 시점에 중력 값을 초기 설정값으로 복원하도록 하였습니다.
점프는 2D 공간에서 위쪽 방향인 (0, 1)
벡터에 jumpForce
값을 곱한 Vector2
를 Rigidbody2D.velocity
에 적용하여 구현하였습니다.
private void HandleJumpInput()
{
if (!isJumping && Input.GetKeyDown(KeyCode.Space) && !animator.GetCurrentAnimatorStateInfo(0).IsName("DieInwater"))//&& jumpCnt > 0)
{
isJumping = true;
rb.gravityScale = defaultGravityScale;
rb.velocity = Vector2.up * jumpForce;
PlayJumpSound();
}
}
플레이어가 점프 후 낙하해서 바닥에 닿았는지 확인하고, isJumping = false
로 설정해서 다시 점프 가능하도록 초기화 하였습니다.
if (isGround && rb.velocity.y < 0 || isGround && isJumping && rb.velocity.y < 0.01f)
{
isJumping = false;
}
HandleRunInput()
: 달리기 입력 처리
Input.GetKey()
는 키가 눌려 있는 동안 true이므로, LeftShift
키가 눌려져 있는 상태인지 확인한 후, 해당 결과를 isRunning
에 저장합니다.
true
, 걷기 중이면 false
private void HandleRunInput()
{
isRunning = Input.GetKey(KeyCode.LeftShift);
}
HandleMovementInput()
: 방향키 입력 기반 이동 제어
Start()
: 게임 시작 시 자동 호출되는 초기화 함수
Update()
: 매 프레임 상태 체크 및 입력 처리
UpdateAnimation()
: 애니메이션 상태 갱신
사운드 처리
RespawnCharacterAfterWhile()
: 캐릭터 리스폰 처리
OnTriggerEnter2D()
: 플레이어가 어떤 영역에 "들어갔을 때"
PlayerHanging.cs
PlayerFallingControlleR.cs