네트워크 데이터 버퍼
NetworkDataBuffer
는 발사체 고급 샘플의 핵심 요소입니다. 이 컴포넌트는 발사체 데이터 버퍼를 관리하며, 발사체의 시각적 표현을 생성, 업데이트 및 삭제하는 역할을 담당합니다. 이 샘플에는 처리할 수 있는 발사체 유형에 따라 두 가지 버전의 버퍼(하위 클래스)인 HitscanProjectileBuffer
와 KinematicProjectileBuffer
가 포함되어 있습니다. 발사체 버퍼 컴포넌트는 제어 객체(예: Agent
, Turret
)에 위치하며, 해당 객체가 소유한 모든 무기의 발사체를 업데이트하는 역할을 합니다.
💡참고: 히트 스캔 발사체와 운동학적 발사체의 차이는 발사체 유형 섹션에서 설명합니다.

발사체 버퍼는 특정 발사체 데이터를 정확하게 프리팹과 연결하기 위해 발사체 프리팹 배열이 필요합니다. 간편한 사용을 위해 발사체 버퍼는 인스펙터에서 프리팹에 직접 참조를 설정합니다.
💡참고: 프리팹 배열에 접근하는 더 나은 방법은 게임에 따라 다를 수 있지만, 예를 들어 설정 데이터를 포함하는 스크립터블 오브젝트를 사용할 수 있습니다.
발사체 버퍼는 발사체의 궤적 및 관련 동작을 계산하는 데 사용되는 네트워크 데이터가 저장됩니다. 각 데이터 인스턴스는 해당 소유자(플레이어 또는 터렛)가 발사한 단일 발사체를 나타냅니다.
C#
public struct HitscanData : INetworkStruct
{
public byte PrefabIndex;
public byte BarrelIndex;
public Vector3Compressed FirePosition;
public Vector3Compressed FireDirection;
public Vector3Compressed ImpactPosition;
public Vector3Compressed ImpactNormal;
}
C#
[StructLayout(LayoutKind.Explicit)]
public struct KinematicData : INetworkStruct
{
public bool IsFinished { get { return _state.IsBitSet(0); } set { _state.SetBit(0, value); } }
public bool HasStopped { get { return _state.IsBitSet(1); } set { _state.SetBit(1, value); } }
[FieldOffset(0)]
private byte _state;
[FieldOffset(1)]
public byte PrefabIndex;
[FieldOffset(2)]
public byte BarrelIndex;
[FieldOffset(3)]
public int FireTick;
[FieldOffset(7)]
public Vector3Compressed Position;
[FieldOffset(19)]
public Vector3Compressed Velocity;
[FieldOffset(31)]
public Vector3Compressed ImpactPosition;
[FieldOffset(43)]
public Vector3Compressed ImpactNormal;
// Custom projectile data
[FieldOffset(55)]
public AdvancedData Advanced;
[FieldOffset(55)]
public SprayData Spray;
[FieldOffset(55)]
public HomingData Homing;
public struct AdvancedData : INetworkStruct
{
public int MoveStartTick;
public byte BounceCount;
}
public struct SprayData : INetworkStruct
{
public Vector3 InheritedVelocity;
}
public struct HomingData : INetworkStruct
{
public NetworkId Target;
public Vector3Compressed TargetPosition; // Used for position prediction
}
}
히트 스캔 발사체는 네트워크 데이터 요구량이 적어 더 효율적입니다. 이 샘플에서 운동학적 발사체에 사용되는 KinematicData
구조체는 다양한 발사체 기능을 포함하기 때문에 상대적으로 큽니다. 여러 발사체 동작이 혼합되어 사용되고 동일한 데이터값을 공유하지 않기 때문에, KinematicData
구조체는 특정 발사체 데이터를 공용체로 처리합니다(AdvancedData
, SprayData
, HomingData
가 중복되는 방식에 주목하세요).
실제 프로젝트에서는 발사체 데이터 구조를 가능한 최소한으로 유지하는 것이 좋습니다.
Back to top