Photon PUN RPC文本同步失效 如何修复相关代码
问题背景
- 实现需求:多人联机场景下玩家间的UI文本同步,当前仅需完成基础文本同步能力,运行过程中抛出异常,报错截图如下:

- 现有实现代码:
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using Photon.Pun; using UnityEngine.UIElements; public class Sync : MonoBehaviourPunCallbacks { private PhotonView view; public Text textGame; public Text copied; void Start() { view = GetComponent<PhotonView>(); } public void sync() { if(view.IsMine) view.RPC("ViewAll", RpcTarget.AllBuffered, textGame.text); } [PunRPC] public void ViewAll(string tG) { tG = copied.text; Debug.Log(tG); } }
问题排查
现有代码存在3个核心问题,直接导致报错和同步逻辑失效:
- 命名空间冲突:同时引入
UnityEngine.UI和UnityEngine.UIElements两个命名空间,二者均定义了Text类型,编译时会产生类型歧义报错。 - RPC逻辑写反:
ViewAll作为全网同步的RPC方法,接收的参数tG是其他客户端传来的待同步文本,但现有代码将本地copied.text赋值给形参tG,既没有把同步内容更新到UI上,也没有实现同步逻辑。 - 空引用风险:未校验组件引用是否为空,若PhotonView组件未挂载、Text字段未在Inspector赋值,运行时会直接抛出空引用异常。
修复方案
- 移除不必要的
using UnityEngine.UIElements;引用,消除Text类型的命名空间冲突。 - 修正RPC方法内的赋值逻辑,将接收到的同步文本赋值给本地UI文本组件。
- 补充基础的空值校验,避免空引用报错。
- (可选)给文本输入组件添加值变化监听,实现文本修改自动触发同步,不需要手动调用
sync()方法。
修复后的完整代码如下:
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using Photon.Pun; public class Sync : MonoBehaviourPunCallbacks { private PhotonView view; [Header("本地修改的源文本组件")] public Text textGame; [Header("全网同步显示的目标文本组件")] public Text copied; void Start() { view = GetComponent<PhotonView>(); // 空值校验提前抛错,避免运行时异常 if (view == null) { Debug.LogError("当前物体未挂载PhotonView组件!"); return; } // 可选:绑定输入框事件,文本修改自动同步 InputField textInput = textGame.GetComponent<InputField>(); if (textInput != null) { textInput.onValueChanged.AddListener(_ => sync()); } } public void sync() { // 仅本地持有权限的客户端可触发全网同步 if (view != null && view.IsMine) { view.RPC("ViewAll", RpcTarget.AllBuffered, textGame.text); } } [PunRPC] public void ViewAll(string syncText) { // 修正赋值逻辑:将同步过来的文本更新到本地UI if (copied != null) { copied.text = syncText; } Debug.Log($"已同步文本内容:{syncText}"); } }
配置注意事项
- 挂载该脚本的游戏物体必须添加
PhotonView组件,否则同步逻辑无法生效。 textGame和copied两个字段需要在Unity编辑器Inspector面板拖拽赋值对应UI组件,不可留空。- 若不需要后续进入房间的新玩家自动收到历史同步文本,可将
RpcTarget.AllBuffered替换为RpcTarget.All,减少不必要的消息缓存占用。
内容的提问来源于stack exchange,提问作者Jouki
相关产品推荐
相关产品推荐

