Как убедиться, что пользователь выбирает верхнюю карту из колоды карт в Unity3D? - PullRequest
0 голосов
/ 20 июня 2019

У меня есть колода карт, которую я поместил в качестве спрайтов в моей игре Unity (каждая карта - как отдельный спрайт).Они расположены в виде беспорядочной стопки ... как я могу убедиться, что верхняя карта в колоде выбрана первой?то есть я не хочу, чтобы пользователь выбирал 5-ю карту вниз, хотя она была бы частично видимой ...

Ответы [ 2 ]

0 голосов
/ 21 июня 2019

Поскольку это игра, я собираюсь предположить, что есть что-то вроде класса Game Manager или Deck Manager, который отслеживает карты на столе в массиве (или списке).Порядок карт должен соответствовать порядку ссылок на карты в массиве, если все операции с картами (тасование и т. Д.) Выполняются в массиве.

Как только это произойдет, вы можете просто добавить функцию прослушивания событий в этот класс, которая вызывается каждый раз, когда пользователь пытается взять любую карту.Если эта карта является последней картой в массиве, то пусть она будет выбрана, иначе нет.

0 голосов
/ 21 июня 2019

Подход, который я бы использовал для решения этой проблемы, состоит в том, чтобы привязать все ваши колоды к одному родительскому игровому объекту, который отлавливает события щелчка (система событий Unity сначала передает листья и, если не находит обработчика на листе, онабудет искать обработчик в родительском объекте, а затем родительский ... у вас есть идея).

Если монобихевиректор, перехватывающий события click для родительского элемента, знает, какая из этих карт находится сверху, он можетзатем активируйте все функции, которые вам нужны на этой карте.

РЕДАКТИРОВАТЬ:

//something along these lines:
using UnityEngine;
using System.Collections.Generic;
public class CardDeckManager : Monobehaviour, IPointerClickHandler
{
    [serializeField]
    private List<GameObject> _cards; // If I were you I'd have a Monobehaviour class "Card" or so, which each card has, then you can replace BoxCollider2D with that and access functionality for cards in the deck from here

    public void OnPointerClick(PointerClickEventData data)
    {
        var topmostCard = _cards[0];
        _cards.RemoveAt(0); // remove the topmost card from the deck
        DoSomethingWith(topmostCard); // and have it played
        // For example move it to the center of the table... and have it affect the game logic
    }

    // assign _cards these in editor, or generate them programmatically
}

Важно: убедитесь, что у вас есть EventSystem и raycaster на камере

...