This document is about: FUSION 2
SWITCH TO

Simple FPS

Level 4

개요

Simple FPS 게임은 간단한 코드 구조로 보급형 게임 샘플을 제공하도록 설계된 1인칭 슈팅 게임입니다. 1인칭 슈팅 게임을 만드는 데 관심이 있는 초보자와 개발자를 위한 학습 자원 역할을 하는 것이 주요 목적입니다.

게임 플레이는 플레이어들이 현실적인 창고에서 빠르게 진행되는 전투를 중심으로 전개됩니다. 심플한 디자인과 명확한 코드 구성으로 Simple FPS 게임은 Fusion을 통해 멀티플레이어 게임을 만드는 기본 요소를 이해할 수 있는 접근 가능한 출발점을 제공합니다.

이 샘플은 클라이언트/서버 토폴로지를 이용합니다.
simple fps

기능

  • 창고를 배경으로 한 1인칭 슈팅입니다.
  • 데스매치 모드: 플레이어는 사망 후 짧은 시간 후에 부활합니다. 가장 많은 킬을 기록한 플레이어가 승리합니다.
  • 권총, 자동 소총, 산탄총 3개의 히트 스캔 무기
  • 맵 전체에서 무기 및 헬스 픽업을 사용
  • 경기 마지막 단계에서 30초 동안 지속되는 더블 대미지 부스트
  • 초보자 친화적인 코드 구조로 이해와 수정 용이
  • 플레이어 이동을 위한 간단한 키네마틱 캐릭터 컨트롤러(Simple KCC).
  • Photon 메뉴 통합.

Simple FPS는 또한 클라이언트 측 예측 및 지연 보상을 사용합니다.

  • 클라이언트 측 예측은 클라이언트가 서버로부터 확인을 받기 전에 자신의 입력을 사용하여 자신의 움직임을 예측하는 인기 있는 멀티플레이어 아키텍처입니다. 이를 통해 게임 플레이가 매섭게 느껴질 수 있고 대기 시간을 없애줍니다.
  • 지연 보상을 통해 서버는 각 클라이언트의 관점에서 일시적으로 세상을 보고 플레이어가 실제로 샷을 할 수 있는 위치에 있는지 판단할 수 있습니다.

다운로드

버전 릴리즈 일자 다운로드
2.0.9 Apr 19, 2024 Fusion Simple FPS 2.0.9 Build 518

필요 사양

  • 유니티 2022.3
  • Fusion AppId: 샘플을 실행하려면 먼저 PhotonEngine 관리 화면에서 Fusion AppId를 생성하고 Real Time 설정(유니티 편집기의 Fusion 메뉴에서 연결 가능)의 App Id Fusion 필드에 붙여 넣습니다. 게임 시작하기 섹션의 지침을 계속합니다.

게임 시작하기

Simple FPS 게임은 플레이어가 새로운 데스매치 게임을 시작하는 등 다양한 옵션을 탐색할 수 있는 시작 씬(Scenes/Startup)을 통해 시작하거나 게임 플레이 장면(Scenes/Deathmatch)을 직접 실행하여 액션에 바로 참여할 수 있습니다.

제어

  • W, S, A, D을 사용하여 이동, 점프는 SPACE, 발사는 왼쪽 마우스 버튼.
  • 수집된 무기를 1, 2, 3 으로 바꾸어 R로 재장전합니다.
  • F를 눌러 주변 표면에 이미지를 분사하여 재미를 더합니다.
  • ENTER 키를 사용하여 유니티 편집기 내부의 커서를 잠그거나 놓습니다.

시스템

플레이어

플레이어 주 스크립트는 이동 및 무기 제어를 위한 입력 처리와 같은 필수 기능을 처리합니다. 또한 로컬 플레이어의 경우 1인칭 시점과 로컬 플레이어가 보는 다른 플레이어의 경우 3인칭 시점(전신 캐릭터) 사이를 오가며 올바른 플레이어 시각 표현을 보여주는 가시성을 결정합니다. 이 스크립트 내에서는 3인칭 애니메이션도 제어됩니다.

플레이어 입력은 기기(키보드/마우스)로부터의 입력을 누적하는 PlayerInput클래스에 의해 처리됩니다. 누적된 입력은 표준 FusionOnInput` 콜백을 통해 소비됩니다.

플레이어의 건강 상태는 Health 스크립트에 저장됩니다. 게임 중 플레이어는 스폰 후 짧은 불멸 기간을 가집니다. 플레이어가 무기에서 발사하면 불멸은 즉시 중단됩니다.

Simple FPS의 발소리는 모든 플레이어가 들을 수 있으며, 로컬 플레이어는 자신의 발소리를 약간 더 조용하게 들을 수 있습니다.

Simple KCC (Simple Kinematic Character Controller) 컴포넌트로 플레이어의 움직임과 충돌을 해결합니다. 자세한 내용은 Simple KCC를 참조하십시오.

표준 Fusion Hitbox 의 하위 컴포넌트인 BodyHitbox는 신체 부위별로 다른 손상 수식어를 가진 히트 박스를 구현하는 데 사용됩니다. 예를 들어 머리는 2배 대미지를 입지만 다리는 대미지가 적습니다. 히트 박스의 위치는 단순화를 위해 애니메이션의 영향을 받지 않으며, 가장 일반적인 플레이어의 자세인 무기를 들고 있는 정적인 자세로 설정되어 있다는 점에 주목할 필요가 있습니다.

gizmos showcasing hit boxes

Fusion 안의 애니메이션에 관한 더 상세한 정보는 Fusion 매뉴얼의 애니메이션 페이지와 애니메이션 기술 샘플을 참고하세요. 이 샘플들은 Fusion V1로 제작되었습니다.

무기

Weapons 스크립트는 게임 내 무기의 일반적인 기능을 다루며 모든 플레이어 무기에 대한 참조를 유지하고 사격과 재장전 등의 액션을 수행할 수 있습니다. 모든 무기는 플레이어 프리팹 계층에 이미 포함되어 있기 때문에 게임 내 무기가 몇 개만 존재할 때 간단한 접근 방식입니다.

Simple FPS 샘플에는 히트 스캔 무기가 내장되어 있어 최대 거리를 지정한 레이 캐스트를 발사하여 즉각적인 히트 평가가 가능합니다. 발사체는 시간이 지남에 따라 물리적으로 이동하지 않지만 샘플은 더미 발사체 비주얼(ProjectileVisual 스크립트 처리)을 사용하여 빠른 노란색 탄환을 통과하여 이동하는 것과 같은 착각을 불러일으킵니다. 이 트레일은 레이 캐스트의 방향과 종점을 정확하게 나타냅니다.

돌격 소총 사격

각 발사체 샷에 대해 작은 데이터 구조체인 ProjectileDataWeapon 스크립트 내의 배열로 저장됩니다. 이 배열은 네트워크로 연결되어 순환형 데이터 버퍼 역할을 하는데, 배열의 끝에 도달하면 발사체를 처음부터 다시 저장하는 것을 의미합니다. 이 배열을 사용하면 모든 클라이언트에서 발사체를 발사하므로 효율적인 발사체 네트워킹이 보장됩니다.

C#

private struct ProjectileData : INetworkStruct
{
    public Vector3     HitPosition;
    public Vector3     HitNormal;
    public NetworkBool ShowHitEffect;
}

발사체와 그 네트워킹에 대한 보다 심층적인 이해를 위해서는 발사체 기본고급 발사체 샘플에서 자세한 내용을 확인할 수 있습니다. 이 샘플들은 Fusion V1로 제작되었습니다.

픽업

샘플에 포함된 픽업은 무기 픽업과 헬스 픽업 두 가지입니다. 두 픽업은 플레이어가 걸어가면 자동으로 수집됩니다. HealthPickup은 플레이어가 지정한 양만큼 즉시 치유되어 플레이어의 체력을 회복합니다. WeaponPickup은 플레이어가 해당 무기를 이미 획득한 경우 플레이어에게 새 무기를 제공하거나 탄약을 다시 충전합니다.

health pickup

게임 플레이

Gameplay 스크립트는 Simple FPS에서 게임 플레이 경험의 다양한 측면을 다루는 게임의 중심 스크립트 역할을 합니다. 플레이어 스폰, 플레이어 점수 계산, 서로 다른 게임 플레이 상태 간의 전환 관리를 담당합니다.

Simple FPS의 게임 방식은 플레이어들이 서로를 제거하기 위해 전투를 벌이는 고전적인 데스매치입니다. 탈락 시 플레이어들은 사망 후 일정 시간이 지나면 다시 부활합니다. 시간이 다 되면 게임이 종료되고 킬 수가 가장 많은 플레이어가 승자로 부상합니다.

게임 플레이 시스템은 Skirmish, Running, Finished 등 여러 상태에서 작동합니다. Skirmish 상태에서는 시간의 제약 없이 솔로 플레이어가 자유롭게 경기장을 탐색할 수 있습니다. 두 번째 플레이어가 게임에 접속하면 게임 플레이는 Running 상태로 전환되고 경기 타이머가 시작됩니다. 마지막으로 경기가 종료되면 피니시 상태가 되고 결과가 표시됩니다.

연결된 플레이어는 플레이어 데이터 사전(모든 플레이어에게 복제됨)을 이용해 Gameplay 스크립트에 의해 관리됩니다. 이 사전에서 각 플레이어는 플레이어의 중요한 정보를 저장하는 PlayerData 구조체와 관련이 있습니다. PlayerData에는 플레이어의 별명, 누적 사망자 수, 현재 상태(생존 여부) 등의 세부 정보가 포함되어 있습니다.

C#

public struct PlayerData : INetworkStruct
{
    [Networked, Capacity(24)]
    public string    Nickname { get => default; set {} }
    public PlayerRef PlayerRef;
    public int       Kills;
    public int       Deaths;
    public int       LastKillTick;
    public int       StatisticPosition;
    public bool      IsAlive;
    public bool      IsConnected;
}

PlayerData 데이터 구조체를 통해 게임 플레이 경험 전반에 걸쳐 플레이어와 플레이어의 통계를 효율적으로 추적할 수 있습니다.

UI

Simple FPS의 사용자 인터페이스는 특정 UI 프레임워크에 의존하지 않고 간단한 방식으로 처리됩니다. UI 관리를 담당하는 주요 스크립트는 GameUI 스크립트입니다. 게임 플레이 중에 표시되어야 하는 적절한 UI 게임 오브젝트를 활성화합니다. 또한 GameUI 스크립트는 플레이어가 생성되면 다른 UI 요소에 대한 참조를 유지하고 플레이어 UI를 업데이트합니다.

scoreboard ui

이 게임은 일반적인 UI 처리 외에도 플레이어에게 중요한 피드백을 제공하는 게임 플레이 알림 기능을 갖추고 있습니다. "Lead Lost" 또는 "Lead Taken"과 같은 알림은 게임 플레이 정보 패널을 담당하는 UIGameplayInfo 스크립트에 의해 관리됩니다. 이 스크립트는 플레이어의 통계 정보 변경에 따라 특정 알림 게임 객체를 활성화하여 적절한 시간에 플레이어에게 관련 메시지가 표시되도록 합니다.

Simple FPS의 UI 구현은 단순성과 기능성에 중점을 두어 복잡한 UI 프레임워크 없이도 플레이어가 필요한 정보를 제공받을 수 있도록 합니다.

메뉴

Simple FPS에는 표준 Photon 메뉴가 포함되어 있어 플레이어가 빠르게 연결하고 경기를 시작할 수 있습니다.

photon 메뉴

타사 에셋

Simple FPS 샘플의 핵심은 Fusion에 의해 가능해졌지만, 게임에는 "기본" 이상의 기술이 필요합니다! Photon이 제공하는 멀티플레이어 기술 외에도, Simple FPS는 우수한 크리에이터 그룹의 지원으로 가능해졌습니다.

모델, 이펙트, 사운드 등 타사 자산은 `Assets/3rdParty` 폴더에 있습니다. 이를 사용하려면 해당 에셋에서 라이선스를 구입해야 합니다.
Back to top