Unity Photon使用RPC控制手电筒开关无法多端同步问题求助
问题原因
- 核心问题:
LightRPC方法内部添加了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
相关产品推荐
相关产品推荐

