c# - 用镜子制作多人多人纸牌游戏
问题描述
我正在尝试构建一个最多 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;
}
解决方案
推荐阅读
- python - Tkinter 滚动条不起作用:使用网格显示数据框
- javascript - 为什么这个变量没有在这个条件语句中被赋值?
- r - 使用 par() 设置 col= 参数
- python - 使用 BeautifulSoup 从 HTML 中提取文本
- arrays - 将数组转换为多维哈希
- design-patterns - 构造+视图模式示例的实现
- javascript - 如何为动态宽度内容设置动画?
- multithreading - 使用 data-provider-thread-count 和 thread-count 并行执行
- javascript - 反应 this.SetState 未定义 - 嵌套函数
- python-3.x - 无法使 ReportLab 正确打印 unicode 字体