unity3d network 批量同步(插值平滑)子物体位置和旋转

该博客介绍了如何在Unity3D中处理NetworkTransform组件未提供的子物体插值平滑同步问题。通过使用SyncListStruct同步结构体列表和自定义的TransSimple类,结合FixedUpdate方法和CmdChangTran命令,实现子物体位置和旋转的批量同步与插值平滑。同时,详细讲解了同步频率设置和插值过程。
摘要由CSDN通过智能技术生成

背景:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值