unity3d 基于Photon Unity回合的多人游戏

laximzn5  于 2022-12-04  发布在  其他
关注(0)|答案(2)|浏览(202)

我试图创建一个简单的二维回合为基础的多人游戏使用光子统一网络。
这只是一个简单的回合制游戏,一个player 1(主机)按下他的按钮,它增加了他的分数,并将其回合改为player 2(客户),后者按下他的按钮,增加了分数,并将回合改为player 1。它继续无限。
我能够使用基本的Photon文档在游戏中连接两个玩家。现在我需要添加轮流和改变他们的联网逻辑。
我在网上搜索了一下,但是我看不懂光子的RPCSerializeView。我真的很困惑。请帮助我。以后谢谢你。这是我的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();
        }
    }
}
bnlyeluc

bnlyeluc1#

RPC基本上是一种调用远程客户端上的函数的方式。
通常在多人游戏中,你会希望你的主客户端控制游戏的流程。所以,当两个玩家加入一个房间时,你需要从你的主客户端决定哪个玩家先走,然后从主客户端调用一个RPC函数,告诉两个客户端谁是第一个轮到的玩家。然后轮到哪个玩家。只要激活它的按钮,让他们添加分数(发送RPC到MasterClient以及为那,所以每个人都可以保持同步。2)和更新转身,并告诉大家通过另一个RPC等。
虽然您也可以将事件用于此类情况,但使用它们所需的准备工作较少。

mpbci0fu

mpbci0fu2#

两者简单地说:
RPC,远程过程调用,是用来调用一个方法到所有的客户端/用户在同一个房间/水平。像这样的例子,你可能想使用RCP来更新球队的得分,如果一个球队得分。
SerializeView被PUN用来每秒同步和读取数据几次,这取决于序列化速率。像这样的例子,你将使用它来获取和读取彼此的数据,比如另一个玩家实时有多少分。
有关RCP和SerializeView的详细信息,请访问Photon网站Link

相关问题