如何在屏幕上显示卡片 - Unity,C#

时间:2017-06-09 04:17:52

标签: c# unity3d

我正在制作纸牌游戏,而且我在制作卡片时遇到了麻烦。有谁知道如何让它们出现在屏幕的底部,每张卡之间有间隙?这个想法类似于纸牌,当你点击一张牌时,它会移动到其他牌上方并显示所有统计数据。

我的玩家经理代码:

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using UnityEngine.UI;
using UnityEngine.EventSystems;

public class s_PlayerManager : MonoBehaviour {

public bool isAi;
public s_DeckSetUp deckManager;
public List<Card> PlayerDeck = new List<Card>();
public List<Card> PlayerHand = new List<Card>();
public List<Card> PlayerGrave = new List<Card>();
public Card selectedCard;
private int totalHandCount = 5;
public int cardCount = 0;

void Start(){
    deckManager = GameObject.Find("Deck Manager").GetComponent<s_DeckSetUp>();
}

public void StartDeck(){
    for(int a = 0; a < deckManager.DeckAllCards.Count; a++){
        int b = Random.Range(0, deckManager.DeckAllCards.Count);
        PlayerDeck.Add(deckManager.DeckAllCards[b]);
    }
    DrawHand();
    EventSystem.current.currentSelectedGameObject.SetActive(false);
}

public void DrawHand(){
    for(cardCount = 0; cardCount < totalHandCount; cardCount++){
        int b = Random.Range(0, PlayerDeck.Count);
        PlayerHand.Add(PlayerDeck[b]);
        PlayerDeck.RemoveAt(b);
    }
}

public void CardDraw(){
    if(cardCount < totalHandCount){
        int b = Random.Range(0, PlayerDeck.Count);
        PlayerHand.Add(PlayerDeck[b]);
        PlayerDeck.RemoveAt(b);
        cardCount++;
    } 
 }
}

它处理创建球员牌组,并绘制前5张牌。单击UI按钮即可触发CardDraw功能。任何人都可以告诉我如何让卡片出现在屏幕上吗?我在项目文件中有卡片艺术。任何帮助是极大的赞赏。我也在Unity论坛上发布了这个: https://forum.unity3d.com/threads/making-cards-appear-on-screen.475335/

1 个答案:

答案 0 :(得分:0)

我将向您解释如何首先在屏幕底部显示一张卡片。

最困难的部分可能是计算你必须放置精灵的世界位置(我假设你有精灵为你的卡片)。

我将如何计算您想要卡片的屏幕位置,因为您需要将它们放在屏幕的底部。

您可以使用Screen.width来获取屏幕的宽度。高度无关紧要,因为我们希望将卡片放置在屏幕底边的零高度。

屏幕空间中屏幕的底部中心将是

Vector2 botCenterScreenSpace = new Vector2(Screen.width/2, 0)

您可以使用以下代码获取世界空间中屏幕的底部中心:

var botCenterWorldSpace = Camera.main.ScreenToWorldPoint(new Vector3(botCenterScreenSpace.x, botCenterScreenSpace.y, Camera.main.nearClipPlane));

查看这是否有效的最快方法是设置精灵。默认情况下,精灵锚点应该恰好位于卡片的中心,现在可以正常使用。

为您的卡片制作预制件。为了使测试更容易,我们将设置CardDealerUi脚本。

public class CardDealerUi : MonoBehaviour
{
    [SerializeField] private GameObject cardPrefab;

    private Vector2 botCenterScreenSpace;
    private Vector3 botCenterWorldSpace;

    void Start()
    {
        this.botCenterScreenSpace = new Vector2(Screen.width/2, 0);
        this.botCenterWorldSpace = Camera.main.ScreenToWorldPoint(new Vector3(botCenterScreenSpace.x, botCenterScreenSpace.y, Camera.main.nearClipPlane));
    }

    void OnCardDrawn(Card cardDrawn)
    {
        GameObject newCardUi = GameObject.Instantiate(this.cardPrefab, this.botCenterWorldSpace, Quaternion.indentity);

        // Here you can swap sprites for your cards or so.
    }
}

要测试它,只需执行一些基本的键盘输入,并使用任何Card对象调用OnCardDrawn。

在这个例子中,你只有一个预制件。为了让你意识到你的游戏,你可能想要为每种类型的卡设置一个预制件,或者你想要一个预制件并换掉我在上面评论过的精灵。

到目前为止,您应该在屏幕上显示一张卡片。现在的问题是在哪里放第二张和第三张和第四张卡等等。这将需要一些数学来得到你想要的。

我不会详细介绍,但您很可能在经销商脚本中有2个常量。 float CardWidthfloat CardGap

当您处理5张牌时,您可能想要计算所有牌的总宽度,包括间隙。那是var totalWidth = numCards * CardWidth + (numCards - 1) * CardGap。然后,来自botCenterWorldSpace的偏移量将变为:

for(int i = 0; i < cardsToDeal.Length; i++)
{
    var cardPosition = botCenterWorldSpace - new Vector3(totalWidth + (totalWidth/cardsToDeal.Length*i) + CardWidth/2, 0, 0);
}

万一你想知道这段代码属于哪里,你将在CardDealerUi中有一个新功能。像这样:

public class CardDealerUi : MonoBehaviour
{
    [SerializeField] private GameObject cardPrefab;

    private Vector2 botCenterScreenSpace;
    private Vector3 botCenterWorldSpace;

    void Start()
    {
        this.botCenterScreenSpace = new Vector2(Screen.width/2, 0);
        this.botCenterWorldSpace = Camera.main.ScreenToWorldPoint(new Vector3(botCenterScreenSpace.x, botCenterScreenSpace.y, Camera.main.nearClipPlane));
    }

    void OnCardsDrawn(List<Card> cardsDrawn)
    {
         for(int i = 0; i < cardsDrawn.Length; i++)
        {
            var cardPosition = this.botCenterWorldSpace - new Vector3(totalWidth + (totalWidth/cardsDrawn.Length*i) + CardWidth/2, 0, 0);

            GameObject newCardUi = GameObject.Instantiate(this.cardPrefab, cardPosition , Quaternion.indentity);
        }


        // Here you can swap sprites for your cards or so.
    }
}

我希望这可以让你走上正轨。

从这里开始,您需要单独研究动画卡片并将其移动到鼠标上。