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

为何无法重写Photon虚函数?问题排查与修复求助

问题分析与修复方案

用户代码示例

自定义继承类代码

public class SomeClass : MonoBehaviourPunCallbacks
{
    public override void OnPlayerEnteredRoom(Player newPlayer)
    {
        newPlayer.NickName = "hello";
        return;
    }
}

Photon父类代码

public class MonoBehaviourPunCallbacks : MonoBehaviourPun, IConnectionCallbacks , IMatchmakingCallbacks , IInRoomCallbacks, ILobbyCallbacks, IWebRpcCallback, IErrorInfoCallback
{
    public virtual void OnPlayerEnteredRoom(Player newPlayer)
    {
    }
}

问题根源

  1. Player类型冲突:Unity自带UnityEngine.Player类,而Photon的玩家类是Photon.Realtime.Player,若未明确指定命名空间,编译器会优先匹配Unity的Player,导致方法签名与父类的Photon版本不匹配,重写失效,Photon无法触发该回调。
  2. 命名空间缺失:自定义类未引入Photon.Realtime命名空间,无法识别Photon的Player类型和回调方法规范。
  3. 回调逻辑误解:OnPlayerEnteredRoom是Photon的被动回调,仅当其他玩家成功加入当前房间时才会被Photon自动调用,不能主动调用,若尝试手动调用会出现“无法访问”的错觉。

修复步骤

  • 添加正确命名空间:在SomeClass文件顶部引入Photon命名空间,确保Player类型指向Photon的玩家类:
    using Photon.Realtime;
    
  • 明确方法参数类型:若仍存在签名匹配问题,直接指定参数的完整命名空间,消除类型歧义:
    public override void OnPlayerEnteredRoom(Photon.Realtime.Player newPlayer)
    {
        newPlayer.NickName = "hello";
    }
    
  • 验证Photon初始化状态:确认场景中已正确配置Photon NetworkManager,且客户端已成功连接Photon服务器并加入房间,否则回调不会被触发。
  • 避免主动调用回调:该方法为Photon内部触发的回调逻辑,无需手动调用,若需复用昵称修改逻辑,可封装为独立方法在回调内调用。

内容的提问来源于stack exchange,提问作者BubkisLord

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 11:09:16