如何在unity photon中使用Rpc(脚本不起作用)

问题描述 投票:0回答:1

这里我用 Photon 多人游戏在 Unity 中制作了一个简单的手电筒脚本。使用 RPC,我希望脚本在 FlashLight 游戏对象上切换

setActive
。当我运行游戏时,控制台中似乎没有出现任何错误。无论如何,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);
        }
    }
}
c# unity-game-engine photon photon-pun
1个回答
0
投票

在您的 RPC 方法中

Light()
您正在检查
isMine
属性并仅在本地播放器时设置灯光状态。

您必须从

if(view.isMine)
中删除条件
Light()
并将其放入
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
变量。

© www.soinside.com 2019 - 2024. All rights reserved.