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,提问作者이관우
相关产品推荐
相关产品推荐

