도쿄 2010

이준영·2025년 9월 5일

주제 : Unity 및 Photon Fusion 기반 3D 1인칭 FPS 호러 생존 게임
개발 기간 : 2025.06.12. ~ 2025.06.19.
개발 인원 : Unity(6명)
사용 기술 : Photon Fusion2, FSM(Enum), addressable
Github : 유료 에셋으로 인한 비공개

도쿄 2010

주제 선택 사유

  • 유니티 심화 주차에서 배운 기술을 활용해보고 여태 해본적 없는 장르를 하고 싶어서 FPS 장르를 선택하게 되었음.
  • 참고 게임 : "Left 4 Dead"

기술 스택

Photon Fusion, FSM(Enum), addressable

기술적 의사결정

Photon Fusion

  • 사용 이유 : 성능, 확장성, 개발 편의성
  1. 뛰어난 성능과 낮은 지연 시간

    • FPS 게임은 총을 쏘고 피하는 동작이 매우 빠르게 일어나므로, 지연 시간이 짧은 것이 매우 중요.
    • Photon Fusion은 높은 성능의 네트워킹을 위해 설계되어, 플레이어의 행동과 다른 플레이어가 보는 화면 사이의 지연을 최소화
  2. 쉬운 개발

    • 멀티플레이 게임 개발은 매우 복잡
    • Photon Fusion은 견고한 프레임워크와 도구를 제공하여, 네트워크 로직의 많은 부분을 자동으로 처리
  3. 사용 예시

FSM(Enum)

  • 사용 이유 : Enum 방식으로 구현하는 것은 좀비와 플레이어의 다양한 행동을 효과적으로 관리하기 위함.
  1. 명확한 상태 정의 및 가독성

    • 캐릭터의 상태를 (예: Idle, Walk, Run, Attack, Die) 와 같이 명확한 이름으로 정의
    • 코드의 가독성을 높여 다른 개발자나 미래의 내가 코드를 쉽게 이해하고 유지보수 가능
  2. 체계적인 상태 전환 관리

    • 캐릭터가 특정 상태에 있을 때 어떤 행동을 할 수 있고, 어떤 조건에서 다른 상태로 전환될 수 있는지를 명확하게 규정
    • 게임 내 캐릭터의 논리적인 행동 흐름을 체계적으로 구현
  3. 효율적인 행동 분리

    • FSM 구조를 통해 각 상태에 대한 행동 로직을 독립적으로 분리하여 관리
    • 코드의 재사용성을 높이고 디버깅을 용이
  4. 예시 코드

예시 코드

addressable

  • 사용 이유 : 자산 로딩의 효율성 및 관리 용이성을 극대화하기 위해서입니다.
  1. 빌드 용량 최적화 및 로딩 시간 단축

    • 필요한 시점에 해당 에셋만 동적으로 로드
  2. 효율적인 메모리 관리

    • 자동으로 메모리에서 해제하는 기능을 제공
    • 중복된 에셋이 빌드되지 않도록 자동으로 관리
  3. 사용된 곳

    • UI
    • 아이템 배치(탄약)
아이템 배치 코드 예시
  • SO에 넣어둔 데이터를 가져와서 배치하는 방식이다.

배운 점

SkinnedMeshRenderer의 특징(트러블 슈팅)

카메라에서 캐릭터가 사라졌다 생겼다 하는 버그

보일 때안 보일 때
  1. 버그 발생
    • 총이 장착된 캐릭터의 카메라를 테스트 하던 중, 캐릭터가 간혈적으로 사라지는 버그 발생.
  2. 원인 분석
    • 구매한 에셋은 SkinnedMeshRenderer을 이용해서 구현.
    • SkinnedMeshRenderer는 랜더링 범위를 설정할 수 있는 옵션을 가지고 있음.
    • 카메라가 움직이면서 이 범위 밖으로 나가는 경우가 발생.
  3. 해결 방법
    • SkinnedMeshRenderer의 updateWhenOffscreen을 true로 설정.
    • 랜더링 범위 설정 옵션을 비활성.

Network Transform 주의점

서버에서 Raycast 오류

Raycast를 쏘는 주체가 자꾸 바뀜
  1. 버그 발생
    • 아이템과 상호작용 또는 사격을 위해서 Raycast를 사용.
    • 서버와 연동해서 테스트 중 B캐릭터가 쏘는 Ray가 A캐릭터에서 발사.
  2. 원인 분석
    • 장비 장착을 위해서 Camera에 넣어 두었던 Network Transform 컴포넌트가 원인.
    • Network Transform은 위치 정보의 서버 동기화를 자동으로 처리.
    • 따라서 Network Transform를 Camera는 위치 정보를 서로 공유중이라 Ray또한 공유.
  3. 해결 방법
    • 장비 장착 카메라와 플레이어 카메라를 분리.
    • 플레이어 카메라의 Network Transform을 제거.

총기 반동 구현

KCC 이용해서 포톤 퓨전 서버에서 카메라 회전과 총기 반동 구현하기

  1. 구현 이유
    • 멈춰있는 총기는 사격이 매우 쉬움.
    • 게임성을 추가하기 위해서 멀티 환경에서의 총기 반동 구현이 필요.
  2. 구현 방법
    • 이미 여러 사람이 카메라 회전을 다른 방식으로 구현.
    • 해당 코드를 하나의 메서드로 정리하고 방법을 KCC만 이용한 방식으로 정리.
    • 해당 회전 기능을 이용하여 사격시에 회전 메서드를 사용.
  3. 예시 코드
총기 반동 코드

1인칭 3인칭 캐릭터 구현

1인칭 3인칭 캐릭터 구현

1인칭 3인칭 캐릭터 구현
  1. 구현 이유

    • 1인칭 카메라는 플레이어의 손 부분만을 랜더링
    • 하지만 다른 유저의 캐릭터는 몸 전체가 랜더링
    • 그렇다고 몸 전체가 있는 캐릭터를 사용하면 캐릭터가 움직이면서 카메라를 가리게 됨
  2. 구현 방법

    • 1인칭 아바타와 3인칭 아바타를 플레이어 오브젝트에 전부 포함
    • 입력 권한에 따라 활성화하는 오브젝트를 설정
  3. 예시 코드

예시 코드

구현 기능

내가 구현한 기능

  1. 총 기능
    • 총기 반동
    • 장전
    • 총알 소모 및 충전
  2. 전투 기능
  3. 장전 애니메이션
  4. 1인칭 3인칭 캐릭터 기능

시연 영상

Unity 심화 주차 4조참치 팀 도쿄2010

profile
게임 개발자가 되기 위해서 공부하는 중입니다.

0개의 댓글