Unity3d 基于光子统一回合的多人游戏

Unity3d 基于光子统一回合的多人游戏,unity3d,multiplayer,photon,Unity3d,Multiplayer,Photon,我试图创建一个简单的2D回合为基础的多人游戏使用光子统一网络 这只是一个简单的回合制游戏,player1(主机)按下按钮,它会添加他的分数并将其回合更改为player2(客户端),后者按下按钮添加分数并将回合更改为player1。它继续是无限的 我能够使用基本的Photon文档连接游戏中的两名玩家。现在,我需要添加轮流和更改的网络逻辑 我在互联网上搜索了一下,但我无法理解光子的RPC和SerializeView。我真的很困惑。请帮帮我。以后谢谢你。这是我的GameManager脚本 使用系统集合

我试图创建一个简单的2D回合为基础的多人游戏使用光子统一网络

这只是一个简单的回合制游戏,
player1
(主机)按下按钮,它会添加他的分数并将其回合更改为
player2
(客户端),后者按下按钮添加分数并将回合更改为
player1
。它继续是无限的

我能够使用基本的
Photon
文档连接游戏中的两名玩家。现在,我需要添加轮流和更改的网络逻辑

我在互联网上搜索了一下,但我无法理解光子的
RPC
SerializeView
。我真的很困惑。请帮帮我。以后谢谢你。这是我的
GameManager
脚本

使用系统集合;
使用System.Collections.Generic;
使用UnityEngine;
使用UnityEngine.SceneManagement;
使用UnityEngine.UI;
公共类游戏管理器:Photon.punphavior
{    
公共文本名称;
公共文本播放器1名称,播放器2名称;
public List playersConnected=new List();
int scoreP1=0,scoreP2=0;
公共文本scoreTextP1、scoreTextP2;
公共按钮p1Btn、p2Btn;
int playerTurn=1;
void Start()
{
roomName.text=SceneManager.GetActiveScene().name;
p2Btn.gameObject.SetActive(false);
p1Btn.gameObject.SetActive(true);
}    
公共无效AddScoreP1()
{
分数P1++;
scoreTextP1.text=scoreP1.ToString();
ChangePlayerTurn();
}
公共无效AddScoreP2()
{
评分2++;
scoreTextP2.text=scoreP2.ToString();
ChangePlayerTurn();
}
void ChangePlayerTurn()
{
如果(playerTurn==1)
{
playerTurn=2;
p2Btn.gameObject.SetActive(true);
p1Btn.gameObject.SetActive(false);
}
其他的
{
playerTurn=1;
p1Btn.gameObject.SetActive(true);
p2Btn.gameObject.SetActive(false);
}
打印(“玩家回合:P”+玩家回合);
}
void LoadArena()
{
如果(!PhotonNetwork.isMasterClient)
{
LogError(“PhotonNetwork:尝试加载一个级别,但我们不是主客户端”);
}
调试日志(“PhotonNetwork:加载级别:“+PhotonNetwork.room.PlayerCount”);
PhotonNetwork.LoadLevel(“房间为”+PhotonNetwork.Room.PlayerCount);
}
公共覆盖无效OnLeftRoom()
{
场景管理器。加载场景(0);
}      
公共休息室()
{
PhotonNetwork.LeaveRoom();
}
已连接的PhotonPlayer上的公共覆盖无效(PhotonPlayer其他)
{
Debug.Log(“OnPhotonPlayerConnected()”+other.昵称);//如果您是正在连接的播放器,则不显示
foreach(PhotonLayer\u PhotonNetwork中的玩家。玩家列表)
{
playersConnected.Add(其他.昵称);
}
if(PhotonNetwork.isMasterClient)
{
Debug.Log(“OnPhotonPlayerConnectioned isMasterClient”+PhotoNetwork.isMasterClient);//在OnPhotonPlayerDisconnected之前调用
LoadArena();
}
}
已连接的PhotonPlayerDisconnected(PhotonPlayerOther)上的公共覆盖无效
{
Debug.Log(“OnPhotonPlayerDisconnected()”+other.昵称);//在其他断开连接时看到
foreach(PhotonLayer\u PhotonNetwork中的玩家。玩家列表)
{
playersConnected.Remove(其他.昵称);
}
if(PhotonNetwork.isMasterClient)
{
Debug.Log(“OnPhotonPlayerDisonnected isMasterClient”+PhotonNetwork.isMasterClient);//在OnPhotonPlayerDisconnected之前调用
LoadArena();
}
}
}

RPC基本上是在远程客户端上调用函数的一种方式

通常在多人游戏设置中,您希望您的MasterClient控制游戏流程。所以,当两个玩家加入一个房间时,你需要做的是从你的主客户端,决定哪个玩家先去,然后从主客户端调用一个RPC函数,告诉两个客户端第一次轮到谁。然后,无论轮到哪个玩家,只要激活它的按钮,让他们添加分数(将RPC发送给MasterClient,以便每个人都可以保持同步),然后更新轮到他们,并通过另一个RPC通知每个人,等等


虽然您也可以在此类情况下使用事件,但使用它们所需的准备工作较少。

我不知道仅光子UNet,不幸的是,我看不到您在服务器/客户端上调用方法的尝试。。但是
Rpc
只是一个从服务器调用但在(所有)客户端上执行的方法。它通常与执行相反操作的
Cmd
Command
方法结合使用:它由客户端调用,但仅在服务器上执行。我们如何使用unet来执行?我不局限于使用光子。因为我不知道如何使用unet,所以我使用的是光子。你能帮我上网吗?谢谢