首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于光子统一回合的多人游戏

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

Stack Overflow用户
提问于 2018-01-30 00:32:57
回答 1查看 2.2K关注 0票数 0

我正在尝试创建一个简单的2D转弯为基础的多人游戏使用光子统一网络。

这只是一个简单的基于turn的游戏,其中player 1 (主机)按下他的按钮,它添加他的分数,并将其轮到player 2 (客户端),后者按下他的按钮添加分数,并将turn改为player 1。它继续是无限的。

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

我在网上找过了,但我不能理解光子的RPCSerializeView。我真的对此感到困惑。请帮帮我。谢谢你以后再来。这是我的GameManager脚本

代码语言:javascript
复制
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();
        }
    }
}
EN

回答 1

Stack Overflow用户

发布于 2020-11-07 18:47:08

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

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48505907

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档