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

Unity Photon使用RPC控制手电筒开关无法多端同步问题求助

问题原因
  • 核心问题:Light RPC方法内部添加了if (view.IsMine)判断。RPC广播给所有客户端后,只有持有该PhotonView所有权的发起玩家会执行手电筒状态修改逻辑,其他客户端的执行流程会被该判断直接拦截,因此状态无法跨客户端同步。
  • 次要逻辑问题:输入检测没有加view.IsMine限制,会导致所有客户端同时响应按键事件,重复发起RPC调用。
修正后的代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Photon.Pun;

public class Flashlight : MonoBehaviourPunCallbacks
{
    public GameObject FlashlightLight;
    private bool flashlightActive = false;
    PhotonView view;
    public GameObject player;

    void Start()
    {
        view = this.GetComponent<PhotonView>();
        // 初始化默认关闭手电筒
        FlashlightLight.SetActive(false);
    }

    [PunRPC]
    public void Light(bool active)
    {
        // 移除所有权判断,所有客户端统一执行状态修改
        FlashlightLight.SetActive(active);
        flashlightActive = active;
    }

    void Update()
    {
        // 仅本地持有该物体的玩家可以触发输入,避免全局响应按键
        if (view.IsMine)
        {
            // 优化为单键切换开关,更符合常规操作逻辑
            if (Input.GetKeyDown(KeyCode.F))
            {
                bool targetState = !flashlightActive;
                // 使用nameof避免硬编码字符串拼写错误
                view.RPC(nameof(Light), RpcTarget.AllBuffered, targetState);
            }
        }
    }
}
额外注意事项
  • 若不需要后续加入房间的玩家同步看到当前手电筒状态,可将RpcTarget.AllBuffered替换为RpcTarget.All,减少房间缓存的冗余RPC数量。
  • 确保PhotonView组件挂载在当前脚本所在的物体上,且物体属于Photon网络生成的玩家预制体。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 07:45:03