2017-06-09 6 views
0

Ich arbeite an einem Kartenspiel, und ich habe Probleme damit, Karten auf dem Bildschirm erscheinen zu lassen. Weiß jemand, wie ich sie am unteren Rand des Bildschirms mit einer Lücke zwischen den einzelnen Karten erscheinen lassen kann? Die Idee ähnelt Solitaire, und wenn Sie auf eine Karte klicken, bewegt sie sich über die anderen Karten mit allen angezeigten Statistiken.Wie man Karten auf dem Bildschirm erscheinen lässt - Unity, C#

Mein Spieler-Manager Code:

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++; 
    } 
} 
} 

Es behandelt die Spieler Deck schaffen und zeichnen die ersten 5 Karten. Die CardDraw-Funktion wird durch Klicken auf eine UI-Schaltfläche ausgelöst. Kann mir vielleicht jemand sagen, wie die Karten auf dem Bildschirm erscheinen? Ich habe die Karte in den Projektdateien. Jede Hilfe wird sehr geschätzt. Ich postete das auch in den Unity-Foren: https://forum.unity3d.com/threads/making-cards-appear-on-screen.475335/

+0

Kämpfen Sie mit der Positionierung der Kartenbasis auf der Anzahl der Karten in der Hand? Oder mehr, wie man das Sprite auf dem Bildschirm bekommt? Oder vielleicht, wie man den korrekten Standort für die Karte im Weltraum erhält? – Reasurria

+0

Ich kämpfe mit allem. Ich habe keine Ahnung, wie ich überhaupt anfangen soll. –

Antwort

0

Ich werde Ihnen erklären, wie Sie eine einzelne Karte zuerst am unteren Rand des Bildschirms angezeigt bekommen.

Der schwierigste Teil für Sie wäre wahrscheinlich, die Weltposition zu berechnen, wo Sie Ihre Sprites setzen müssen (ich nehme an, Sie haben Sprites für Ihre Karten).

Wie würde ich gehen, um die SCREEN-Position zu berechnen, wo Sie Ihre Karten wollen, da Ihre Anforderung für sie am unteren Rand des Bildschirms sein soll.

Sie können Screen.width verwenden, um die Breite Ihres Bildschirms zu erhalten. Die Höhe spielt keine Rolle, da wir die Karten auf Null Höhe platzieren wollen, was der untere Rand des Bildschirms ist.

wird unten in der Mitte des Bildschirms im Bildraum

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

sein

Sie können die unten in der Mitte des Bildschirms im Welt-Raum erhalten, indem Sie den folgenden Code:

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

Die Der schnellste Weg, um zu sehen, ob das funktioniert, ist das Einrichten deiner Sprites. Standardmäßig sollte der Sprite-Anker genau in der Mitte der Karte sein, was für den Moment in Ordnung ist.

Erstellen Sie ein Prefab für Ihre Karte. Um die Tests zu vereinfachen, richten wir ein CardDealerUi Skript ein.

Um dies zu testen, einfach einige grundlegende Tastatureingabe und OnCardDrawn mit jedem Card-Objekt aufrufen.

In diesem Beispiel hatten Sie nur 1 Fertigteil. Damit Sie Ihr Spiel realisieren können, möchten Sie vielleicht ein Prefab für jede Art von Karte einrichten, oder Sie möchten 1 Prefab haben und die Sprites austauschen, wo ich oben kommentiert habe.

Bis jetzt sollten Sie eine Karte auf dem Bildschirm haben. Jetzt ist das Problem, wo man die zweite und dritte und vierte Karte und so weiter legt. Dies erfordert etwas Mathe, um es zu bekommen, wie Sie wollen.

Ich werde nicht ins Detail gehen, aber Sie würden wahrscheinlich 2 Konstanten in Ihrem Händler-Skript haben. float CardWidth und float CardGap.

Wenn Sie 5 Karten austeilen, möchten Sie wahrscheinlich die Gesamtbreite aller Karten einschließlich der Lücken berechnen. Das ist var totalWidth = numCards * CardWidth + (numCards - 1) * CardGap.Dann versetzt die von der botCenterWorldSpace würde wie etwas geworden:

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

Gerade falls Sie gefragt, wo dieser Code gehört, haben Sie eine neue Funktion in Ihnen CardDealerUi. So etwas wie dieses:

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

Ich hoffe, dass Sie auf dem richtigen Weg bekommen können.

Von hier aus benötigen Sie separate Forschung über die Animation der Karten und bewegen sie mit der Maus über.

+1

Das gesagt wird, siehe https://meta.stackoverflow.com/questions/284236/why-is-can-someone-help-me-not-an-actual-question – Reasurria

Verwandte Themen