如何在 Unity C# 中的对象之间传输信息?

Posted

技术标签:

【中文标题】如何在 Unity C# 中的对象之间传输信息?【英文标题】:How to transfer information between objects in Unity C#? 【发布时间】:2021-02-06 20:59:31 【问题描述】:

我不熟悉统一和基于组件的编程。我还没有做任何视觉上的事情(动画、图形等),只是逻辑。

我正在创建一个独特的纸牌游戏作为爱好,需要一些关于列表的帮助。我为 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++;


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

【问题讨论】:

你不能从检查器注入/链接这两个组件吗?尝试将 PlayerDeck playerhand 设为 public 或添加 [SerializeField] 属性,如果它没有显示在检查器的 PlayerHand 组件上。你的缩进也是这样吗? 【参考方案1】:

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

我会向 PlayerHand 添加一个名为 Add 的方法,该方法接受 Card 并将其添加到他们的手上。

每个PlayerHand 应该在不同的游戏对象上。此外,您的示例代码看起来好像每个玩家都从同一个牌堆中抽牌并丢弃到同一个牌堆,因此不需要在与 PlayerHand 相同的组件上使用 PlayerDeck

如果手牌需要在其他点引用牌组,还可以添加一个名为 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&lt;PlayerHand&gt; 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 肯定应该在不同的游戏对象中。

【讨论】:

感谢您的回复。我想我之所以这样设计它是因为这个特定游戏的规则。玩家并没有真正从牌组中抽出。这套牌就像赌场经销商,根据特定规则发牌,有点像二十一点,但我想我明白你在说什么。 我会向PlayerHand 添加一个方法,该方法查看手中的牌并返回一个布尔值表示它是否应该收到一张牌或一个表示应该发多少张牌的整数(取决于规则,问题从未提及)。然后牌组可以询问手牌要处理多少。然后它可以向该特定玩家发该数量的牌。 @user3623689 如果这个答案对你有帮助,请考虑accepting it

以上是关于如何在 Unity C# 中的对象之间传输信息?的主要内容,如果未能解决你的问题,请参考以下文章

如何使相机跟随unity3d C#中的对象?

如何在脚本中仅使用游戏对象启用 Unity C# 中的部件/组件

C# Unity如何只选择数组中的一项并取消选择其他项

unity怎么学

unity5 中的 Socket.IO,C# - 如何发出字符串或对象?

Unity使用webSocket与服务器通信——C#服务端(Fleck)与Unity客户端( NativeWebSocket)传输多种数据数据