江苏省建设部官方网站,境外网站icp备案申请表,网络科技官网网站建设,网站开发一般会用到什么语言Netcode升级到1.2.0网络变量的变化1 概述2 继承网络变量 NetworkVariable#xff0c;派生类构造出错的问题2.1 代码描述2.2 问题记录2.3 解决办法#xff1a;使用 NetworkVariable 即可3 网络变量 NetworkVariable 类的版本差异比较3.1 差异说明3.2 [1.0.2]版本的网络变量3.3…
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 typenumber
/// item 加入构造函数可以new新元素加入链表/item
/// item网络变量可以用作静态字段但是RPC不可以/item
/// /list/// /remarks
[Serializable]
public class NetVarT : NetworkVariableT 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 : NetVarint
{public NetVar_Int(int value 0,NetworkVariableReadPermission readPerm DefaultReadPerm,NetworkVariableWritePermission writePerm DefaultWritePerm) : base(value, readPerm, writePerm){Value value;}
}2.2 问题记录
1 自己定义的类继承网络变量【NetworkVariable】 1.1使用自定义的类构造时会直接报错新版本的网络变量内部有改动
NetVarint nv_hp new NetVarint(); **[1.0版本以前可用]**2.3 解决办法使用 NetworkVariable 即可
NetworkVariableint nv_hp new NetworkVariableint(); [1.1、1.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 NetworkVariableT : 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;NetworkVariableSerializationT.Read(reader, out m_InternalValue);if (keepDirtyDelta){SetDirty(isDirty: true);}OnValueChanged?.Invoke(internalValue, m_InternalValue);}public override void ReadField(FastBufferReader reader){NetworkVariableSerializationT.Read(reader, out m_InternalValue);}public override void WriteField(FastBufferWriter writer){NetworkVariableSerializationT.Write(writer, ref m_InternalValue);}}
}3.3 [1.2.0]版本的网络变量
using System;
using UnityEngine;namespace Unity.Netcode
{[Serializable]public class NetworkVariableT : 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 (!NetworkVariableSerializationT.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;NetworkVariableSerializationT.Read(reader, ref m_InternalValue);if (keepDirtyDelta){SetDirty(isDirty: true);}OnValueChanged?.Invoke(internalValue, m_InternalValue);}public override void ReadField(FastBufferReader reader){NetworkVariableSerializationT.Read(reader, ref m_InternalValue);}public override void WriteField(FastBufferWriter writer){NetworkVariableSerializationT.Write(writer, ref m_InternalValue);}}
}