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

Unity Photon中InvalidCastException异常修复求助:玩家同步代码报错

修复Unity Photon多人游戏中的InvalidCastException异常

异常原因分析

这个InvalidCastException发生在OnPhotonSerializeView方法的接收逻辑中,说明从Photon流中读取的数据无法转换为Vector3类型。常见诱因包括:

  • PhotonView同时观察了多个实现IPunObservable的组件,导致序列化数据顺序混乱,读取到非预期类型的数据。
  • 旧的序列化缓存数据残留,客户端接收到了之前版本代码发送的不匹配类型数据。
  • 发送与接收的类型未严格对应(比如发送Vector2却尝试转换为Vector3,反之亦然)。

修复步骤

1. 检查PhotonView配置

打开Player对象上的PhotonView组件,确认Observed Components列表中仅添加了当前的Player脚本,没有其他额外的组件(比如其他自定义脚本)实现IPunObservable。多个观察组件会导致序列化数据流中混杂不同类型的数据,引发类型转换失败。

2. 修正OnPhotonSerializeView的类型安全逻辑

替换原有的强制转换为类型检查的写法,同时考虑2D游戏中使用Rigidbody2D的位置同步更准确:

public void OnPhotonSerializeView(PhotonStream stream, PhotonMessageInfo info)
{
    if (stream.IsWriting)
    {
        // 同步Rigidbody2D的位置,适配2D物理场景
        stream.SendNext(rb.position);
    }
    else
    {
        var receivedData = stream.ReceiveNext();
        // 兼容Vector2和Vector3两种可能的类型
        if (receivedData is Vector2 pos2D)
        {
            curPos = pos2D;
        }
        else if (receivedData is Vector3 pos3D)
        {
            curPos = pos3D;
        }
        else
        {
            Debug.LogError($"收到非预期的数据类型: {receivedData?.GetType().FullName ?? "null"},无法转换为Vector3/Vector2");
        }
    }
}

3. 清除缓存并重启Unity

停止运行中的游戏,关闭Unity编辑器后重新打开,清除Photon的旧序列化缓存数据,避免残留的旧数据包引发类型不匹配问题。

4. 修正Update中的插值逻辑

确保仅对非本地玩家执行位置插值,避免本地玩家逻辑混乱:

private void Update()
{
    if (manager.FinishedCountDown && PV.IsMine)
    {
        Move();
    }
    else if (!PV.IsMine)
    {
        // 仅非本地玩家进行位置同步插值
        if ((transform.position - curPos).sqrMagnitude >= 10)
        {
            transform.position = curPos;
        }
        else
        {
            transform.position = Vector3.Lerp(transform.position, curPos, Time.deltaTime * 10);
        }
    }
    Spin();
}

内容的提问来源于stack exchange,提问作者이관우

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 01:02:13