고갱
[학교 과제] 3D 게임 개발 #1, 로직 변경 본문
학교 수업 중에 '게임프로그래밍' 이라는 전공 과목이 있다.
이 과목에서는 게임을 제작해서 기말고사 대신에 대체 과제로 제출하게끔 되어있어서 기존에 만들던 로직을 약간 변형해서 응용하고자 한다.
원래는 스타듀 밸리를 만드는 것이 목표였지만, 3주일 남짓한 시간동안 만들 수 있는 프로젝트는 아니기 때문에 간단하게 미니 게임을 만들고자 한다.
🤔 그래서 어떤 게임?
그래서 어떤 게임을 만들지는 한 1주일은 고민한 것 같다.
처음에는 미로 찾기를 생각하다가, 이후에는 달리기 게임을 만들까 하다가, 교수님이 아이디어를 본다고 하셨기 때문에 참신한 게임을 생각했고 결국 고안한게 생존 게임이였다.
정확히는 50 × 50 크기의 정사각형의 타일에서 상대방보다 오래 살면 되는 게임이다.
자신이 밟고있는 타일은 일정 시간 후에 무너지고, 시간이 지날수록 타일이 무너지는 속도는 빨라지게끔 할 예정이다.
상대방을 어떻게 할지는 아직 고민 중인데 두 가지의 멀티플레이 방식을 지원하는 것을 생각하고 있다.
- 한 클라이언트에 두 사람의 조작키를 지원
- 같은 LAN 상 멀티플레이 지원
장거리 멀티플레이 방식을 도입하기 위해서는 좀 생각해야 하는 것도 많고 해결해야 하는 것도 많기 때문에 일단 배제하였다.
- P2P 방식인 경우 : 공유기 환경인 경우 NAT Punch through 같은 기술의 필요
- Server 방식인 경우 : 24시간 구동이 가능한 서버 필요
일단 근거리 멀티플레이를 구현하고 만약 시간적으로 여유가 있다면 Server 방식을 채택해서 구현을 시도해보고자 한다.
❓ 제약 조건?
문제는 제약 조건이다.
기존에 만들던 것은 여러 에셋을 혼합해서 적절히 만들었는데 이번 학교 과제에서는 웬만해서는 사용하지 말라고 하였다.
직접 개발하는 비율이 더 높아야 한다는 말이다.
따라서 기존에 사용하던 카메라 움직임 에셋, 캐릭터 움직임 에셋 등 에셋들을 삭제하고 내가 코드로 스스로 구현하도록 바꾸었다.
어차피 생존 게임으로 변경하기 때문에 날씨 에셋도 삭제했다.
그리고 기존에 DrawInstancedIndirect 로 GPU에 직접 그리도록 명령하던 부분도 대학생 수준에서는 의심받을 가능성이 높다고 판단해서 그냥 Prefab을 Instantiate해주는 방식으로 변경해주었다.
즉 정리하자면 이제 남은 것은 디자인 관련된 에셋.. 모든 동작 관련된 에셋은 삭제되었다.
❗ 변경 후 모습

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

그리고 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;
위치 정보만 저장하게끔 위와 같이 변경하여 연산하였다. (대학생 수준에서 벗어난 프로젝트가 될 것 같아서 단순하게 바꿨다.)
😵 다음 계획
이제 다음번에는 밟은 지형이 무너져 내리는 로직을 구현하고,
그 후에 로비 화면을 만들고,
그 후에 멀티플레이를 지원하는 순서로 구현할 것 같다.
👍 참고 자료
없음
'게임 개발 > Unity' 카테고리의 다른 글
| [셰이더] Curved World 수동 구현 (0) | 2026.01.05 |
|---|---|
| [학교 과제] 3D 게임 개발 #2, 게임 로직과 멀티 플레이 1차 구현 (0) | 2025.05.27 |
| [스타듀 밸리] 3D 게임 개발 #3, 캐릭터 구현 & 물 변경 & Day-Night Cycle 추가 (2) | 2025.01.30 |
| [스타듀 밸리] 3D 게임 개발 #2, 지형 최적화 (2) | 2025.01.09 |
| [스타듀 밸리] 3D 게임 개발 #1, Perlin Noise를 이용한 지형 생성 (0) | 2025.01.07 |
