首页 > 解决方案 > 如何在 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++;
}
}

有任何想法吗?任何帮助将不胜感激。

标签: c#arraysunity3dobject

解决方案


你的设计没有多大意义。为什么牌组拥有玩家手中的牌?让双手管理他们自己的牌,而牌组应该只告诉手拿牌并做他们用它们做的任何事情。

我会向 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 Hands4,然后将每个PlayerHand附加到的游戏对象拖到该列表中,以便PlayerDeck可以访问它们。顺便说一下,每个 PlayerHand 肯定应该在不同的游戏对象中。


推荐阅读