【问题标题】:How to make cards appear on screen - Unity, C#如何让卡片出现在屏幕上 - Unity、C#
【发布时间】:2017-06-09 04:17:52
【问题描述】:

我正在开发一款纸牌游戏,但无法让纸牌出现在屏幕上。有谁知道我怎样才能让它们出现在屏幕底部,每张卡之间有间隙?这个想法类似于纸牌,当你点击一张卡片时,它会移动到其他卡片上方并显示所有统计数据。

我的玩家管理器代码:

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 张牌。 CardDraw 函数通过单击 UI 按钮触发。谁能告诉我如何让卡片出现在屏幕上?我在项目文件中有卡片艺术。任何帮助是极大的赞赏。我还在 Unity 论坛上发布了这个: https://forum.unity3d.com/threads/making-cards-appear-on-screen.475335/

【问题讨论】:

  • 您是否正在为根据手牌数量定位牌而苦恼?或者更多关于如何在屏幕上显示精灵?或者也许如何在世界空间中获得卡片的正确位置?
  • 我正在努力解决这一切。我什至不知道如何开始。

标签: c# unity3d


【解决方案1】:

我会先向你解释如何让单张卡片显示在屏幕底部。

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

我会怎么做是计算您想要卡片的屏幕位置,因为您的要求是它们位于屏幕底部。

您可以使用 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。

在此示例中,您只有 1 个预制件。为了实现您的游戏,您可能需要为每种类型的卡片设置一个预制件,或者您希望拥有 1 个预制件并换掉我上面评论过的精灵。

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

我不会详细介绍,但您的经销商脚本中很可能有 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.
    }
}

我希望这能让你走上正轨。

从这里开始,您需要单独研究卡片动画和鼠标移动。

【讨论】:

猜你喜欢
  • 2022-01-20
  • 2015-05-31
  • 2023-03-22
  • 1970-01-01
  • 2022-01-05
  • 1970-01-01
  • 1970-01-01
  • 2022-01-12
  • 1970-01-01
相关资源
最近更新 更多