当前位置: 首页 > news >正文

Netcode升级到1.2.0网络变量的变化的变化

Netcode升级到1.2.0网络变量的变化

    • 1 概述
    • 2 继承网络变量 NetworkVariable,派生类构造出错的问题
      • 2.1 代码描述
      • 2.2 问题记录
      • 2.3 解决办法:使用 NetworkVariable 即可
    • 3 网络变量 NetworkVariable 类的版本差异比较
      • 3.1 差异说明
      • 3.2 [1.0.2]版本的网络变量
      • 3.3 [1.2.0]版本的网络变量

1 概述

最近工程升级到Netcode For Gameobject 1.2.0版本
运行会出现部分报错,查看原因后发现是网络变量模块构造方法出现的问题

2 继承网络变量 NetworkVariable,派生类构造出错的问题

2.1 代码描述

1.1.0+版本 标记以下类为过时】
【1.0.2-版本 以下类可用】
/// <summary>
/// 网络变量 - 基类【重写】
/// </summary>
/// 
/// <remarks>
/// <list type="number">
/// <item> 加入构造函数,可以new新元素加入链表</item>
/// <item>网络变量可以用作静态字段,但是RPC不可以</item>
/// </list>/// </remarks>
[Serializable]
public class NetVar<T> : NetworkVariable<T> where T : unmanaged
{public NetVar(T value = default,NetworkVariableReadPermission readPerm = DefaultReadPerm,NetworkVariableWritePermission writePerm = DefaultWritePerm) : 
base(value, readPerm, writePerm){Value = value;}
}[Obsolete("1.0.2-版本可用,1.1+版本使用-NetworkVariable")]
[Serializable] public class NetVar_Int : NetVar<int>
{public NetVar_Int(int value = 0,NetworkVariableReadPermission readPerm = DefaultReadPerm,NetworkVariableWritePermission writePerm = DefaultWritePerm) : base(value, readPerm, writePerm){Value = value;}
}

2.2 问题记录

1 自己定义的类继承网络变量【NetworkVariable】
1.1使用自定义的类,构造时会直接报错,新版本的网络变量内部有改动

NetVar<int> nv_hp = new NetVar<int>();  **[1.0版本以前可用]**

2.3 解决办法:使用 NetworkVariable 即可

NetworkVariable<int> nv_hp = new NetworkVariable<int>(); [1.11.2版本可用]

3 网络变量 NetworkVariable 类的版本差异比较

3.1 差异说明

显著的变化在T Value赋值的过程,和对T的限定,变得更加安全
比较值得方法不一样,但是均在值比较之后发生变化才赋值,无变化不触发。

3.2 [1.0.2]版本的网络变量

using System;
using System.Runtime.CompilerServices;
using Unity.Collections.LowLevel.Unsafe;
using UnityEngine;namespace Unity.Netcode
{[Serializable]public class NetworkVariable<T> : NetworkVariableBase where T : unmanaged{public delegate void OnValueChangedDelegate(T previousValue, T newValue);public OnValueChangedDelegate OnValueChanged;[SerializeField]private protected T m_InternalValue;public virtual T Value{get{return m_InternalValue;}set{if (!ValueEquals(ref m_InternalValue, ref value)){if ((bool)m_NetworkBehaviour && !CanClientWrite(m_NetworkBehaviour.NetworkManager.LocalClientId)){throw new InvalidOperationException("Client is not allowed to write to this NetworkVariable");}Set(value);}}}public NetworkVariable(T value = default(T), NetworkVariableReadPermission readPerm = NetworkVariableReadPermission.Everyone, NetworkVariableWritePermission writePerm = NetworkVariableWritePermission.Server): base(readPerm, writePerm){m_InternalValue = value;}[MethodImpl(MethodImplOptions.AggressiveInlining)]private unsafe static bool ValueEquals(ref T a, ref T b){void* ptr = UnsafeUtility.AddressOf(ref a);void* ptr2 = UnsafeUtility.AddressOf(ref b);return UnsafeUtility.MemCmp(ptr, ptr2, sizeof(T)) == 0;}private protected void Set(T value){SetDirty(isDirty: true);T internalValue = m_InternalValue;m_InternalValue = value;OnValueChanged?.Invoke(internalValue, m_InternalValue);}public override void WriteDelta(FastBufferWriter writer){WriteField(writer);}public override void ReadDelta(FastBufferReader reader, bool keepDirtyDelta){T internalValue = m_InternalValue;NetworkVariableSerialization<T>.Read(reader, out m_InternalValue);if (keepDirtyDelta){SetDirty(isDirty: true);}OnValueChanged?.Invoke(internalValue, m_InternalValue);}public override void ReadField(FastBufferReader reader){NetworkVariableSerialization<T>.Read(reader, out m_InternalValue);}public override void WriteField(FastBufferWriter writer){NetworkVariableSerialization<T>.Write(writer, ref m_InternalValue);}}
}

3.3 [1.2.0]版本的网络变量

using System;
using UnityEngine;namespace Unity.Netcode
{[Serializable]public class NetworkVariable<T> : NetworkVariableBase{public delegate void OnValueChangedDelegate(T previousValue, T newValue);public OnValueChangedDelegate OnValueChanged;[SerializeField]private protected T m_InternalValue;public virtual T Value{get{return m_InternalValue;}set{if (!NetworkVariableSerialization<T>.AreEqual(ref m_InternalValue, ref value)){if ((bool)m_NetworkBehaviour && !CanClientWrite(m_NetworkBehaviour.NetworkManager.LocalClientId)){throw new InvalidOperationException("Client is not allowed to write to this NetworkVariable");}Set(value);}}}public NetworkVariable(T value = default(T), NetworkVariableReadPermission readPerm = NetworkVariableReadPermission.Everyone, NetworkVariableWritePermission writePerm = NetworkVariableWritePermission.Server): base(readPerm, writePerm){m_InternalValue = value;}private protected void Set(T value){SetDirty(isDirty: true);T internalValue = m_InternalValue;m_InternalValue = value;OnValueChanged?.Invoke(internalValue, m_InternalValue);}public override void WriteDelta(FastBufferWriter writer){WriteField(writer);}public override void ReadDelta(FastBufferReader reader, bool keepDirtyDelta){T internalValue = m_InternalValue;NetworkVariableSerialization<T>.Read(reader, ref m_InternalValue);if (keepDirtyDelta){SetDirty(isDirty: true);}OnValueChanged?.Invoke(internalValue, m_InternalValue);}public override void ReadField(FastBufferReader reader){NetworkVariableSerialization<T>.Read(reader, ref m_InternalValue);}public override void WriteField(FastBufferWriter writer){NetworkVariableSerialization<T>.Write(writer, ref m_InternalValue);}}
}
http://www.lryc.cn/news/34485.html

相关文章:

  • 冥想第七百二十二天
  • AB测试——流程介绍(定义问题和指标选取)
  • Linux(Centos)安装Minio集群
  • LeetCode 1662. 检查两个字符串数组是否相等 / 795. 区间子数组个数 / 剑指 Offer 47. 礼物的最大价值
  • 【C++】缺省参数函数重载
  • Hbuilder 下载与安装教程
  • Mybatis工程升级到FlunetMybatis后引发的问题以及解决方法
  • Oracle VM VirtualBox6.1.36导入ova虚拟机文件报错,代码: E_INVALIDARG (0x80070057)
  • Superset数据探索和可视化平台入门以及案例实操
  • VisualSP Enterprise - February crack
  • 004+limou+HTML——(4)HTML表格
  • uniapp实现自定义相机
  • 插值多项式的龙格现象的介绍与模拟
  • Spring整体架构包含哪些组件?
  • 开发接口需要考虑哪些问题?
  • 关于Activiti7审批工作流绘画流程图(2)
  • String.format()对日期进行格式化
  • 核酸检测信息管理系统
  • 典型回溯题目 - 全排列(一、二)
  • 数据清洗和特征选择
  • java StringBuilder 和 StringBuffer 万字详解(深度讲解)
  • 【Linux】帮助文档查看方法
  • UEFI 实战(2) HelloWorld 之一 helloworld及.inf文件
  • 向2022年度商界木兰上榜女性致敬!
  • ChatGPT助力校招----面试问题分享(二)
  • JAVA架构与开发(JAVA架构是需要考虑的几个问题)
  • vue 中 v-for 的使用
  • 项目--基于RTSP协议的简易服务器开发(2)
  • ubus编译_环境搭建
  • 移动通信(16)信号检测