如何在统一光子中使用 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(脚本不起作用)的主要内容,如果未能解决你的问题,请参考以下文章

为啥事件触发器在统一 2d 中不起作用?

OnTriggerEnter2d 统一不起作用

C# Unity 2D 自上而下的运动脚本不起作用

如何使用 C# 创建一个对象以统一在两个位置之间移动,为啥我的代码不起作用?

RPC 调用不起作用。指导 + 调度

GWT Java rpc 调用工作;但是,替换 GWTBootstrap - rpc 调用不起作用