我正在制作纸牌游戏,而且我在制作卡片时遇到了麻烦。有谁知道如何让它们出现在屏幕的底部,每张卡之间有间隙?这个想法类似于纸牌,当你点击一张牌时,它会移动到其他牌上方并显示所有统计数据。
我的玩家经理代码:
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/
答案 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 CardWidth
和float 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.
}
}
我希望这可以让你走上正轨。
从这里开始,您需要单独研究动画卡片并将其移动到鼠标上。