using System; using Hazel; using UnityEngine; namespace InnerNet { public abstract class InnerNetObject : MonoBehaviour, IComparable { // 这个数据是不是我(本玩家) public bool AmOwner { get { return this.OwnerId == AmongUsClient.Instance.ClientId; } } // 这个字段用处未知,应该是用来标记此类的派生类 // (后来知道了,在InnerNetClient.WriteSpawnMessage中用来标记某个派生类的生成) public uint SpawnId; // 每一个此类数据(及派生数据)都会在创建的时候分配一个netId // 每个这类数据都有一个场景内唯一的netId,会在广播Rpc调用的时候用来找到对应的数据结构 public uint NetId; // 此类数据公用的脏数据标记为,用来决定是否同步这个数据(即用MessageWriter写入) public uint DirtyBits; /* public enum SpawnFlags : byte { None = 0, IsClientCharacter = 1 } */ public SpawnFlags SpawnFlags; /* public enum SendOption : byte { None = 0, Reliable = 1 } */ public SendOption sendMode = SendOption.Reliable; // 数据对应的玩家ClientID,对于本玩家自己的数据会有特殊处理 public int OwnerId; protected bool DespawnOnDestroy = true; public void Despawn() { UnityEngine.Object.Destroy(base.gameObject); AmongUsClient.Instance.Despawn(this); } public virtual void OnDestroy() { if (AmongUsClient.Instance && this.NetId != 4294967295U) { if (this.DespawnOnDestroy && this.AmOwner) { AmongUsClient.Instance.Despawn(this); return; } AmongUsClient.Instance.RemoveNetObject(this); } } public abstract void HandleRpc(byte callId, MessageReader reader); public abstract bool Serialize(MessageWriter writer, bool initialState); public abstract void Deserialize(MessageReader reader, bool initialState); public int CompareTo(InnerNetObject other) { if (this.NetId > other.NetId) { return 1; } if (this.NetId < other.NetId) { return -1; } return 0; } protected void SetDirtyBit(uint val) { this.DirtyBits |= val; } } }