You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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:

  1. 为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;
        }
    }
}
  1. 在项目启动时注册该类型的序列化处理器:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 10:33:27