Interpolators
개요
보간기를 사용하면 Render()
, LateUpdate()
및 Update()
에 사용할 수 있도록 네트워크 속성에 대한 스냅샷 및 보간 데이터에 접근할 수 있습니다. 네트워크 속성에 대해 반환된 상태 및 보간 데이터는 NetworkBehaviour.InterpolationDataSource
의 시간을 고려합니다.
사용할 수 있는 보간기는 2개가 있습니다.
- Interpolator<T>: 네트워크 속성 시작 및 종료 스냅샷 값 및 자동 보간 처리용 보간 데이터 접근기.
- RawInterpolator: 네트워크 속성의 스냅샷 값의 시작 및 종료 그리고 보간 데이터에 대한 접근기입니다. 올바른 백킹 타입으로 캐스팅해야 합니다.
노트: RawInterpolator
보간기는 unsafe 코드가 필요합니다.
Interpolator<T>
스냅샷 값의 네트워크 속성의 시작 및 종료에 대한 접근자를 생성하고 자동화된 보간 처리용 보간 데이터를 표시합니다.
GetInterpolator<T>(string propertyName)
호출한 NetworkBehaviour
인스턴스의 특정 속성에 대하여 캐시 가능한 Interpolator<T>
를 리턴합니다.
Value
NetworkBehaviour.InterpolationDataSource
에서 지정한 시간을 사용하여 연결된 네트워크 속성에 대한 보간 값을 반환하는 Value
속성을 노출합니다.
GetValues() 그리고 TryGetValues()
스냅샷 값과 보간 데이터는 사용자 지정 보간 처리에 사용할 수 있도록 시작
값, 종료
값 및 float 알파 값(Lerp의 경우 t 값)을 반환하는 GetValues() 또는 TryGetValues() 메소드를 사용하여 얻을 수도 있습니다. 기본적으로 사용되는 기간은 NetworkBehaviour.InterpolationDataSource
에 의해 결정되지만 아규먼트 force = true
로 로컬/예측 시간대를 사용하도록 재정의할 수 있습니다.
처리되는 타입
허용된 타입:
- float
- Vector3
- Vector2
- int (반올림 발생)
- bool (주의: 부울 값은 보간될 수 없으므로 시작 값을 리턴합니다)
- NetworkBool (주의: 부울 값은 보간될 수 없으므로 시작 값을 리턴합니다)
사용 방법 예제
C#
public class InterpolatorExample : NetworkBehaviour
{
public float DegreesPerSecond = 360f;
[Networked]
public float Rotation { get; set; }
public Interpolator<float> NetFloatInterpolator;
public override void Spawned() {
NetFloatInterpolator = GetInterpolator<float>(nameof(Rotation));
}
public override void FixedUpdateNetwork() {
// Rotate the object at a fixed rate for each tick.
Rotation += DegreesPerSecond * Runner.DeltaTime;
}
public override void Render() {
// Get the interpolated value.
// Note that Value uses the timeframe specified by the InterpolationDataSource value.
transform.rotation = Quaternion.Euler(0, 0, NetFloatInterpolator.Value);
}
}
RawInterpolator
Interpolator<T>
에서 지원되지 않는 유형인 RawInterpolator
는 RawInterpolator.GetValues()
메소드를 사용하여 현재 렌더 기간에 대한 보간 정보뿐만 아니라 네트워크 된 속성 스냅샷 상태에 대한 안전하지 않은 접근을 허용합니다.
GetValues() 및 TryGetValues()
스냅샷 값과 보간 데이터는 사용자 지정 보간 처리에 사용할 수 있도록 시작
값, 종료
값 및 float 알파 값(Lerp의 경우 t 값)을 반환하는 GetValues() 또는 TryGetValues() 메소드를 사용하여 얻을 수도 있습니다. 기본적으로 사용되는 타임 프레임은 NetworkBehaviour.InterpolationDataSource
에 의해 결정되지만 아규먼트 force = true
로 특정 로컬/예측된 타임 프레임을 사용하도록 재정의할 수 있습니다.
시작
및 종료
값은 안전하지 않은 모드와 포인터가 사용되므로 반드시 올바른 속성 타입으로 캐스팅되어야 합니다.
GetInterpolator(string propertyName)
호출한 NetworkBehaviour
인스턴스의 특정 속성에 대한 캐시 가능한 RawInterpolator
를 리턴합니다.
C#
public struct CustomStruct : INetworkStruct
{
public Vector3 Position;
public Quaternion Rotation;
}
public unsafe class RawInterpolatorExample : NetworkBehaviour
{
[Networked]
public CustomStruct Data { get; set; }
RawInterpolator _dataInterpolator;
public override void Spawned()
{
_dataInterpolator = GetInterpolator(nameof(Data));
}
public override void Render()
{
if (_dataInterpolator.TryGetValues(out var f, out var t, out var alpha))
{
var from = (CustomStruct*) f;
var to = (CustomStruct*) t;
transform.position = Vector3.Lerp(from->Position, to->Position, alpha);
}
}
}
Network 콜렉션
RawInterpolator에는 Fusion의 컬렉션 유형에서 시작
스냅샷, 종료
스냅샷 및 보간 알파 데이터를 가져오는 메소드가 있습니다.
- TryGetArray<T>(),
- TryGetDictionary<T>()
- TryGetLinkedList<T>()
C#
using UnityEngine;
using Fusion;
public class CollectionRawInterpolator : NetworkBehaviour
{
[Networked, Capacity(8)]
public NetworkArray<float> NetArray { get; } = MakeInitializer(new float[8] { 0, 1, 2, 3, 4, 5, 6, 7 });
RawInterpolator _interpolator;
public override void Spawned()
{
// Get the RawInterpolator for our property
_interpolator = GetInterpolator(nameof(NetArray));
}
public override void FixedUpdateNetwork()
{
// Increment each value by one every tick.
for (int i = 0; i < NetArray.Length; i++)
{
NetArray.Set(i, NetArray[i] + 1);
}
}
public override void Render()
{
// Get the From, To and alpha data, and manually interpolate the values
if (_interpolator.TryGetArray(NetArray, out var from, out var to, out float alpha))
{
var str = $"alpha: {alpha} values: \n";
for (int i = 0; i < NetArray.Length; i++) {
var lerped = Mathf.Lerp(from[i], to[i], alpha);
str += $"{from[i]} -> {to[i]} = {lerped}\n";
}
Debug.Log(str);
}
}
}
Back to top