【问题标题】:How to Deal Cards to 4 players in Unity?如何在 Unity 中向 4 名玩家发牌?
【发布时间】:2021-02-07 03:36:23
【问题描述】:

我是 Unity 和基于组件的编程新手,遇到了一点小问题。有这么多纸牌游戏,你会认为会有一些关于如何发牌的说明,但没有……所以,我来了。

我创建了一个卡片类、一个卡片数据库和一个卡片组。我在使用甲板类的层次结构中创建了一个游戏对象。这是甲板类:

public class PlayerDeck : MonoBehaviour
{
    public int d;
   
    public List<Card> deck;
    public List<Card> container;
    public List<Card> distributed;
    public List<Card> discarded;
    public int decksize;

    void Start()
    {
        
        LoadVariables();
        LoadDeck();
        ShuffleDeck()   
        
        
    }

    public void LoadVariables()
    {
        d = 0;
        decksize = 64;
    }

    public void LoadDeck()
    {
       

        for (int i = 0; i < 64; i++)
        {
            d = i;
            deck[d] = CardDatabase.cardList[i];
        }
    }

    public void ShuffleDeck()
    {

 
       for (int i=0; i<decksize; i++)
        {
            container[0] = deck[i];
            int rnd = Random.Range(i, decksize);
            deck[i] = deck[rnd];
            deck[rnd] = container[0];

        }


    }

    public void DealCards()
    {
    }

}

当我在调试中运行它时,我可以看到卡片被洗牌了。现在我需要这套牌最初给每个玩家发 7 张牌,就像在 UNO 中一样。这是我不了解基于组件的编程的地方。如果我有一个名为 Deck 的 GameObject 和 4 个其他 GameObject 供玩家使用,那么 4 个玩家的游戏对象如何接收 Deck 发给他们的牌?

任何编码帮助将不胜感激。

【问题讨论】:

  • 你洗牌了,然后从 0 到卡牌循环,给 x 数量的玩家。 Uno 的 4x7。查看 % 操作数以了解将当前卡片交给哪个玩家。
  • 不,这不适用于基于组件的编程。这只是我已经知道的直接编程。
  • @user3623689 如果verified_tinker 的回答对您有帮助,请考虑accepting it

标签: unity3d


【解决方案1】:

卡片是 Scriptable Objects 的主要候选对象——一种特定于 Unity、设计人员友好的创建新卡片的方法,而不是使用基于代码的数据库。 Brackeys 在这个确切的用例上有一个excellent tutorial,所以我不会在这里浪费时间。

一旦您创建了派生自ScriptableObject 的类并基于它创建了资产,并且您创建了一个MonoBehaviour 类(组件)来读取和显示该数据(本教程也涵盖了这一点,如@ 987654326@),您需要将带有该组件的游戏对象保存为prefab

最后,您将创建另一个引用预制件的脚本并将其实例化 4 次。例如:

// You'll drag the prefab you created into the field in the inspector:
public GameObject cardPrefab;

public void DealCards()
{
    // ...And then instantiate the prefab 4 times, once for each holder.
    foreach (Transform cardHolder in cardHolders)
        GameObject card = Instantiate(cardPrefab, parent: cardHolder);
}

这将在场景中实例化卡片游戏对象,作为其持有者的孩子。根据需要定制; Instantiate() has many variants。它总是返回新的游戏对象,您可以随意保存和使用。

如果您想洗牌然后将牌从牌组发给一个玩家,则在PlayerDeck.cs 中保存一张牌预制列表,然后循环那个

【讨论】:

    猜你喜欢
    • 2017-05-16
    • 1970-01-01
    • 2014-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多