我正在尝试创建一个简单的2D转弯为基础的多人游戏使用光子统一网络。
这只是一个简单的基于turn的游戏,其中player 1 (主机)按下他的按钮,它添加他的分数,并将其轮到player 2 (客户端),后者按下他的按钮添加分数,并将turn改为player 1。它继续是无限的。
我能够使用基本的Photon文档连接游戏中的两个玩家。现在,我需要添加轮流和更改它们的网络逻辑。
我在网上找过了,但我不能理解光子的RPC和SerializeView。我真的对此感到困惑。请帮帮我。谢谢你以后再来。这是我的GameManager脚本
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
public class GameManager : Photon.PunBehaviour
{
public Text roomName;
public Text player1Name,player2Name;
public List<string> playersConnected = new List<string>();
int scoreP1 = 0, scoreP2 = 0;
public Text scoreTextP1, scoreTextP2;
public Button p1Btn, p2Btn;
int playerTurn = 1;
void Start()
{
roomName.text = SceneManager.GetActiveScene().name;
p2Btn.gameObject.SetActive(false);
p1Btn.gameObject.SetActive(true);
}
public void AddScoreP1()
{
scoreP1++;
scoreTextP1.text = scoreP1.ToString();
ChangePlayerTurn();
}
public void AddScoreP2()
{
scoreP2++;
scoreTextP2.text = scoreP2.ToString();
ChangePlayerTurn();
}
void ChangePlayerTurn()
{
if (playerTurn == 1)
{
playerTurn = 2;
p2Btn.gameObject.SetActive(true);
p1Btn.gameObject.SetActive(false);
}
else
{
playerTurn = 1;
p1Btn.gameObject.SetActive(true);
p2Btn.gameObject.SetActive(false);
}
print("Player Turn: P" + playerTurn);
}
void LoadArena()
{
if (!PhotonNetwork.isMasterClient)
{
Debug.LogError("PhotonNetwork : Trying to Load a level but we are not the master Client");
}
Debug.Log("PhotonNetwork : Loading Level : " + PhotonNetwork.room.PlayerCount);
PhotonNetwork.LoadLevel("Room for " + PhotonNetwork.room.PlayerCount);
}
public override void OnLeftRoom()
{
SceneManager.LoadScene(0);
}
public void LeaveRoom()
{
PhotonNetwork.LeaveRoom();
}
public override void OnPhotonPlayerConnected(PhotonPlayer other)
{
Debug.Log("OnPhotonPlayerConnected() " + other.NickName); // not seen if you're the player connecting
foreach (PhotonPlayer _player in PhotonNetwork.playerList)
{
playersConnected.Add(other.NickName);
}
if (PhotonNetwork.isMasterClient)
{
Debug.Log("OnPhotonPlayerConnected isMasterClient " + PhotonNetwork.isMasterClient); // called before OnPhotonPlayerDisconnected
LoadArena();
}
}
public override void OnPhotonPlayerDisconnected(PhotonPlayer other)
{
Debug.Log("OnPhotonPlayerDisconnected() " + other.NickName); // seen when other disconnects
foreach (PhotonPlayer _player in PhotonNetwork.playerList)
{
playersConnected.Remove(other.NickName);
}
if (PhotonNetwork.isMasterClient)
{
Debug.Log("OnPhotonPlayerDisonnected isMasterClient " + PhotonNetwork.isMasterClient); // called before OnPhotonPlayerDisconnected
LoadArena();
}
}
}发布于 2020-11-07 18:47:08
RPC基本上是在远程客户端上调用函数的一种方式。
通常在多人游戏中,你会希望你的MasterClient来控制游戏的流程。所以,当两个玩家加入一个房间时,你需要做的就是从你的MasterClient中决定哪个玩家先走,然后从MasterClient调用一个RPC函数,告诉两个客户端第一个轮到谁。然后,无论轮到哪个玩家,只需激活它的按钮并让他们添加分数(也将RPC发送到MasterClient,以便每个人都能保持同步)。然后更新会通过另一个RPC告诉每个人,等等。
虽然您也可以在这种情况下使用事件,但使用它们需要的准备工作较少。
https://stackoverflow.com/questions/48505907
复制相似问题