This document is about: FUSION 2
SWITCH TO

아키텍처

플레이어

주요 Player 스크립트는 이동 및 무기 제어를 위한 입력 처리와 같은 기본 기능을 처리합니다. 또한 로컬 플레이어를 위한 1인칭 시각(무기만 보이는 손)과 로컬 플레이어가 보는 다른 플레이어를 위한 3인칭 시각(전체 몸체 캐릭터) 간의 시각적 표현을 전환하는 기능을 담당합니다. 3인칭 애니메이션도 이 스크립트 내에서 제어됩니다.

플레이어 입력은 PlayerInput 클래스에서 처리되며, 장치(키보드/마우스)로부터 입력을 누적합니다. 누적된 입력은 표준 Fusion OnInput 콜백을 통해 소모됩니다.

플레이어의 체력은 Health 스크립트에 저장됩니다. 게임 중에 플레이어는 스폰 후 짧은 시간 동안 불사 상태가 되며, 무기에서 발사하면 즉시 불사 상태가 해제됩니다.

간단한 FPS에서 발소리는 모든 플레이어가 들을 수 있으며, 로컬 플레이어는 자신의 발소리를 약간 더 작게 들을 수 있습니다.

SimpleKCC(간단한 키네마틱 캐릭터 컨트롤러) 컴포넌트는 플레이어의 움직임과 충돌을 해결합니다. 자세한 내용은 간단한 KCC를 참조하십시오.

BodyHitbox는 다양한 신체 부위에 대해 다른 피해 수정자를 가진 히트 박스를 구현하는 데 사용되는 표준 Fusion Hitbox 컴포넌트의 자식입니다. 예를 들어, 머리는 두 배의 피해를 받고, 다리는 감소된 피해를 받습니다. 간단함을 위해 플레이어 히트 박스의 위치는 애니메이션에 영향을 받지 않으며, 무기를 들고 있는 가장 일반적인 플레이어 자세를 나타내는 정적 자세로 설정됩니다.

히트 박스를 보여주는 기즈모

Fusion에서의 애니메이션에 대한 자세한 내용은 Fusion 매뉴얼의 애니메이션 페이지와 애니메이션 기술 샘플을 참조하십시오. 이 샘플들은 Fusion V1로 구축되었습니다.

무기

Weapons 스크립트는 게임 내 무기의 일반적인 기능을 처리하며, 모든 플레이어 무기에 대한 참조를 유지하고 발사 및 재장전과 같은 동작을 허용합니다. 모든 무기는 이미 플레이어 프리팹 계층 구조에 포함되어 있으며, 게임에 몇 개의 무기만 있는 경우에 간단한 접근 방식을 제공합니다.

간단한 FPS 샘플은 히트 스캔 무기를 포함하고 있으며, 이는 지정된 최대 거리로 레이 캐스트를 발사하여 즉각적인 히트 평가를 가능하게 합니다. 비록 투사체가 물리적으로 시간이 지남에 따라 이동하지는 않지만, 샘플에서는 ProjectileVisual 스크립트로 처리되는 더미 투사체 비주얼을 사용하여 빠른 노란색 총알과 트레일을 통해 이동하는 것처럼 보이도록 합니다. 이 트레일은 레이 캐스트의 방향과 끝점을 정확하게 나타냅니다.

돌격 소총 발사

각 투사체가 발사될 때마다 작은 데이터 구조체인 ProjectileDataWeapon 스크립트 내 배열에 저장됩니다. 이 배열은 네트워크로 연결되어 있으며, 순환 데이터 버퍼로 작동하여 배열의 끝에 도달하면 투사체가 처음부터 다시 저장됩니다. 이 배열을 사용하여 모든 클라이언트에서 투사체가 발사되어 효율적인 투사체 네트워킹을 보장합니다.

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

일반적인 UI 처리 외에도, 게임에는 플레이어에게 중요한 피드백을 제공하는 게임 플레이 공지가 포함되어 있습니다. 이러한 공지(예: "리드 잃음" 또는 "리드 차지")는 UIGameplayInfo 스크립트에 의해 관리되며, 게임 플레이 정보 패널을 담당합니다. 이 스크립트는 플레이어의 통계 변화에 따라 특정 공지 게임 객체를 활성화하여 적절한 시점에 플레이어에게 관련 메시지를 표시합니다.

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

Back to top