수정중인 페이지 입니다.

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 (주의: 부울 값은 보간될 수 없으므로 시작 값을 리턴합니다)

메인 화면으로

사용 방법 예제

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>에서 지원되지 않는 유형인 RawInterpolatorRawInterpolator.GetValues() 메소드를 사용하여 현재 렌더 기간에 대한 보간 정보뿐만 아니라 네트워크 된 속성 스냅샷 상태에 대한 안전하지 않은 접근을 허용합니다.

GetValues() 및 TryGetValues()

스냅샷 값과 보간 데이터는 사용자 지정 보간 처리에 사용할 수 있도록 시작 값, 종료 값 및 float 알파 값(Lerp의 경우 t 값)을 반환하는 GetValues() 또는 TryGetValues() 메소드를 사용하여 얻을 수도 있습니다. 기본적으로 사용되는 타임 프레임은 NetworkBehaviour.InterpolationDataSource에 의해 결정되지만 아규먼트 force = true로 특정 로컬/예측된 타임 프레임을 사용하도록 재정의할 수 있습니다.

시작종료 값은 안전하지 않은 모드와 포인터가 사용되므로 반드시 올바른 속성 타입으로 캐스팅되어야 합니다.

메인 화면으로

GetInterpolator(string PropertyName)

호출한 NetworkBehaviour 인스턴스의 특정 속성에 대한 캐시 가능한 RawInterpolator를 리턴합니다.

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>()

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);
    } 
  }
}


기술문서 TOP으로 돌아가기