Unity 3d PhotonEngine 其他玩家如何获取masterclient生成的数据

问题描述

你好,我需要关于使用 photon 的 2 人在线游戏的帮助。每个玩家都会收到一个生成的票号,玩家 1 将访问玩家 2 的票号,玩家 2 还将访问玩家 1 的票号。

这是主客户端生成票证的脚本。当玩家 2 加入房间时,他将从玩家 1(主客户端)生成的票中获取他的票。我创建了一个带有照片视图的游戏对象和这里的脚本

void Start()
{
    if (PhotonNetwork.IsMasterClient)
    {
        player1ticket = UnityEngine.Random.Range(1000,5000);
        player2ticket = UnityEngine.Random.Range(1000,5000);
    }
    getTicket = true;
}

// Update is called once per frame
void Update()
{
    if (getTicket)
    {
        if (PhotonNetwork.IsMasterClient)
        {
            myTicket = player1ticket;
        }
        else
        {
            myTicket = player2ticket;
        }
        getTicket = false;
    }
}

但是在玩游戏时,玩家 2 没有任何票号

解决方法

首先,您知道可能会发生两个获得相同票号的情况 - 可能性不大但可能。在这种情况下,您可能想要重复第二个随机数

player1ticket = UnityEngine.Random.Range(1000,5000);
do
{
    player2ticket = UnityEngine.Random.Range(1000,5000); 
} 
while(player2ticket == player1ticket);   

那么你只在主站生成值。因此,在客户端上,getTicket 永远不会是 true

即使客户端也没有 player2ticket 值。

也没有必要/感觉在更新中的每一帧都分配它们。


我宁愿使用自定义房间属性,并在主服务器上使用 Room.SetCustomProperties,这将在所有客户端上触发 OnRoomPropertiesUpdate(Hashtable。此调用也会在客户端加入房间后触发一次,因此您可以确保新连接的客户端不会错过它。

void Start()
{
    if (PhotonNetwork.IsMasterClient)
    {
        player1ticket = UnityEngine.Random.Range(1000,5000);
        player2ticket = UnityEngine.Random.Range(1000,5000);

        // You are master so already get your ticket
        myTicket = player1ticket;

        // Then simply push the other ticket(s) into the room properties
        Hashtable properties = PhotonNetwork.room.customProperties; 
        properties["ticket2"] =  player2ticket);  

        // This will store the value in the current room
        // and triggers OnRoomPropertiesUpdate on all already connected clients
        PhotonNetwork.room.SetCustomProperties(properties);
    }
}

// This will be called
// - as soon as you entered a room
// - whenever someone writes into the room properties
public override void OnRoomPropertiesUpdate(Hashtable propertiesThatChanged)
{
    // Not sure about the exact API right now,it's not in their docs
    // it's either ContainsKey,HasKey or something similar ..maybe even TryGetValue works
    if(!propertiesThatChanged.ContainsKey("ticket2")) return;

    if(!PhotonNetwork.IsMasterClient)
    {
        myTicket = (int) PhotonNetwork.room.customProperties["ticket2"];
    }
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...