首页 > 解决方案 > 用镜子制作多人多人纸牌游戏

问题描述

我正在尝试构建一个最多 4 名玩家的多人纸牌游戏,而且我对多人游戏非常陌生。想法是有一个“发牌”按钮,当玩家点击它时,应该向他/她的手牌发 14 张牌。(我愿意接受有关只需单击一下就将牌发给每个玩家手牌的建议)。无论如何,我写了下面的代码。基本上,当服务器启动时会生成卡片并将它们添加到卡片组(列表(卡片))。Button 应该从卡片组中取出 14 张卡片,并根据其信息和卡片图像对其进行实例化。当 4 名玩家连接时,每位玩家应拿到 14 张牌,然后游戏开始。所以在下面的代码中,当主机玩家点击时,从牌组中取出 14 张卡片并根据他们的信息和卡片图片进行实例化,并将父级设置为正确的位置,但是当其他玩家点击时,我会收到此错误;

“试图在没有权限的情况下为对象发送命令。PlayerManager.CmdShowCards UnityEngine.Logger:Log(LogType, Object)”

我尝试了几种方法来消除此错误,我删除了但仍然其他玩家无法获得他们的卡(按钮点击但不执行任何操作。)

我正在使用 parelsync 来检查游戏。

那么有什么建议可以使它正确或任何其他方式来使我提到的内容正确吗?

在我的代码下面;

交易卡类(附在按钮上);

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Mirror;

public class DealCards : NetworkBehaviour
{
    public PlayerManager playerManager;

    public void OnClick()
    {
         NetworkIdentity netWorkIdentity = NetworkClient.connection.identity;
         playerManager = netWorkIdentity.GetComponent<PlayerManager>();
         playerManager.CmdGenerateCardLists();
    }
} 

在 PlayerManager 类下面;

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Mirror;
using System.Linq;
using UnityEngine.UI;

public class PlayerManager : NetworkBehaviour
{
    public GameObject gameBoard;
    public GameObject deckPlace;
    public GameObject okeyPlace;
    public GameObject playerArea;

    public List<GameObject> deck = new List<GameObject>();
    public List<Card> hand = new List<Card>();
    public List<Sprite> cardImages = new List<Sprite>();
    public GameObject cardPrefab;

    [Client]
    public override void OnStartClient()
    {
        base.OnStartClient();

        playerArea = GameObject.Find("PlayerArea");
        gameBoard = GameObject.Find("GameBoard");
        deckPlace = GameObject.Find("Deck");
        okeyPlace = GameObject.Find("OkeyPlace");
    }

    [Server]

    public override void OnStartServer()
    {
        //Generating Cards
        #region Generating FirstDeckOfCards

        List<Card> jokers = new List<Card>();

        Card joker = new Card()
        {
            realValue = 1,
            name = "Joker",
            suit = Card.Suit.joker,
            imgSuit = Card.ImageSuit.jokerImg,
            subValue = 0,
            backFace = Card.Color.cream,
            isJoker = true
        };


        List<Card> clubsSeries = new List<Card>();

        //Clubs Series
        Card aceOfClubs = new Card()
        {
            realValue = 1,
            name = "Clubs",
            suit = Card.Suit.clubs,
            imgSuit = Card.ImageSuit.clubsImg,
            subValue = 0,
            backFace = Card.Color.cream
        };

           And So on...

        #region Joker Cards Are Added To Joker List

        jokers.Add(joker);

        #endregion Joker Cards Are Added To Joker List
        #region Joker2 Cards Are Added To Joker List

        jokers2.Add(joker2);

        #endregion Joker2 Cards Are Added To Joker List

        //Clubs Cards Are Added To ClubsSeries List
        #region Clubs Cards Are Added To ClubsSeries List

        clubsSeries.Add(aceOfClubs);
        clubsSeries.Add(twoOfClubs);
        clubsSeries.Add(threeOfClubs);
        clubsSeries.Add(fourOfClubs);
        clubsSeries.Add(fiveOfClubs);
        clubsSeries.Add(sixOfClubs);
        clubsSeries.Add(sevenOfClubs);
        clubsSeries.Add(eightOfClubs);
        clubsSeries.Add(nineOfClubs);
        clubsSeries.Add(tenOfClubs);
        clubsSeries.Add(elevenOfClubs);
        clubsSeries.Add(twelveOfClubs);
        clubsSeries.Add(thirteenOfClubs);

        #endregion Clubs Cards Are Added To ClubsSeries List
        #region Clubs2 Cards Are Added To ClubsSeries List

        clubsSeries2.Add(aceOfClubs2);
        clubsSeries2.Add(twoOfClubs2);
        clubsSeries2.Add(threeOfClubs2);
        clubsSeries2.Add(fourOfClubs2);
        clubsSeries2.Add(fiveOfClubs2);
        clubsSeries2.Add(sixOfClubs2);
        clubsSeries2.Add(sevenOfClubs2);
        clubsSeries2.Add(eightOfClubs2);
        clubsSeries2.Add(nineOfClubs2);
        clubsSeries2.Add(tenOfClubs2);
        clubsSeries2.Add(elevenOfClubs2);
        clubsSeries2.Add(twelveOfClubs2);
        clubsSeries2.Add(thirteenOfClubs2);

        #endregion Clubs2 Cards Are Added To ClubsSeries List

        //Diamonds Cards Are Added To DiamondsSeries List
        #region Diamonds Cards Are Added To DiamondsSeries List

        diamondsSeries.Add(aceOfDiamonds);
        diamondsSeries.Add(twoOfDiamonds);
        diamondsSeries.Add(threeOfDiamonds);
        diamondsSeries.Add(fourOfDiamonds);
        diamondsSeries.Add(fiveOfDiamonds);
        diamondsSeries.Add(sixOfDiamonds);
        diamondsSeries.Add(sevenOfDiamonds);
        diamondsSeries.Add(eightOfDiamonds);
        diamondsSeries.Add(nineOfDiamonds);
        diamondsSeries.Add(tenOfDiamonds);
        diamondsSeries.Add(elevenOfDiamonds);
        diamondsSeries.Add(twelveOfDiamonds);
        diamondsSeries.Add(thirteenOfDiamonds);

        #endregion Diamonds Cards Are Added To DiamondsSeries List
        #region Diamonds2 Cards Are Added To DiamondsSeries List

        diamondsSeries2.Add(aceOfDiamonds2);
        diamondsSeries2.Add(twoOfDiamonds2);
        diamondsSeries2.Add(threeOfDiamonds2);
        diamondsSeries2.Add(fourOfDiamonds2);
        diamondsSeries2.Add(fiveOfDiamonds2);
        diamondsSeries2.Add(sixOfDiamonds2);
        diamondsSeries2.Add(sevenOfDiamonds2);
        diamondsSeries2.Add(eightOfDiamonds2);
        diamondsSeries2.Add(nineOfDiamonds2);
        diamondsSeries2.Add(tenOfDiamonds2);
        diamondsSeries2.Add(elevenOfDiamonds2);
        diamondsSeries2.Add(twelveOfDiamonds2);
        diamondsSeries2.Add(thirteenOfDiamonds2);

        #endregion Diamonds2 Cards Are Added To DiamondsSeries List

        //Hearts Cards Are Added To HeartsSeries List
        #region Hearts Cards Are Added To HeartsSeries List

        heartsSeries.Add(aceOfHearts);
        heartsSeries.Add(twoOfHearts);
        heartsSeries.Add(threeOfHearts);
        heartsSeries.Add(fourOfHearts);
        heartsSeries.Add(fiveOfHearts);
        heartsSeries.Add(sixOfHearts);
        heartsSeries.Add(sevenOfHearts);
        heartsSeries.Add(eightOfHearts);
        heartsSeries.Add(nineOfHearts);
        heartsSeries.Add(tenOfHearts);
        heartsSeries.Add(elevenOfHearts);
        heartsSeries.Add(twelveOfHearts);
        heartsSeries.Add(thirteenOfHearts);

        #endregion Hearts Cards Are Added To HeartsSeries List
        #region Hearts2 Cards Are Added To HeartsSeries List

        heartsSeries2.Add(aceOfHearts2);
        heartsSeries2.Add(twoOfHearts2);
        heartsSeries2.Add(threeOfHearts2);
        heartsSeries2.Add(fourOfHearts2);
        heartsSeries2.Add(fiveOfHearts2);
        heartsSeries2.Add(sixOfHearts2);
        heartsSeries2.Add(sevenOfHearts2);
        heartsSeries2.Add(eightOfHearts2);
        heartsSeries2.Add(nineOfHearts2);
        heartsSeries2.Add(tenOfHearts2);
        heartsSeries2.Add(elevenOfHearts2);
        heartsSeries2.Add(twelveOfHearts2);
        heartsSeries2.Add(thirteenOfHearts2);

        #endregion Hearts2 Cards Are Added To HeartsSeries List

        //Spades Cards Are Added To SpadesSeries List
        #region Spades Cards Are Added To SpadesSeries List

        spadesSeries.Add(aceOfSpades);
        spadesSeries.Add(twoOfSpades);
        spadesSeries.Add(threeOfSpades);
        spadesSeries.Add(fourOfSpades);
        spadesSeries.Add(fiveOfSpades);
        spadesSeries.Add(sixOfSpades);
        spadesSeries.Add(sevenOfSpades);
        spadesSeries.Add(eightOfSpades);
        spadesSeries.Add(nineOfSpades);
        spadesSeries.Add(tenOfSpades);
        spadesSeries.Add(elevenOfSpades);
        spadesSeries.Add(twelveOfSpades);
        spadesSeries.Add(thirteenOfSpades);

        #endregion Spades Cards Are Added To SpadesSeries List       
        #region Spades2 Cards Are Added To SpadesSeries List

        spadesSeries2.Add(aceOfSpades2);
        spadesSeries2.Add(twoOfSpades2);
        spadesSeries2.Add(threeOfSpades2);
        spadesSeries2.Add(fourOfSpades2);
        spadesSeries2.Add(fiveOfSpades2);
        spadesSeries2.Add(sixOfSpades2);
        spadesSeries2.Add(sevenOfSpades2);
        spadesSeries2.Add(eightOfSpades2);
        spadesSeries2.Add(nineOfSpades2);
        spadesSeries2.Add(tenOfSpades2);
        spadesSeries2.Add(elevenOfSpades2);
        spadesSeries2.Add(twelveOfSpades2);
        spadesSeries2.Add(thirteenOfSpades2);

        #endregion Spades2 Cards Are Added To SpadesSeries List       

        #region Cards Are Added To Deck

        deck.AddRange(jokers); //Jokers List Is Added To Deck;
        deck.AddRange(clubsSeries); //Clubs Series List Is Added To Deck;
        deck.AddRange(diamondsSeries); //Diamonds Series List Is Added To Deck;
        deck.AddRange(heartsSeries); //Hearts Series List Is Added To Deck;
        deck.AddRange(spadesSeries); //Spades Series List Is Added To Deck;
        deck.AddRange(jokers2); //Jokers List Is Added To Deck;
        deck.AddRange(clubsSeries2); //Clubs Series List Is Added To Deck;
        deck.AddRange(diamondsSeries2); //Diamonds Series List Is Added To Deck;
        deck.AddRange(heartsSeries2); //Hearts Series List Is Added To Deck;
        deck.AddRange(spadesSeries2); //Spades Series List Is Added To Deck;

        #endregion Cards Are Added To Deck

    }

    [Command]

    public void CmdGenerateCardsList()
    {
        var tempHand = deck.GetRange(0, 14);

        foreach (var i in tempHand)
        {
            if (isLocalPlayer)
            {
               hand.Add(i);
               deck.Remove(i);
            }
        }
            CmdShowCards();
    }

    [Command]

    public void CmdShowCards()
    {
        if (isLocalPlayer)
        {
            for(int i = 0; i < hand.Count; i++)
            CmdGeneratePlayerCards(hand[i]);
        }
    }

    [Command]

    public void CmdInstantiateCards(Card c)
    {
        GameObject newestCard = Instantiate(cardPrefab, Vector3.zero, Quaternion.identity);
        NetworkServer.Spawn(newestCard, connectionToClient);


        CardInfo ci = newestCard.GetComponent<CardInfo>();
        ci.card = c;

        int cardImageIndex = c.subValue * 4;

        switch (c.imgSuit)
        {
            case Card.ImageSuit.clubsImg:
                cardImageIndex += 1;
                break;

            case Card.ImageSuit.diamondsImg:
                cardImageIndex += 2;
                break;

            case Card.ImageSuit.heartsImg:
                cardImageIndex += 3;
                break;

            case Card.ImageSuit.spadesImg:
                cardImageIndex += 4;
                break;
        }

        ci.GetComponent<Image>().sprite = cardImages[cardImageIndex];

        RpcParenting(newestCard);

    }

    [ClientRpc]

    public void RpcParenting(GameObject card)
    {
        if (isLocalPlayer)
        {
            card.transform.SetParent(playerArea.transform, false);
        }
    }
}

[System.Serializable]

public class Card
{
    public int realValue;
    public enum Suit { joker, clubs, diamonds, hearts, spades, okeySuit }
    public Suit suit;
    public enum ImageSuit { jokerImg, clubsImg, diamondsImg, heartsImg, spadesImg }
    public ImageSuit imgSuit;
    public int subValue;
    public enum Color { cream, blue }
    public Color backFace;
} 

标签: c#unity3d

解决方案


推荐阅读