c# - 如何在 Unity C# 中的对象之间传输信息?
问题描述
我是统一和基于组件的编程的新手。我还没有做任何视觉上的事情(动画、图形等)只是逻辑。
我正在创建一个独特的纸牌游戏作为一种爱好,需要一些关于列表的帮助。我为 Hierarchy 中的 PlayerDeck 游戏对象创建了一个 PlayerDeck 类,该类从数据库加载、洗牌和发牌给四个玩家。这是代码:
public class PlayerDeck : MonoBehaviour
{
public int d;
public int w;
public int x;
public int y;
public int z;
public List<Card> deck;
public List<Card> container;
public List<Card> player1hand;
public List<Card> player2hand;
public List<Card> player3hand;
public List<Card> player4hand;
public List<Card> distributed;
public List<Card> discarded;
public int decksize;
void Start()
{
LoadVariables();
LoadDeck();
ShuffleDeck();
DealCards();
}
public void LoadVariables()
{
d = 0;
w = 0;
x = 0;
y = 0;
z = 0;
decksize = 64;
}
public void LoadDeck()
{
for (int i = 0; i < 64; i++)
{
d = i;
deck[d] = CardDatabase.cardList;
}
}
public void ShuffleDeck()
{
for (int i=0; i<decksize; i++)
{
container[0] = deck;
int rnd = Random.Range(i, decksize);
deck = deck[rnd];
deck[rnd] = container[0];
}
}
public void DealCards()
{
// deal to player one
for (int i = 0; i < 7; i++)
{
w = i;
player1hand[w] = deck;
distributed = player1hand[w];
deck.Remove(deck);
}
//deal to player two
for (int i=7; i < 14; i++)
{
player2hand[x] = deck;
distributed = player2hand[x];
deck.Remove(deck);
x++;
}
//deal to player three
for (int i = 14; i < 21; i++)
{
player3hand[y] = deck;
distributed = player3hand[y];
deck.Remove(deck);
y++;
}
//deal to player four
for (int i = 21; i < 28; i++)
{
player4hand[z] = deck;
distributed = player4hand[z];
deck.Remove(deck);
z++;
}
}
}
到目前为止,逻辑似乎是合法的。我对其进行了调试,我可以看到每个玩家都从牌组中获得了正确的牌。现在,我创建了一个名为 Player1 的游戏对象,并希望创建一个类,其中 Player1 可以访问 Player Deck 中的 player1hand 列表。基本上,如何在代码中将此信息传输到 Player1?这是我所做的,但我得到了玩家 1 的空白:
[RequireComponent(typeof (PlayerDeck))]
public class PlayerHand : MonoBehaviour
{
PlayerDeck playerhand;
public List<Card> dealthand;
public int a;
private void Start()
{
playerhand = GetComponent<PlayerDeck>();
for (int i = 0; i < 7; i++)
{
a = 0;
dealthand[a] = playerhand.player1hand;
a++;
}
}
有任何想法吗?任何帮助将不胜感激。
解决方案
你的设计没有多大意义。为什么牌组拥有玩家手中的牌?让双手管理他们自己的牌,而牌组应该只告诉手拿牌并做他们用它们做的任何事情。
我会向 PlayerHand 添加一个名为的方法,该方法Add
接受 aCard
并将其添加到他们的手上。
每个都PlayerHand
应该在不同的游戏对象上。此外,您的示例代码看起来好像每个玩家都从同一个牌堆中抽牌并丢弃到同一个牌堆,因此不需要PlayerDeck
在同一组件上要求 aPlayerHand
如果手需要在其他点引用牌组,还可以添加一个调用方法RegisterDeck
来为牌组提供PlayerHand
.
public class PlayerHand : MonoBehaviour
{
[SerializeField] List<Card> dealtHand;
[SerializeField] PlayerDeck myDeck;
private void Awake()
{
dealtHand = new List<Card>();
}
public void Add(Card addedCard)
{
dealtHand.Add(addedCard);
}
public void RegisterDeck(PlayerDeck myDeck)
{
this.myDeck = myDeck;
}
}
然后在 中PlayerDeck
,将您的playerXhand
字段替换为单个List<PlayerHand> playerHands
字段,然后使用AddToHand
. 我不确定您通过将列表分配为列表中的项目来尝试做什么,player1hand[w] = deck;
但只需从列表顶部删除卡片。:
public class PlayerDeck : MonoBehaviour
{
// ...
[SerializeField] List<PlayerHand> playerHands;
// ...
public void DealCards()
{
// deal 7 to each player
foreach (PlayerHand hand in playerHands)
{
hand.RegisterDeck(this);
for (int i = 0; i < 7; i++)
{
Debug.Assert(deck.Count > 0, "Ran out of cards while dealing");
Card drawnCard = deck[0];
deck.RemoveAt(0);
hand.Add(drawnCard);
}
}
}
}
然后,在编辑器中,我将指定长度为Player Hands
4,然后将每个PlayerHand
附加到的游戏对象拖到该列表中,以便PlayerDeck
可以访问它们。顺便说一下,每个 PlayerHand 肯定应该在不同的游戏对象中。
推荐阅读
- python - 如何在 Tensorflow 中保存和恢复经过训练的 LSTM 模型?
- database-design - 在 dynamodb 中存储树状结构
- postgresql - 我能够创建一个函数但无法调用它
- node.js - `TypeError [ERR_INVALID_CALLBACK] 中的理解问题:回调必须是节点中的函数
- java - 类型不匹配:无法将 session.setPortForwardingL() 从 void 转换为 int;
- javascript - 如何在 NetSuite 上的 beforeLoad 功能中操作记录?
- php - 从 PHP 中的结果准备 json 数组
- ios - 如何在终端上从 xcarchive 导出 dsym 文件
- reactjs - 嵌套路由器不工作代码拆分
- javascript - 如何将 id 名称传递给 jQuery 验证并发送到控制器?