This document is about: FUSION 1
SWITCH TO

발사체 고급

Level 4

개요

발사체 고급은 슈팅 게임에서 다양한 유형의 발사체에 대한 네트워킹을 구현하는 방법을 설명합니다. 멀티플레이어 발사체를 프로그래밍하는 것은 성능, 대역폭 소비 및 정밀도의 균형을 맞추는 어려운 작업이 될 수 있습니다. 또한 시뮬레이션된 발사체 경로와 렌더링 된 발사체 경로 사이의 차이를 없애주는 부드러운 렌더링이 필요합니다. 발사체 고급은 이 작업을 조금 더 명확하게 하고 단순화하는 것을 목표로 합니다.

발사체를 개념화하기 위해 샘플은 다른 지원 시스템(게임 플레이 핸들링, 체력 및 손상 시스템, 무기)과 함께 간단한 FPS 게임으로 구축되며 슈팅 게임을 구축하는 데 견고한 토대로 사용할 수 있습니다.

발사체 소개 및 다른 프로젝트에 쉽게 복사할 수 있는 더 많은 독립형 예제는 발사체 기본을 참조하십시오

이 예제는 HostMode 토폴로지를 사용합니다.

특징

  • 발사체 데이터 링 버퍼를 이용한 개별 NetworkObject가 없는 발사체 처리
  • 히트 스캔에서 유도탄에 이르기까지 다양한 발사체 유형
  • 무기 컴포넌트 시스템
  • 7가지 무기
    • 펄스 건
    • 라이플
    • 산탄총
    • 레이저 건
    • 저격수
    • 유도탄
    • 도탄
  • 무기통에서 실제 발사체 경로로의 보간 해결(카메라에서 발사)
  • 체력 및 손상 시스템
  • 폭발
  • 발사체의 예측 스폰

시작하기 전에

필요사항:

  • 유니티 2021.3
  • Fusion AppId: 샘플 실행을 위해서는, 먼저 PhotonEngine 관리 화면의 Fusion AppId를 생성하고 Real Time 설정의 App Id Fusion 필드에 붙여 넣습니다(Fusion 메뉴에서 접근 가능). 게임 시작하기에 가이드 된 대로 계속합니다.

다운로드

버전 릴리즈 일자 다운로드
1.1.6 Apr 14, 2023 Fusion Projectiles 1.1.6 Build 182

게임 시작하기

디버그 시작

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 Projectiles 샘플의 핵심입니다. 이것은 발사체 데이터 버퍼와 발사체의 시각적 표현의 생성/업데이트/삭제를 처리합니다. 발사체 관리자는 제어 객체(예: Agent, Turret)에 상주하며 해당 객체가 소유한 모든 무기에서 발사체를 업데이트하는 역할을 합니다.

Projectile Manager

Projectile Manager에서 올바른 쌍의 Projectile 데이터를 특정 프리팹으로 수정하려면 Projectile 프리팹 배열이 필요합니다. 간단히 설명하기 위해 발사체 관리자는 인스펙터에게 직접 프리팹에 대한 참조를 가지고 있습니다.

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

ProjectileManagerProjectileData를 저장하여 발사체 궤적 및 기타 발사체 동작을 계산합니다:

C#

[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의 주석이 달린 단순화된 버전을 확인합니다:

C#

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) 속성)의 사용은 구조체 내부에 속성을 갖는 것을 막아주기 때문에, NetworkedAccuracy 속성의 사용을 금지합니다. 공용체 속성을 사용하지 않고 ImpactPositionImpactNormalAccuracy 속성을 사용하여 대역폭을 절약하는 방법을 확인하십시오.

발사체

Projectile 스크립트(프리팹)에는 2가지 사용법이 있습니다:

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

C#

public abstract ProjectileData GetFireData(NetworkRunner runner, Vector3 firePosition, Vector3 fireDirection);
public abstract void OnFixedUpdate(ProjectileContext context, ref ProjectileData data);
노트: 발사체는 NetworkBehaviour가 아니며NetworkObject와 관련이 없습니다. 따라서 GetFiredData 또는 OnFixedUpdate에서 사용되는 모든 네트워크 데이터는ProjectileData 구조체에 포함되어야 합니다.
  1. 발사체 인스턴스는 발사체의 시각적 표현으로도 사용됩니다. 이를 통해 이동 코드와 같은 FUN(시뮬레이션) 및 렌더링 기능을 공유할 수 있습니다. 발사체 인스턴스에 대해 실행되는 메소드는 Activate, OnRenderDeactivate이며 순수하게 시각적입니다.

C#

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 발사체에는 많은 일반적인 시나리오에서 사용할 수 있는 몇 가지 발사체 유형이 포함되어 있습니다.

히트 스캔 발사체

레이 캐스트 또는 Instant 발사체로 알려져 있음

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

InstantHitscanProjectile
무기통에서 표적 위치까지 모든 방향으로 시각적 흔적을 표시할 수 있습니다. 흔적은 시간이 지나면 사라집니다.
예: 스나이퍼(사라진 흔적), 샷건(순간 영상)

Sniper
Hitscan projectile with trail from barrel to impact

FlyingHitscanProjectile
적중은 즉시 처리되지만 목표 위치까지 지정된 속도로 이동하는 더미 플라잉 발사체가 있습니다.
무기 사례: 소총

Rifle
Hitscan projectile with flying dummy bullets

운동학적 발사체

발사체로 알려져 있음

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

SimpleKinematicProjectile
운동학적 발사체가 직선으로 날아가고 있음.
무기 사례: 펄스 건

Pulse Gun
Kinematic projectile

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

  • 접촉 시 폭발과 함께 낙하하는 발사체
    무기 사례: 펄스 건 (대체 사격 - 수류탄)

  • 일정 시간 후 폭발과 함께 낙하 및 튕기는 발사체
    무기 사례: 소총 (대체 사격 - 수류탄)

  • 스트레이트 바운스 발사체
    무기 사례: 리코쳇 건

Ricochet Gun
Ricocheting projectile of the Ricochet Gun

HomingKinematicProjectile
목표물을 향해 능동적으로 회전하는 발사체입니다. 이동하는 목표물을 타격할 목표 위치를 예측할 수 있습니다. 대상이 되는 신체 부위, 턴 속성 및 대상 탐색 동작을 지정할 수 있습니다.
예: 호밍 건 (고속 호밍 발사체를 위한 1차 사격, 로켓 - 느린 재표적 발사체용 2차 사격)

Homing Gun
Homing projectiles of the Homing Gun

광선

또는 레이저로 알려짐

지속적인 광선은 시간에 따라 손상을 입힙니다. 레이는 무기 부품인 WeaponBeam(무기 부품섹션에서 자세히 설명함)을 사용하여 구현되며, 이 프로젝트에서는 실제 발사체가 아닙니다.

무기 사례: 레이저 건

Laser Gun
Laser ray

독립형 발사체

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

DataStandaloneProjectile
표준 발사체 기능의 래퍼입니다. ProjectileManager와 유사한 방식으로 ProjectileData를 생성하고 업데이트하며, 한 개의 ProjectileData에 대해서만 수행합니다. 예측적으로 생성할 수 있습니다.
예 무기: 리코쳇 건 (대체 사격 - 반동 드롭)

발사체 보간

1인칭 게임에서 발사체를 발사할 때는 무기통(현실적 접근) 또는 카메라 중앙(표준 접근)에서 직접 발사체 계산을 수행하도록 선택할 수 있습니다.

노트: 현실적인 접근법은 몇몇 (하드코어) 게임에서 사용됩니다. 이는 발사가 더 현실적으로 느껴지지만 안정성이 떨어지며(발사 위치는 플레이어 애니메이션에 따라 다름), 무기가 카메라에서 상쇄되기 때문에 원치 않는 타격(코너 문제)을 받기 쉽습니다.

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

Projectile interpolation
Projectile interpolation from the top-down view
Kinematic projectile setup
Kinematic projectile setup
노트: 발사체 보간은 운동학적 발사체에만 필요합니다. 히트 스캔 발사체의 경우, 우리는 이미 발사체가 어디에 충격을 주는지 알고 있기 때문에 보간이 필요하지 않아 더미 플라잉 비주얼이 바로 그 지점으로 이동할 수 있습니다.

무기

개요

Fusion 발사체에는 소형 무기 취급 시스템이 포함되어 있습니다. 무기 교환만 처리하는 기본 구현입니다. 무기 드롭, 픽업, 재장전, 반동 패턴, 동적 분산 및 기타 체크 Fusion BR 샘플과 같은 보다 정교한 용도에 사용됩니다.

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

무기 동작

무기 동작은 단일 무기 동작을 나타내는 무기 컴포넌트의 집합입니다. 하나의 무기 동작은 예를 들어 표준 발사이고 다른 동작은 대체 발사입니다. 무기는 다양한 무기 동작을 할 수 있습니다.

Weapon Action
Primary weapon action on Pulse Gun with all necessary weapon components

무기 컴포넌트

Weapon 컴포넌트는 고유한 로직을 가지고 있으며 다른 시나리오에서 재사용할 수 있는 무기의 일부를 나타냅니다. 무기는 여러 컴포넌트로부터 조립되어 원하는 기능을 형성할 수 있습니다. Fusion 발사체는 다음과 같은 여러 가지 무기 컴포넌트와 함께 제공됩니다:

  • WeaponMagazine - 탄약 제공
  • WeaponTrigger - 무기가 발사되어야 하는 시점을 말합니다(플레이어 입력 확인, 무기 진행 제어)
  • WeaponBarrel - 발사체 발사
  • WeaponFireEffect - 총구를 보여주고, 발포 소리를 재생하고, 녹백을 적용하고, 카메라 셰이크를 시작합니다
  • WeaponBeam - 연속적인 빔을 발사합니다

무기 컴포넌트는 WeaponDesires 구조체를 통해 느슨하게 결합됩니다.

노트: 다양한 무기를 만들 때는 하나 이상의 컴포넌트를 교환하고 나머지 컴포넌트는 재사용하는 것이 아이디어입니다. 한 가지 예로 레이저 건이 있습니다. 여기서 WeaponBarrel 구성 요소가 WeaponBeam로 교체되었습니다 - 매거진은 여전히 탄약을 제공하고, 방아쇠는 여전히 발사 시기를 알려주며, 단지 발사 효과가 다를 뿐입니다. 또 다른 예는 회전하는 배럴이 발사가 시작되기 전에 속도를 얻는 데 시간이 걸리는 미니건입니다. 이 경우에는 DelayedTrigger 컴포넌트를 생성하여 표준 트리거를 대체할 수 있습니다.

흔들림 효과

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

Camera shake
Camera shake setup

체력과 피해 시스템

히트 동기화에는 발사체 데이터와 유사한 접근 방식이 사용됩니다. 히트는 히트 구조의 네트워크로 연결된 작은 원형 버퍼에 저장됩니다.

C#

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에 저장되는 방식에 주목합니다. 프록시의 위치는 서버에서 마지막으로 수신한 두 개의 틱 사이에 보간 되므로 상대적 위치는 혈액 스플래시와 같은 타격 효과를 신체에 올바르게 배치하는 것이 좋습니다.

Gameplay 요소

폭발

단순 생성된 네트워크 객체는 일정 반경 내에서 피해를 입힙니다.

Explosion

피해 영역

시간이 지남에 따라 이 영역 내의 모든 대상에게 대미지가 적용됩니다. 이 도구를 사용하여 들어오는 손상을 테스트합니다.

Damage Area

Ragdoll

에이전트 데스 애니메이션은 에이전트가 죽었을 때 강체 물리학을 활성화하는 것만으로 처리되는 단순성을 위한 것입니다. SimpleAgentRagdoll 스크립트를 확인합니다.

Ragdoll

터렛

SimpleTurret은 독립형 발사체를 일정 간격으로 스폰 시키는 데 사용됩니다. 대상 논리를 검색하거나 대상을 향해 회전하지 않습니다. Agent 프리팹 외부에서 무기를 테스트하는 데 사용됩니다.

Turret

게임 핵심

GameManager

연결된 플레이어의 참여 및 탈퇴를 처리하고 Player 프리팹을 생성합니다. 연결된 플레이어에 대한 자세한 처리 및 연결된 플레이어 데이터 저장에 대한 자세한 내용은 Fusion BR 샘플을 참조하십시오.

Gameplay

GameplayAgent 프리팹의 스폰/해체를 담당합니다. 이 기본 구현은 끝없는 데스 매치 역할을 합니다. 적절한 데스매치, 플래그 캡처, 제거 등 다양한 게임 플레이 기능을 추가할 수 있습니다.

폴링

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

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

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

  • **ObjectCache**는 지네릭 GameObject 폴링으로 충격 효과와 같은 비위험 물체에 사용할 수 있는 폴링입니다. 지정된 지연으로 객체를 반환하는 편리한 기능이 있습니다.

씬 및 SceneContext

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

**SceneContext**는 코드 베이스 전반에 걸쳐 필요한 공통 서비스 또는 기타 정보에 통계 없이 안전하게 접근할 수 있도록 합니다. 씬 컨텍스트는 씬 서비스에 자동으로 전달되며 GameplaySceneNetworkObjectPool의 네트워크 객체에도 할당됩니다. SceneContext에 대한 접근이 필요한 경우 NetworkBehaviourSimulationBehaviour 대신 ContextBehaviour ContextSimulationBehaviour에서 상속됩니다.

프로젝트 확장하기

새로운 무기 추가하기

  1. 새 프리팹을 만들거나 기존 무기를 복제합니다.

  2. 프리팹에 적어도 하나의 WeaponAction 컴포넌트와 적절한 무기 컴포넌트가 있는지 확인합니다. WeaponAction과 무기 컴포넌트는 모두 GameObject에 있거나(Sniper 프리팹 참조) 여러 무기 동작의 경우 계층 구조로 배치해야 합니다(Rifle 프리팹 참조).

  3. Weapon 컴포넌트에 WeaponSlot을 설정하여 플레이어 무기 배열에서 차지할 위치를 지정합니다. 슬롯 1이 가장 먼저 보이는 무기입니다.

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

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

Weapons inspector

새로운 발사체 추가하기

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

  2. WeaponBarrel 컴포넌트에 있는 무기 프리팹에 발사체 프리팹를 할당합니다.

WeaponBarrel inspector
  1. 발사체가 발사될 때 발사체를 생성할 수 있도록 제어 물체의 ProjectileManager에 발사체 프리팹을 할당합니다(예: Agent 프리팹).

3인칭으로 전환

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

타사 에셋

발사체 샘플에는 각 제작자가 제공한 여러 에셋이 포함되어 있습니다. 각 사이트에서 자체 프로젝트에 대해 전체 패키지를 구입할 수 있습니다:

중요: 상업적인 프로젝트에서 에셋들을 사용하려면, 각 제작자로부터 라이선스를 구매해야 합니다.

Back to top