背景:
unity3d官方同步组件NetworkTransform没有做插值平滑,并且不适用子物体.
技术点:
一、使用SyncListStruct同步封装好的结构体列表。
二、插值平滑运动时,有同步值变化的时候,记录物体当前位置,用于两次同步间插值的源值。
源代码:
using UnityEngine;
using UnityEngine.Networking;
using System.Collections.Generic;
public class NetworkTransformMulti : NetworkBehaviour
{
public struct TransSimple
{
public Vector3 position;
public Vector3 euler;
}
public class TransSyncList : SyncListStruct<TransSimple> { }
public bool sync = true;
public TransSyncList transSyncList = new TransSyncList();//同步结构体列表
public List<Transform> proxyList;//需要同步的网络代理体列表
[Header("同步频率(帧)")]
public int syncRateFrames = 10;
[Header("插值步长")]
public float LerpStep = 1.6f;
private TransSimple currSync;
private Transform currProxy;
private TransSimple[] oldTrans;//远程数据更新时,代理体当前位置和旋转值
private TransSimple oldTransItem;
private TransSimple transTemp;
private float[] pXArr;
private float[] pYArr;
private float[] pZArr;
private float[] eXArr;
private float[] eYArr;
private float[] eZArr;
private float[] lerpTimes;
private int SyncFlag = 0;
private float t = 0f;
private void Start()
{
transSyncList.Callback = TransChanged;
transTemp = new TransSimple();
InitArr();<