고갱

[학교 과제] 3D 게임 개발 #1, 로직 변경 본문

게임 개발/Unity

[학교 과제] 3D 게임 개발 #1, 로직 변경

주인장 고갱 2025. 5. 17. 05:17

학교 수업 중에 '게임프로그래밍' 이라는 전공 과목이 있다.

이 과목에서는 게임을 제작해서 기말고사 대신에 대체 과제로 제출하게끔 되어있어서 기존에 만들던 로직을 약간 변형해서 응용하고자 한다.

원래는 스타듀 밸리를 만드는 것이 목표였지만, 3주일 남짓한 시간동안 만들 수 있는 프로젝트는 아니기 때문에 간단하게 미니 게임을 만들고자 한다.

 

🤔 그래서 어떤 게임?

그래서 어떤 게임을 만들지는 한 1주일은 고민한 것 같다.

처음에는 미로 찾기를 생각하다가, 이후에는 달리기 게임을 만들까 하다가, 교수님이 아이디어를 본다고 하셨기 때문에 참신한 게임을 생각했고 결국 고안한게 생존 게임이였다.

 

정확히는 50 × 50 크기의 정사각형의 타일에서 상대방보다 오래 살면 되는 게임이다.

자신이 밟고있는 타일은 일정 시간 후에 무너지고, 시간이 지날수록 타일이 무너지는 속도는 빨라지게끔 할 예정이다.

 

상대방을 어떻게 할지는 아직 고민 중인데 두 가지의 멀티플레이 방식을 지원하는 것을 생각하고 있다.

  1. 한 클라이언트에 두 사람의 조작키를 지원
  2. 같은 LAN 상 멀티플레이 지원

 

장거리 멀티플레이 방식을 도입하기 위해서는 좀 생각해야 하는 것도 많고 해결해야 하는 것도 많기 때문에 일단 배제하였다.

  • P2P 방식인 경우 : 공유기 환경인 경우 NAT Punch through 같은 기술의 필요
  • Server 방식인 경우 : 24시간 구동이 가능한 서버 필요

일단 근거리 멀티플레이를 구현하고 만약 시간적으로 여유가 있다면 Server 방식을 채택해서 구현을 시도해보고자 한다.

 

 

❓ 제약 조건?

문제는 제약 조건이다.

기존에 만들던 것은 여러 에셋을 혼합해서 적절히 만들었는데 이번 학교 과제에서는 웬만해서는 사용하지 말라고 하였다.

직접 개발하는 비율이 더 높아야 한다는 말이다.

 

따라서 기존에 사용하던 카메라 움직임 에셋, 캐릭터 움직임 에셋 등 에셋들을 삭제하고 내가 코드로 스스로 구현하도록 바꾸었다.

어차피 생존 게임으로 변경하기 때문에 날씨 에셋도 삭제했다.

그리고 기존에 DrawInstancedIndirect 로 GPU에 직접 그리도록 명령하던 부분도 대학생 수준에서는 의심받을 가능성이 높다고 판단해서 그냥 Prefab을 Instantiate해주는 방식으로 변경해주었다.

 

즉 정리하자면 이제 남은 것은 디자인 관련된 에셋.. 모든 동작 관련된 에셋은 삭제되었다.

 

 

❗ 변경 후 모습

변경 후 모습

 

그래서 변경한 모습은 이제 날씨 없이 고정된 Skybox로 설정되었다.

 

캐릭터 Component

 

그리고 CharacterController도 Rigidbody와 Capsule Collider를 조합하여 구현하였다.

(Freeze Rotation에서 X축과 Z축을 설정해줘야 넘어지지 않는다.)

 

말로쓰면 변경한 점이 그다지 없는 것 같은데 사실 코드는 갈아엎어졌다.

void Update()
{
    //마우스 좌우 회전
    currentYaw += Input.GetAxis("Mouse X") * rotationSpeed;

    //마우스 상하 회전 (반대 방향으로 감지되므로 -부호)
    currentPitch -= Input.GetAxis("Mouse Y") * rotationSpeed;
    currentPitch = Mathf.Clamp(currentPitch, pitchMin, pitchMax);

    //줌 조절
    float scroll = Input.GetAxis("Mouse ScrollWheel");
    targetZoom = Mathf.Clamp(targetZoom - scroll * zoomSpeed, minZoom, maxZoom);
    smoothZoom = Mathf.Lerp(smoothZoom, targetZoom, Time.deltaTime * 5f);
    currentZoom = smoothZoom;
}

void LateUpdate()
{
    //회전 방향
    Quaternion rotation = Quaternion.Euler(currentPitch, currentYaw, 0);
    Vector3 cameraOffset = rotation * new Vector3(0, 0, -currentZoom) + Vector3.up * offset.y;
    Vector3 cameraPosition = player.position + cameraOffset;

    transform.position = cameraPosition;
    transform.LookAt(player.position + Vector3.up * 1.5f);
}

 

우선 위 코드를 통해 기존에 사용하던 카메라 에셋을 대체하였다.

스타듀 밸리랑 다르게 이 게임은 충돌의 개념이 있기 때문에 카메라가 가까워지면 캐릭터가 투명해지던 부분도 임시로 제거해두긴 했다. (스타듀 밸리처럼 겹치는게 가능하다면 투명해지는 기능이 필요하겠지만)

 

[NativeDisableParallelForRestriction]
public NativeArray<Matrix4x4> matrixArray1;

 

그리고 기존에 Job에서 연산한 후에 GPU에 직접 그리는 명령을 보내기 위해 사용하던 위 변수도

 

[NativeDisableParallelForRestriction]
public NativeArray<Vector3> matrixArray1;

 

위치 정보만 저장하게끔 위와 같이 변경하여 연산하였다. (대학생 수준에서 벗어난 프로젝트가 될 것 같아서 단순하게 바꿨다.)

 

 

 

😵 다음 계획

이제 다음번에는 밟은 지형이 무너져 내리는 로직을 구현하고,

그 후에 로비 화면을 만들고,

그 후에 멀티플레이를 지원하는 순서로 구현할 것 같다.

 

 

 

 

👍 참고 자료

없음