Unity Mirror自定义列表在Command与ClientRpc交互时的同步问题
解决Mirror中ClientRpc传递自定义类列表时属性为空的问题
问题根源
Mirror的Command/ClientRpc网络调用依赖自身序列化系统,默认仅支持Unity可序列化且Mirror内置兼容的类型。你的Judokaklassenhalter.Judoka类未配置正确的序列化规则,导致传输时仅创建了对象实例(因此列表长度正确),但所有属性未被序列化传递,最终客户端接收到的对象属性全为null。
解决方案
方案1:基础序列化配置(适合简单类)
给Judoka类添加Unity序列化特性,并确保需要传输的属性/字段可被序列化:
using System; namespace Judokaklassenhalter { [Serializable] // 必须添加,让Unity/Mirror识别为可序列化类 public class Judoka { // 使用public字段,或给私有字段加[SerializeField]标记 public string Vorname; public string Nachname; public int Gewichtsklasse; // Getter方法依赖可序列化的底层字段 public string GetVorname() => Vorname; } }
- 确保所有需要传输的属性都是值类型或可序列化的引用类型,避免使用委托、非序列化自定义类等无法被Unity序列化的类型。
方案2:自定义Mirror序列化逻辑(适合复杂类)
如果Judoka包含复杂类型或需要精细控制序列化过程,可手动实现序列化/反序列化逻辑并注册到Mirror:
- 为
Judoka类编写序列化方法:
using Mirror; namespace Judokaklassenhalter { public class Judoka { public string Vorname; public int Alter; public bool IstAktiv; // 自定义序列化逻辑 public void Serialize(NetworkWriter writer) { writer.WriteString(Vorname); writer.WriteInt(Alter); writer.WriteBool(IstAktiv); } // 自定义反序列化逻辑 public static Judoka Deserialize(NetworkReader reader) { var judoka = new Judoka(); judoka.Vorname = reader.ReadString(); judoka.Alter = reader.ReadInt(); judoka.IstAktiv = reader.ReadBool(); return judoka; } } }
- 在项目启动时注册该类型的序列化处理器:
using Mirror; using UnityEngine; public class NetworkInitializer : MonoBehaviour { void Awake() { // 注册Judoka类型的序列化规则 NetworkWriter.RegisterSerializer<Judokaklassenhalter.Judoka>((writer, judoka) => { judoka.Serialize(writer); }); NetworkReader.RegisterDeserializer<Judokaklassenhalter.Judoka>(reader => { return Judokaklassenhalter.Judoka.Deserialize(reader); }); } }
额外优化建议
- 若数据量极大,避免一次性传递整个列表,改用
SyncList<Judoka>(Mirror提供的同步列表组件)进行增量同步,或拆分列表分批传输,减少单次网络负载。 - 验证序列化正确性:在主机端手动序列化后反序列化,确认数据完整再进行网络传输。
- 你的代码中
liste_synchronisieren_t2_command会回传合并后的列表,需确保该列表的元素同样遵循上述序列化规则。
内容的提问来源于stack exchange,提问作者not_actually_finn
相关产品推荐
相关产品推荐

