2017-06-09 3 views
0

カードゲームをしていて、画面にカードを表示するのに問題があります。誰もがどのように私はそれらが各カードの間にギャップを持つ画面の下部に表示することができます知っていますか?アイデアはSolitaireに似たもので、カードをクリックすると、すべての統計情報が表示された他のカードの上に移動します。カードを画面に表示する方法 - Unity、C#

マイプレイヤーマネージャコード:

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

手のカードの枚数に基づいてカードの位置を決めるのに苦労していますか?スプライトを画面に表示する方法は?それとも、世界の空間でカードの正しい場所を取得するには? – Reasurria

+0

私はそれをすべて苦労しています。私はどのように始めるのか分かりません。 –

答えて

0

最初に画面の一番下に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. 
    } 
} 

これをテストするには、基本的なキーボード入力を行い、カードオブジェクトでOnCardDrawnを呼び出します。

この例では、プレハブは1つしかありません。あなたはあなたのゲームを実現するために、あらゆるタイプのカード用にプレハブを設定したいと思うかもしれません。あるいは、私が上でコメントしたスプライトを1つのプレハブと交換したいと思うでしょう。

これまでのところ、1枚のカードを画面に表示する必要があります。今問題は2番目と3番目と4番目のカードなどを置く場所です。これは、あなたが望むようにそれを得るためにいくつかの数学を必要とします。

詳細については触れませんが、ディーラーのスクリプトには2つの定数がある可能性があります。 float CardWidthおよびfloat CardGap

5枚のカードを扱う場合、ギャップを含むすべてのカードの合計幅を計算したいと思うでしょう。つまり、var totalWidth = numCards * CardWidth + (numCards - 1) * CardGapです。あなたはこのコードが属するところ、あなたはあなたCardDealerUiに新しい機能を持つことになります不思議に思っ念の

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

:次にbotCenterWorldSpaceからのオフセットのようなものになるでしょう。このようなもの:

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. 
    } 
} 

私はこれが正しい軌道上であなたを得ることを望みます。

ここから、カードのアニメーション化とマウスオーバーでの移動について、別の調査が必要になります。

+1

言われて、それを参照してくださいhttps://meta.stackoverflow.com/questions/284236/why-is-can-someone-help-me-not-an-actual-question – Reasurria

関連する問題