如何在统一光子中使用 Rpc(脚本不起作用)
Posted
技术标签:
【中文标题】如何在统一光子中使用 Rpc(脚本不起作用)【英文标题】:How do use Rpc in unity photon (script not working) 【发布时间】:2021-10-30 23:55:30 【问题描述】:在这里,我使用 RPC 在统一光子多人游戏中制作了一个简单的手电筒脚本,该脚本将游戏对象 FlashLight 设置为活动和假。当我运行游戏时,我似乎在控制台中没有收到任何错误。无论如何,2 个客户端没有同步 FlashLight 更改
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using Photon.Pun;
public class flashlight : MonoBehaviourPunCallbacks
public GameObject FlashlightLight;
private bool flashlightActive = false;
PhotonView view;
public GameObject player;
//public bool active;
void Start()
view = this.GetComponent<PhotonView>();
[PunRPC]
public void Light(bool active)
if (view.IsMine)
if(active == true)
FlashlightLight.gameObject.SetActive(true);
if(active == false)
FlashlightLight.gameObject.SetActive(false);
void Update()
if (Input.GetKeyDown(KeyCode.F))
view.RPC("Light", RpcTarget.AllBuffered, true);
if (Input.GetKeyDown(KeyCode.G))
view.RPC("Light", RpcTarget.AllBuffered, false);
【问题讨论】:
- 我不会缓冲 RPC 调用。 -MonoBehaviourPunCallbacks
已经包含 photonView
参考。 - 也许灯光状态应该是房间或玩家属性并使用SetCustomProperties
而不是 RPC? - 可以在更少的行中清理和优化代码。
【参考方案1】:
在您的 RPC 方法 Light()
中,您正在检查 isMine
属性并仅在它是本地播放器时设置灯光状态。
您必须从Light()
中删除条件if(view.isMine)
并将其放入您正在检查玩家输入的Update()
中以使其正常工作。
像下面这样的东西就可以了
[PunRPC]
public void Light(bool active)
FlashlightLight.gameObject.SetActive(active);
private void Update()
if (!photonView.IsMine)
return;
if (Input.GetKeyDown(KeyCode.F))
photonView.RPC("Light", RpcTarget.AllBuffered, true);
if (Input.GetKeyDown(KeyCode.G))
photonView.RPC("Light", RpcTarget.AllBuffered, false);
但是您的代码可以进一步优化,例如,您可以使用通过MonoBehaviourPunCallbacks
调用在您的类中继承的photonView
属性,而不是使用view
变量。
【讨论】:
以上是关于如何在统一光子中使用 Rpc(脚本不起作用)的主要内容,如果未能解决你的问题,请参考以下文章