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

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个核心问题,直接导致报错和同步逻辑失效:

  1. 命名空间冲突:同时引入UnityEngine.UI和UnityEngine.UIElements两个命名空间,二者均定义了Text类型,编译时会产生类型歧义报错。
  2. RPC逻辑写反:ViewAll作为全网同步的RPC方法,接收的参数tG是其他客户端传来的待同步文本,但现有代码将本地copied.text赋值给形参tG,既没有把同步内容更新到UI上,也没有实现同步逻辑。
  3. 空引用风险:未校验组件引用是否为空,若PhotonView组件未挂载、Text字段未在Inspector赋值,运行时会直接抛出空引用异常。
修复方案
  1. 移除不必要的using UnityEngine.UIElements;引用,消除Text类型的命名空间冲突。
  2. 修正RPC方法内的赋值逻辑,将接收到的同步文本赋值给本地UI文本组件。
  3. 补充基础的空值校验,避免空引用报错。
  4. (可选)给文本输入组件添加值变化监听,实现文本修改自动触发同步,不需要手动调用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 14:36:22