在这里,我用RPC在unity photon多人游戏中制作了一个简单的手电筒脚本,脚本将游戏对象手电筒设置为active和false。当我运行游戏时,我在主机上似乎没有出现任何错误。总之,2个客户端没有同步手电筒的更改
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方法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);
}
}
然而,你的代码可以进一步优化,而不是使用view
变量,你可以只使用photonView
属性,这是继承在你的类通过MonoBehaviourPunCallbacks
调用。