아키텍처
플레이어
주요 Player
스크립트는 이동 및 무기 제어를 위한 입력 처리와 같은 기본 기능을 처리합니다. 또한 로컬 플레이어를 위한 1인칭 시각(무기만 보이는 손)과 로컬 플레이어가 보는 다른 플레이어를 위한 3인칭 시각(전체 몸체 캐릭터) 간의 시각적 표현을 전환하는 기능을 담당합니다. 3인칭 애니메이션도 이 스크립트 내에서 제어됩니다.
플레이어 입력은 PlayerInput
클래스에서 처리되며, 장치(키보드/마우스)로부터 입력을 누적합니다. 누적된 입력은 표준 Fusion OnInput
콜백을 통해 소모됩니다.
플레이어의 체력은 Health
스크립트에 저장됩니다. 게임 중에 플레이어는 스폰 후 짧은 시간 동안 불사 상태가 되며, 무기에서 발사하면 즉시 불사 상태가 해제됩니다.
간단한 FPS에서 발소리는 모든 플레이어가 들을 수 있으며, 로컬 플레이어는 자신의 발소리를 약간 더 작게 들을 수 있습니다.
SimpleKCC
(간단한 키네마틱 캐릭터 컨트롤러) 컴포넌트는 플레이어의 움직임과 충돌을 해결합니다. 자세한 내용은 간단한 KCC를 참조하십시오.
BodyHitbox
는 다양한 신체 부위에 대해 다른 피해 수정자를 가진 히트 박스를 구현하는 데 사용되는 표준 Fusion Hitbox
컴포넌트의 자식입니다. 예를 들어, 머리는 두 배의 피해를 받고, 다리는 감소된 피해를 받습니다. 간단함을 위해 플레이어 히트 박스의 위치는 애니메이션에 영향을 받지 않으며, 무기를 들고 있는 가장 일반적인 플레이어 자세를 나타내는 정적 자세로 설정됩니다.
Fusion에서의 애니메이션에 대한 자세한 내용은 Fusion 매뉴얼의 애니메이션 페이지와 애니메이션 기술 샘플을 참조하십시오. 이 샘플들은 Fusion V1로 구축되었습니다.
무기
Weapons
스크립트는 게임 내 무기의 일반적인 기능을 처리하며, 모든 플레이어 무기에 대한 참조를 유지하고 발사 및 재장전과 같은 동작을 허용합니다. 모든 무기는 이미 플레이어 프리팹 계층 구조에 포함되어 있으며, 게임에 몇 개의 무기만 있는 경우에 간단한 접근 방식을 제공합니다.
간단한 FPS 샘플은 히트 스캔 무기를 포함하고 있으며, 이는 지정된 최대 거리로 레이 캐스트를 발사하여 즉각적인 히트 평가를 가능하게 합니다. 비록 투사체가 물리적으로 시간이 지남에 따라 이동하지는 않지만, 샘플에서는 ProjectileVisual
스크립트로 처리되는 더미 투사체 비주얼을 사용하여 빠른 노란색 총알과 트레일을 통해 이동하는 것처럼 보이도록 합니다. 이 트레일은 레이 캐스트의 방향과 끝점을 정확하게 나타냅니다.
각 투사체가 발사될 때마다 작은 데이터 구조체인 ProjectileData
가 Weapon
스크립트 내 배열에 저장됩니다. 이 배열은 네트워크로 연결되어 있으며, 순환 데이터 버퍼로 작동하여 배열의 끝에 도달하면 투사체가 처음부터 다시 저장됩니다. 이 배열을 사용하여 모든 클라이언트에서 투사체가 발사되어 효율적인 투사체 네트워킹을 보장합니다.
C#
private struct ProjectileData : INetworkStruct
{
public Vector3 HitPosition;
public Vector3 HitNormal;
public NetworkBool ShowHitEffect;
}
투사체 및 그 네트워킹에 대한 보다 깊은 이해를 원한다면, 발사체 기초 및 발사체 고급 샘플에서 자세히 다룬 내용을 확인할 수 있습니다. 이 샘플들은 Fusion V1로 구축되었습니다.
픽업
샘플에는 무기 픽업과 체력 픽업 두 가지 유형의 픽업이 있습니다. 두 픽업 모두 플레이어가 그 위를 지나가면 자동으로 수집됩니다. HealthPickup
은 플레이어의 체력을 지정된 양만큼 즉시 회복시켜줍니다. WeaponPickup
은 플레이어에게 새로운 무기를 제공하거나, 이미 해당 무기를 획득한 경우 탄약을 보충해 줍니다.
게임 플레이
Gameplay
스크립트는 Simple FPS의 중앙 스크립트로, 게임 플레이 경험의 다양한 측면을 처리합니다. 이 스크립트는 플레이어 스폰, 플레이어 점수 계산, 그리고 다양한 게임 플레이 상태 간 전환을 관리합니다.
Simple FPS의 게임 플레이 모드는 고전적인 데스매치로, 플레이어들이 서로를 제거하기 위해 전투를 벌입니다. 플레이어가 제거되면 일정 시간이 지난 후 다시 스폰 됩니다. 경기가 끝나면, 시간이 다 되었을 때 가장 많은 킬을 기록한 플레이어가 승리합니다.
게임 플레이 시스템은 Skirmish
, Running
, Finished
와 같은 여러 상태를 통해 작동합니다. Skirmish
상태에서는 단독 플레이어가 시간제한 없이 자유롭게 아레나를 탐험할 수 있습니다. 두 번째 플레이어가 게임에 연결되면, 게임 플레이는 Running
상태로 전환되며, 경기 타이머가 시작됩니다. 마지막으로, 경기가 종료되면 Finished
상태에 도달하며, 결과가 표시됩니다.
연결된 플레이어들은 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
간단한 FPS의 사용자 인터페이스는 특정 UI 프레임워크에 의존하지 않고 간단하게 처리됩니다. UI 관리를 담당하는 주요 스크립트는 GameUI
스크립트입니다. 이 스크립트는 게임 중에 표시되어야 할 적절한 UI 게임 객체를 활성화합니다. 또한, GameUI
스크립트는 다른 UI 요소에 대한 참조를 유지하며, 플레이어가 스폰 될 때 플레이어 UI를 업데이트합니다.
일반적인 UI 처리 외에도, 게임에는 플레이어에게 중요한 피드백을 제공하는 게임 플레이 공지가 포함되어 있습니다. 이러한 공지(예: "리드 잃음" 또는 "리드 차지")는 UIGameplayInfo
스크립트에 의해 관리되며, 게임 플레이 정보 패널을 담당합니다. 이 스크립트는 플레이어의 통계 변화에 따라 특정 공지 게임 객체를 활성화하여 적절한 시점에 플레이어에게 관련 메시지를 표시합니다.
Simple FPS의 UI 구현은 단순함과 기능성에 중점을 두어 복잡한 UI 프레임워크 없이도 플레이어가 필요한 정보를 받을 수 있도록 합니다.
Back to top