Fusion Projectiles

Level Intermediate

개요

Fusion Projectiles는 슈팅 게임에서 다양한 유형의 발사체에 대한 네트워킹을 구현하는 방법을 보여줍니다. 멀티플레이어 발사체를 프로그래밍하는 것은 성능, 대역폭 소비 및 정밀도의 균형을 맞추는 어려운 작업이 될 수 있습니다. 또한 시뮬레이션된 발사체 경로와 렌더링 된 발사체 경로 간의 불일치(카메라에서 발사 vs 무기 총열에서 발사)를 해결하는 부드러운 렌더링이 필요합니다. Fusion Projectiles는 이 작업을 조금 더 명확하고 단순화하는 것이 목표입니다.

발사체를 문맥화하기 위해 샘플은 다른 지원 시스템(게임 플레이 처리, 체력 및 피해 시스템, 무기)과 함께 간단한 FPS 게임으로 제작되며 슈팅 게임을 빌드하기 위한 견고한 기초 작업으로 사용될 수 있습니다.

이 샘플은 호스트 모드 토폴로지를 사용합니다.

메인 화면으로

특징

  • 발사체 데이터 링 버퍼를 사용하여 개별 NetworkObject가 없이 발사체 처리
  • 히트 스캔부터 유도탄까지 다양한 발사체 유형
  • 무기 컴포넌트 시스템
  • 무기 종류 7종
    • 펄스 건
    • 소총
    • 샷건
    • 레이저 건
    • 스나이퍼
    • 유도탄
    • 도비탄
  • 총열에서 실제 발사체 경로(카메라에서 촬영)까지의 보간 문제 해결
  • 체력 및 손상 시스템
  • 폭발
  • 발사체 예측 스폰

메인 화면으로

시작하기 전에

요건:

  • 유니티 2021.3
  • Fusion AppId: 샘플 실행을 위해서, 먼저 PhotonEngine Dashboard에서 Fusion AppId를 생성한 후, Real Time 설정 (Fusion 메뉴에서 접근) 내의 App Id Fusion 필드로 붙여 넣으세요. 게임 시작하기 섹션 지침에서 계속 진행하세요.

메인 화면으로

다운로드

버전 릴리즈 일자 다운로드
1.1.2 Oct 21, 2022 Fusion Projectiles 1.1.2 Build 54

메인 화면으로

올바른 접근 방식 선택하기

프로젝트에 참여하기 전에 Fusion의 발사체 네트워킹에 사용할 수 있는 몇 가지 다양한 옵션에 대해 논의해 보겠습니다.

메인 화면으로

A) NetworkTransform/NetworkRigidbody를 가지고 있는 NetworkObject

위치 동기화를 위해 NetworkTransform 또는 NetworkRigidbody를 사용하여 NetworkObject로 발사체를 스폰 합니다.

  • ✅ 단순한 솔루션
  • ✅ 관심 관리가 즉시 실행됨
  • ✅ 적절한 물리(PhysX) 사용 가능
  • NetworkObject 인스턴스화 오버헤드
  • NetworkTransform/NetworkRigidbody는 모든 변환 업데이트를 네트워크를 통해 전송하는 것을 의미
  • ❌ 필요시 예측된 스폰 처리

결론: 특정 상황에서 소량의 발사체에만 적합.

메인 화면으로

B) 발사 데이터를 가진 NetworkObject

발사체를 NetworkObject로 스폰, 스폰 된 객체의 NetworkBehaviour에 있는 네트워크 사용자 지정 데이터(일반적으로 발사 틱, 발사 위치 및 발사 방향)를 사용하여 서버와 클라이언트의 전체 발사체 궤적을 계산합니다.

  • ✅ 위치 갱신은 대역폭이 없음
  • NetworkObject 인스턴스화 오버헤드
  • ❌ 필요시 예측한 스폰 처리
  • ❌ 수동 관심 관리 처리

결론: 특정 상황에서 소량의 발사체에만 적합하며, 일반적으로 A보다 우수함.

메인 화면으로

C) 발사체 개수 속성

모든 NetworkBehaviour에 저장된 발사체 개수만 동기화합니다. 발사체는 시각적인 것에 불과하며 표준 유니티 개체로 스폰 됩니다. 입력 권한 및 상태 권한의 경우 사격은 정확하지만, 프록시의 경우 사격은 보간된 위치와 회전을 기준으로 합니다.

  • ✅ 단순한 해결
  • ✅ 네트워크를 통해 전송되는 데이터의 양이 가장 적음
  • ✅ 서버에서 시각적 스폰은 무시될 수 있음
  • ✅ 통제 대상(플레이어, 무기)의 일부로 관심 관리
  • ✅ 예측 스폰 불필요
  • ❌ 프록시 부정확. 프록시는 스냅샷 보간 위치에 있으므로 발사 위치/방향이 상당히 다를 수 있습니다.
  • ❌ 추가 데이터를 사용할 수 없기 때문에 가장 단순한 전방 방향 발사체에 대해서만 가능
  • ❌ 발사체 이동은 프록시에 알려져 있지 않으므로 발사체 비주얼은 벽과 다른 물체를 통해 이동

결론: 간단한 발사체와 짧은 발사체 시각(궤적)이 있는 하향식 사격수와 같이 프록시의 정밀도와 시각에 크게 신경 쓰지 않는 단순한 사용 사례에 적합한 솔루션.

메인 화면으로

D) 발사체 데이터 버퍼

각 발사체에 대한 사용자 지정 데이터 동기화 - NetworkBehaviour의 링 버퍼 형태로 네트워크 배열에 저장됩니다. 발사체는 표준 유니티 개체로 생성된 시각적인 자료일 뿐입니다. 최적의 대역폭 사용을 위해서는 발사체 데이터 세트가 매우 적어야 합니다. 예를 들어 발사체 궤적은 발사 위치, 발사 방향 또는 기타 데이터에서 계산됩니다. 그러나 일부 특수 용도의 경우 위치를 지속적으로 업데이트할 수도 있습니다.

  • ✅ 대역폭 소비 좋음
  • ✅ 대부분의 발사체 유즈케이스 지원
  • ✅ 서버에서 시각적 산란은 무시될 수 있음
  • ✅ 통제 대상(플레이어, 무기)의 일부로 관심 관리
  • ✅ 예측 스폰 불필요
  • ❌ 제어 객체 없이 발사체가 존재할 수 없음 = 제어 객체보다 오래 지속될 수 없음
  • ❌ 튕기기와 같은 발사체 물리는 수동으로만 계산됩니다.

결론: 매우 오래 존재하는 발사체(소유자보다 더 오래 살아남을 수 있음) 또는 매우 오래 이동하는 중요한 발사체(관심 관리로 인해)를 제외한 대부분의 상황에서 매우 좋은 솔루션입니다.


이 샘플은 주로 솔루션 D - 발사체 데이터 링 버퍼 사용(발사체 관리 섹션) 참고)에 초점을 맞추고 있지만, 접근 방식 B의 예도 포함하고 있습니다(스탠드얼론 발사체 참고).

NetworkedObject로서 스폰되는 발사체의 추가 예제는, Tanknarok 샘플을 참고하세요.

메인 화면으로

게임 시작하기

디버그 시작

Game 씬(Scenes/Game)을 열고 게임을 시작합니다. 게임을 시작할 모드를 선택할 수 있는 Fusion 표준 NetworkDebugStart 창의 약간 수정된 버전이 나타납니다.

Debug Start

메인 화면으로

멀티 피어

Start Host + 1 Client 또는 Start Host + 2 Clients를 선택하면 멀티피아 모드로 게임이 시작됩니다. 이 접근 방식은 발사체가 프록시에서 어떻게 동작하는지 테스트하는 데 매우 권장됩니다.

피어 간을 전환하려면 숫자 패드에서0, 1, 2, 그리고 3 키를 누릅니다.

또한 Runner Visibility Controls 창(맨 위 메뉴 Fusion/Windows/Runner Visibility Controls)을 사용하여 피어를 전환할 수 있습니다.

Runner Visibility Controls

프록시에서 슈팅이 어떻게 동작하는지 보려면 클라이언트 A만 표시되도록 설정하고 클라이언트 B만 입력 공급자로 사용하도록 설정하십시오. 클라이언트 B에서의 슈팅은 클라이언트 A의 관점에서 관찰할 수 있습니다.

Runner Visibility Controls

노트: 멀티피어 모드가 제대로 작동하려면 정적 필드(UI, 카메라 리그, 플레이어 데이터 등에 대한 접근)를 통해 씬 객체를 참조하지 않는 것이 필수적이지만, 일반적으로도 정적 필드를 피하는 것이 좋습니다. 코드 베이스 전체에서 공통 객체에 액세스할 수 있는 방법에 대한 한 가지 해결책은 Scene 및 씬 SceneContext 섹션을 참조하십시오.

메인 화면으로

컨트롤

이동 시에는 W, S, A, D , 발사는 Mouse1, 사용할 수 있으면 대체 발사에는 Mouse2를 사용합니다. 무기는 마우스 스크롤 휠을 사용하거나 적절한 알파 번호 키를 눌러 전환할 수 있습니다. 게임 UI에서 선택한 무기 및 발사체 유형에 대한 정보를 확인하십시오.

커서를 잠그거나 놓으려면 ENTER 키를 사용하십시오.

First Play

메인 화면으로

프로젝트 구조

프리팹 타입 위치
플레이어 및 에이전트 /Prefabs
무기 /Prefabs/Weapons
발사체 /Prefabs/Projectiles

메인 화면으로

플레이어

플레이어 (Player 스크립트, Player 프리팹) 게임에 연결된 피어를 나타내며, 시각적인 것이 없습니다. 플레이어를 사용하여 통계, 닉네임, 선택된 영웅, 게임 플레이에 참여하고 싶은 욕구 등을 동기화합니다. 또한 플레이어는 입력을 처리합니다.

에이전트 (PlayerAgent 스크립트, Agent 프리팹)은 플레이어에 의해서 조정되는 게임 내 캐릭터를 나타냅니다. 에이전트는 Gameplay로 스폰 되며, 체력, 무기 및 기타 일반적인 것을 가지고 있습니다. 필요에 따라 스폰 또는 스폰 해제될 수 있습니다.

Photon Dummy

메인 화면으로

발사체 관리

ProjectileManager는 Fusion 발사체 샘플의 핵심입니다. 발사체 데이터 버퍼 및 발사체의 시각적 표현 생성/업데이트/삭제 작업을 처리합니다. 발사체 관리자는 제어 대상(예: 에이전트, 터렛)에 상주하며 해당 물체가 소유한 모든 무기의 발사체 업데이트를 담당합니다.

Projectile Manager

발사체 관리자에는 발사체 데이터를 특정 프리팹에 올바르게 쌍으로 구성하기 위해 프로젝트 프리팹 배열이 필요합니다. 단순성을 위해 발사체 관리자는 인스펙터에서 직접 프리팹에 대한 레퍼런스를 제공합니다.

노트: 프리팹 배열에 접근하는 더 나은 솔루션은 게임마다 다르겠지만, 예를 들어 설정 데이터가 있는 스크립트 가능 객체일 수 있습니다.

ProjectileManager는 발사체 궤적 및 기타 발사체 거동을 계산하는 데 사용되는.ProjectileData를 저장합니다:

[StructLayout(LayoutKind.Explicit)]
public struct ProjectileData : INetworkStruct
{
    public bool    IsActive          { get { return _state.IsBitSet(0); } set { _state.SetBit(0, value); } }
    public bool    IsFinished        { get { return _state.IsBitSet(1); } set { _state.SetBit(1, value); } }

    [FieldOffset(0)]
    private byte   _state;

    [FieldOffset(1)]
    public byte    PrefabId;
    [FieldOffset(2)]
    public byte    WeaponAction;
    [FieldOffset(3)]
    public int     FireTick;
    [FieldOffset(7)]
    public Vector3 FirePosition;
    [FieldOffset(19)]
    public Vector3 FireVelocity;
    [FieldOffset(31)]
    public Vector3 ImpactPosition;
    [FieldOffset(43)]
    public Vector3 ImpactNormal;

    // Custom projectile data

    [FieldOffset(55)]
    public HomingData    Homing;
    [FieldOffset(55)]
    public KinematicData Kinematic;

    public struct HomingData : INetworkStruct
    {
        public NetworkId Target;
        public Vector3   TargetPosition; // Used for position prediction
        public Vector3   Position;
        public Vector3   Direction;
    }

    public struct KinematicData : INetworkStruct
    {
        public NetworkBool HasStopped;
        public Vector3     FinishedPosition;
        public int         StartTick;
        public byte        BounceCount;
    }
}

이 구조체는 현재 이 프로젝트에서 설명하는 발사체 기능의 수 때문에 상당히 큽니다. 또한 동일한 데이터 값을 사용하지 않는 여러 다른 발사체 동작이 입증되기 때문에 데이터 구조체는 특정 발사체 데이터의 조합을 사용합니다.

실제로 이 ProjectileData 구조체는 가능한 한 최소화하도록 하는 것이 좋습니다. 대부분의 게임에서 필요한 기능은 여기서 설명하는 것보다 적습니다. 주석 처리된 단순화된 버전의 ProjectileData를 확인하십시오.

public struct ProjectileData : INetworkStruct
{
    public bool    IsActive          { get { return _state.IsBitSet(0); } set { _state.SetBit(0, value); } }
    public bool    IsFinished        { get { return _state.IsBitSet(1); } set { _state.SetBit(1, value); } }

    private byte   _state;

    public byte    PrefabId;
    public byte    WeaponAction;
    public int     FireTick;
    public Vector3 FirePosition;
    public Vector3 FireVelocity;
    [Networked, Accuracy(0.01f)]
    public Vector3 ImpactPosition { get; set; }
    [Networked, Accuracy(0.01f)]
    public Vector3 ImpactNormal { get; set; }
}
노트: 유니온 사용(= StructLayout(LayoutKind.Explicit) 속성)은 구조체 내부에 속성을 갖는 것을 방지하고 따라서 Networked 그리고 Accuracy 속성의 사용을 금지합니다. 대역폭을 줄이기 위한 유니온 속성 없이 사용하는 방법과 ImpactPosition 그리고 ImpactNormal에 대한 Accuracy 속성 사용법에 대해서 살펴보세요.

메인 화면으로

발사체

Projectile 스크립트는(prefab) 2가지 사용법이 존재합니다:

1) ProjectileData를 생성하고 조작하는 데 사용되는 GetFireDataOnFixedUpdate 메소드를 구현합니다. 이러한 메소드는 상태 권한과 입력 권한에서 모두 FixedUpdateNetwork에서 호출되며, 프리팹 인스턴스가 아닌 프리팹에서 직접 호출됩니다.

public abstract ProjectileData GetFireData(NetworkRunner runner, Vector3 firePosition, Vector3 fireDirection);
public abstract void OnFixedUpdate(ProjectileContext context, ref ProjectileData data);
노트: 발사체는 NetworkBehaviour가 아니며 NetworkObject와 연관이 없습니다. 따라서 GetFiredData 또는 OnFixedUpdate내의 모든 네트워크 데이터는 ProjectileData 구조체에 포함되어야 합니다.

2) 발사체 인스턴스는 발사체의 시각적 표현으로도 사용됩니다. 이를 통해 이동 코드와 같은 공유 FUN(simulation) 및 Render 기능을 사용할 수 있습니다. 발사체 인스턴스에 대해 실행되는 메소드는 Activate, OnRenderDeactivate이며 순전하게 시각적인 것입니다.

public void Activate(ProjectileContext context, ref ProjectileData data)
{
    PrefabId = data.PrefabId;
    IsFinished = false;

    OnActivated(context, ref data);
}

public void Deactivate(ProjectileContext context)
{
    IsFinished = true;

    OnDeactivated(context);
}

public virtual void OnRender(ProjectileContext context, ref ProjectileData data)
{
}

public virtual void Discard()
{
    IsFinished = true;
}

또한 발사체가 서버에서 발사되지 않은 경우 빗나간 예측에 대한 사용자 지정 동작에 대해 Discard 메소드를 재정의할 수 있습니다(예: 불타는 효과 플레이).

모든 발사체는 새로운 NetworkObject (예: 폭발)뿐만 아니라 충격에 대한 시각적 효과를 발생시킬 수 있습니다.

메인 화면으로

발사체 유형

Fusion 발사체에는 여러 가지 일반적인 시나리오에서 사용될 수 있는 여러 발사체 유형이 포함되어 있습니다.

히트스캔 발사체

레이 캐스트 또는 인스턴트 발사체로 알려져 있습니다.

지정된 최대 거리를 가진 레이 캐스트는 발사 시 즉시 발사되며 적중 여부가 즉시 평가됩니다.

InstantHitscanProjectile
총열에서 표적 위치까지 흔적을 시각적으로 표시할 수 있습니다. 잔상은 시간이 지나면 사라집니다.

예제 무기: 스나이퍼 (총 꼬리 부분 사라짐), 샷건 (즉시 표시)

Sniper
총열에서 충격까지 꼬리 표시가 보이는 히트 스캔 발사체

FlyingHitscanProjectile
히트은 즉시 처리되지만 목표 위치까지 지정된 속도로 이동하는 더미 비행 발사체가 있습니다. 예제 무기: 소총

Rifle
날아가는 더비 탄환을 가진 히트 스캔 발사체

메인 화면으로

키네마틱 발사체

그냥 발사체로 알려져 있음

시간이 지남에 따라 이동하는 발사체로, 시뮬레이션 틱마다 이전 위치와 새 위치 사이에서 짧은 광선 캐스트를 실행합니다.

SimpleKinematicProjectile
직선으로 날아가는 키네마틱 발사체.
예제 무기: 펄스 건

Pulse Gun
키네마틱 발사체

AdvancedKinematicProjectile
중력의 영향을 받아 벽이나 다른 물체에서 튕겨 나올 수 있는 운동학적 발사체입니다. 다음과 같은 발사체 유형으로 여러 발사체 동작을 관리할 수 있습니다:

  • 터치 시 폭발과 함께 떨어지는 발사체 예제 무기: 펄스 건 (대체 발사 - 수류탄)

  • 일정 시간 후 폭발과 함께 떨어지고 튕김 예제 무기: 소총 (대체 발사 - 수류탄)

  • 직선으로 튕기는 발사체 예제 무기: 도비탄

Ricochet Gun
도비탄의 튕기는 발사체

HomingKinematicProjectile
목표물을 타격하기 위해 활발하게 회전하는 발사체입니다. 움직이는 표적에 명중할 표적의 위치를 예측할 수 있습니다. 대상 바디 부위, 턴 특성 및 대상 탐색 동작을 지정할 수 있습니다.
예제 무기: 유도탄 (고속 유도탄에 대한 1차 사격, 2차 사격 - 로켓 - 더 느린 목표 재설정 발사체에 대한 2차 사격)

Homing Gun
유도탄의 유도 발사체

메인 화면으로

레이

Also known as Beam or Laser

시간이 지남에 따라 손상을 입히는 지속적인 광선입니다. 레이는 무기 부품인 무기 빔(무기 컴포넌트 섹션 참조)을 사용하여 구현되지만 이 프로젝트에서는 실제로 발사체는 아닙니다. 예제 무기: 레이저 건

Laser Gun
레이저 레이

메인 화면으로

독립형 발사체

독립형 네트워크 객체로 생성할 수 있는 발사체입니다. 일부 특수한 상황에서만 사용해야 합니다. 올바른 접근 방법 선택하기 섹션을 참조하세요.

DataStandaloneProjectile
표준 발사체 기능의 래퍼입니다. ProjectileManager와 유사한 방식으로 ProjectileData를 만들고 업데이트합니다. 단 하나의 발사체에 대해서만 가능합니다. 예측하여 스폰 할 수 있습니다.

에제 무기: 도비탄 (대체 발사 - 바운싱 드롭)

메인 화면으로

발사체 보간

1인칭 게임에서 발사체를 발사할 때 총열에서 직접 발사체 계산을 수행하거나(현실적 접근) 카메라 중앙에서 발사체 계산을 수행할 수 있습니다(표준 접근).

노트: 현실적인 접근은 몇몇 (하드코어) 게임에서 사용됩니다. 이는 사격의 느낌을 더 현실적이게 만들지만(사격 위치는 플레이어 애니메이션에 따라 다름), 무기가 카메라에서 상쇄되기 때문에 원치 않는 명중(코너 문제)을 일으키기 쉽습니다.

Fusion 발사체는 카메라 중앙에서 발사하는 보다 표준적인 접근 방식을 사용합니다. 그러나 이 방식은 시뮬레이션된 경로(카메라에서 시작됨)와 렌더링 된 경로(총열에서 시작됨) 사이에 불일치를 만듭니다. 이것은 총열에서 실제 발사 경로까지 시간이 지남에 따라 발사체 위치를 보간함으로써 해결됩니다. 보간 값(보간 시간, 보간 용이성)은 모든 운동학적 발사체에 설정할 수 있습니다.

Projectile interpolation
탑-다운 뷰에서 발사체 보간

Kinematic projectile setup
운동학적 발사체 설정

노트: 발사체 보간은 운동학적 발사체에 대해서만 필요합니다. 히트 스캔 발사체의 경우, 이미 발사체가 어디에 영향을 미칠지 알고 있기 때문에 보간이 필요하지 않습니다. 따라서 더미 비행 시각은 그 지점까지 직접 이동할 수 있습니다.

메인 화면으로

무기

개요

Fusion 발사체에는 소형 무기 취급 시스템이 포함되어 있습니다. 무기 변경만 다루는 기본 구현입니다. 무기 드롭, 픽업, 재장전, 반동 패턴, 동적 분산 및 기타 자세한 사용 방법은 Fusion BR 샘플을 확인하세요.

그러나 모든 종류의 무기를 관리하기 위해, 편리한 무기 행동-컴포넌트 시스템이 포함되어 있습니다.

메인 화면으로

무기 액션

무기 액션은 하나의 무기 액션을 나타내는 무기 액션 집합입니다. 한 가지 무기 액션은 예를 들어 표준 발사이고 다른 작용은 대체 발사입니다. 무기는 다양한 무기 액션을 할 수 있습니다.

Weapon Action
필요한 모든 무기 컴포넌트와 함께 펄스 건에 대한 주요 무기 액션

메인 화면으로

무기 컴포넌트

무기 컴포넌트는 자체 로직이 있는 무기의 일부를 나타내며 다양한 시나리오에서 재사용할 수 있습니다. 무기는 원하는 기능을 형성하기 위해 여러 컴포넌트로 조립될 수 있습니다. Fusion 발사체에는 다음과 같은 무기 컴포넌트가 포함되어 있습니다:

  • WeaponMagazine - 탄약 제공
  • WeaponTrigger - 무기가 발사되어야 한다고 말해줌 (플레이어 입력 확인, 무기 카덴스 제어)
  • WeaponBarrel - 발사체 발사
  • WeaponFireEffect - 총구 표시, 발사 소리를 재생하며, 충격을 적용하고, 카메라 흔들림
  • WeaponBeam - 연속적인 빔 발사

무기 컴포넌트는 WeaponDesires 구조체를 통해 느슨하게 커플링 되어 있습니다.

노트: 다양한 무기를 만들 때, 다른 무기들을 재사용하면서 하나 이상의 무기들을 교환하는 것이 아이디어입니다. 한 가지 예는 레이저 건이며, WeaponBarrel 컴포넌트는 WeaponBeam으로 교환됩니다 - 여전히 탄약을 공급하고, 방아쇠는 여전히 언제 발사해야 하는지 알려줍니다. 단지 발사 효과가 다를 뿐입니다. 또 다른 예로는 발사가 시작되기 전에 회전하는 총열이 속도를 내는 데 시간이 걸리는 미니건입니다 - 이 인스턴스에서는 표준 트리거를 대체하기 위해 DelayedTrigger 컴포넌트를 만들 수 있습니다.

메인 화면으로

흔들리는 효과

ShakeEffect 유틸리티는 무기 발사에 대응하여 카메라 흔들기(Game 씬의 GameplayScene/SceneCamera/Shaker객체)를 구동하는 데 사용됩니다. 이 효과는 위치 및 회전 흔들림 범위를 설정할 수 있는 WeaponFireEffects 컴포넌트에서 트리거 됩니다. ShakeEffect 유틸리티는 다양한 카메라 흔들림 및 지속적인 흔들림(연속 발사)을 지원합니다.

Camera shake
카메라 흔들림 설정

메인 화면으로

체력 및 피해 시스템

히트 동기화의 경우 발사체 데이터와 유사한 접근 방식이 사용됩니다. 적중 횟수는 Hit 구조체의 작은 네트워크 원형 버퍼에 저장됩니다.

public struct Hit : INetworkStruct
{
    public EHitAction Action;
    public float      Damage;
    [Networked, Accuracy(0.01f)]
    public Vector3    RelativePosition { get; set; }
    [Networked, Accuracy(0.1f)]
    public Vector3    Direction { get; set; }
    public PlayerRef  Instigator;
}

Hit 구조체에서 적절한 히트 반응을 구성할 수 있습니다. 예를 들어 히트 애니메이션 재생, UI에서 히트 방향 표시, 히트 확인 및 손상 유발 수치 표시, 블러드 효과의 스폰 등입니다.

노트:히트의 RelativePosition가 절대 위치 대신 Hit 데이터에 어떻게 저장되는지 주의합니다. 프록시의 위치는 서버에서 마지막으로 받은 두 개의 틱 사이에 보간되므로, 피가 튀기는 것과 같은 히트 효과를 바디에 정확하게 나타나게 하려면 상대 위치가 더 좋습니다.

메인 화면으로

게임 플레이 요소

폭발

특정 반경 내에서 피해를 다루는 단순하게 스폰 되는 네트워크 객체입니다.

Explosion

메인 화면으로

피해 영역

피해는 시간 경과에 따라 이 지역 내 모든 대상에게 적용됩니다. 들어오는 피해를 테스트하는 데 사용합니다.

Damage Area

메인 화면으로

래그돌

에이전트 데스 애니메이션은 에이전트가 사망할 때 엄격한 바디 물리학을 활성화하는 것만으로 다루는 단순함을 위한 것입니다. SimpleAgentRagdoll 스크립트를 확인해 주세요.

Ragdoll

메인 화면으로

터렛

SimpleTurret은 독립형 발사체를 일정 간격으로 발사하는 데 사용됩니다. 대상 로직을 검색하거나 대상을 향한 회전이 없습니다. 에이전트 프리팹 외부에서 무기를 테스트하는 데 사용됩니다.

Turret

메인 화면으로

게임 핵심

GameManager

연결된 플레이어의 참여 및 퇴장을 처리하고 Player 프리팹을 생성합니다. 연결된 플레이어의 취급에 대한 자세한 내용은 Fusion BR 샘플을 참조하세요.

메인 화면으로

Gameplay

GameplayAgent 프리팹의 스폰/스폰 해제를 담당합니다. 이 기본 구현은 끝없는 데스매치 역할을 합니다. 적절한 데스매치, 깃발 잡기, 엘리미네이션 등 다양한 게임 플레이 기능을 추가할 수 있도록 상속 및 확장할 수 있습니다.

메인 화면으로

Pooling

발사체와 관련된 프로젝트에서는 많은 양의 물체 스폰(발사체, 총구 효과, 충격, 타격 효과 등)이 예상됩니다. 새 객체의 인스턴스화는 비용이 많이 들기 때문에 Fusion 발사체의 모든 것이 풀링 됩니다.

폴링에는 2가지 유형이 있습니다:

  • NetworkObjectPoolNetworkObject를 풀링 하는 데 사용됩니다. 네트워크 객체 풀이 작동하려면 INetworkObjectPool 인터페이스를 구현해야 하며 NetworkRunner 가 시작될 때 시작 매개 변수로 할당되어야 합니다(CustomNetworkDebugStart 스크립트에서 발생합니다). 자세한 내용은 Fusion 매뉴얼의 네트워크 객체 풀 섹션을 참조하십시오.

  • ObjectCache는 임팩트 효과와 같은 비네트워크 객체에 사용할 수 있는 일반적인 GameObject 풀입니다. 지정한 지연으로 객체를 반환할 수 있는 편리한 기능이 있습니다.

메인 화면으로

Scene 및 SceneContext

Scene은 UI, 카메라, 음악, 미니맵 등 씬별 기능과 서비스(SceneService)를 처리합니다. 씬 서비스는 프로젝트에 필요한 특정 시간에 초기화, 활성화, 비활성화 및 업데이트할 수 있도록 여기서 수동으로 업데이트됩니다.

SceneContext는 통계 정보를 사용하지 않고도 코드 베이스 전체에서 필요한 공통 서비스 또는 기타 정보에 안전하게 접근할 수 있습니다. 씬 컨텍스트는 서비스에 자동으로 전달되며 GameplaySceneNetworkObjectPool의 네트워크 객체에도 할당됩니다. SceneContext에 접근해야 하는 경우 NetworkBehaviourSimulationBehaviour 대신 ContextBehaviourContextSimulationBehaviour에서 상속합니다.

메인 화면으로

프로젝트 확장하기

새로운 무기 추가

1) 새로운 프리팹을 생성하거나 기존 무기를 복제합니다.

2) 프리팹에 적어도 하나 이상의 WeaponAction 컴포넌트와 적절한 무기 컴포넌트가 있는지 확인합니다. 무기 액션과 무기 컴포넌트는 모두 하나의 GameObject(Sniper 프리팹 참조)에 있을 수 있고, 여러 개의 무기 액션의 경우 계층 구조로 배치할 수 있습니다(Rifle 프리팹 참조).

3) Weapon 컴포넌트의 WeaponSlot을 설정하여 플레이어 무기 배열에서 어느 위치를 차지해야 하는지 지정합니다. 슬롯 1이 첫 번째 보이는 무기입니다.

4) 선택적으로 Weapon 컴포넌트에 무기 이름과 아이콘을 지정합니다.

5) Agent 프리팹의 무기 컴포넌트에 있는 초기 무기 필드에 무기를 할당합니다.

Weapons inspector

메인 화면으로

새로운 발사체 추가

1) 새 프리팹을 만들거나 기존 발사체를 복제합니다. Projectile에서 상속되는 컴포넌트가 있는지 확인하십시오.

2) WeaponBarrel 컴포넌트의 무기 프리팹에 발사체 프리팹을 할당합니다.

WeaponBarrel inspector

3) 제어 객체의 ProjectileManager에 있는 발사체 프피팹(예: Agent 프리팹)를 할당하여 발사 시 발사체가 생성되도록 합니다.

메인 화면으로

3인칭으로 전환

Fusion 발사체는 FPS 게임으로 제작되었지만 대부분의 기능은 TPS 게임에도 적용됩니다. TPS 게임에서 발사할 때, 먼저 카메라에서 레이를 던져야 플레이어가 쏘려고 하는 지점을 찾을 수 있습니다. 그런 다음 실제 발사체 캐스팅은 캐릭터의 위치(캐릭터 어깨 근처의 고정 위치는 일반적으로 잘 작동함)에서 카메라 캐스팅에서 얻은 지점까지 됩니다. 플레이어가 원치 않는 물체를 너무 많이 치지 않도록 하기 위해 일반적으로 (두 번째 캐스팅과 일부 충돌을 무시하는 것과 같은) 몇 가지 트릭이 수반됩니다. TPS를 처리하는 예는 Fusion BR을 확인하세요.


기술문서 TOP으로 돌아가기