Unity 5: как масштабировать и переводить объект из разметки сетки в центр экрана - PullRequest
0 голосов
/ 10 мая 2018

Я пытаюсь создать вид сетки прокрутки, в котором каждый объект ячейки доступен. При касании объекта ячейки я хочу масштабировать и перемещать его к центру экрана и отображать его над другими ячейками. Я был в состоянии сделать это записываемым и масштабировать это в его положении. Теперь я хочу переместить объект ячейки в центр экрана и отобразить его над другими ячейками. Я перепробовал много решений, но ни одно из них не работает.

Это моя иерархия:

enter image description here

Это сетка в нормальном состоянии:

enter image description here

Это сетка, когда ячейка была нажата:

enter image description here

Я динамически заполняю сетку из скрипта C #.

void Populate()
{
    GameObject cardContainerInstance, cardInstance;

    foreach (var c in cardsCollection.GetAll())
    {
        if (c.IsOwned)
        {
            cardContainerInstance = Instantiate(cardContainer, transform);
            cardInstance = cardContainerInstance.transform.Find("Card").gameObject;

            var cardManager = cardInstance.GetComponent<CardManager>();
            cardManager.card = c;
            cardManager.AddListener(this);
        }
        else
        {
            Instantiate(cardSlot, transform);
        }
    }

}

public void OnCardClick(GameObject cardObject, Card card)
{
    Debug.Log("OnCardClick " + card.name);

    if (openedCard != null) {
        if (openedCard.Number == card.Number)
        {
            CloseCard(openedCardObject);
        }
        else
        {
            CloseCard(openedCardObject);
            OpenCard(cardObject, card);
        }
    }
    else
    {
        OpenCard(cardObject, card);
    }
}

void OpenCard(GameObject cardObject, Card card)
{
    //cardObject.GetComponent<Canvas>().sortingOrder = 1;

    var animator = cardObject.GetComponent<Animator>();
    animator.SetTrigger("Open");

    openedCard = card;
    openedCardObject = cardObject;
}

void CloseCard(GameObject cardObject)
{
    var animator = cardObject.GetComponent<Animator>();
    animator.SetTrigger("Close");

    openedCard = null;
    openedCardObject = null;
}

Я не могу понять, как переместить ячейку в центр и сделать ее выше других.

Обратите внимание, что все анимируется с помощью аниматора, прикрепленного к самому объекту.

Может ли кто-нибудь помочь мне, пожалуйста? Большое спасибо!

РЕДАКТИРОВАТЬ: подробнее

Все объекты ячейки имеют следующую иерархию:

enter image description here

где:

  • CardContainer - пустой объект, добавленный для использования аниматора в дочернем объекте Card
  • Карточка - это сам объект, который имеет сценарий, средство визуализации холста и аниматор
  • StatsImage - это объект, который выдвигается при нажатии карты
  • Изображение является классическим UIImage со сценарием Image, сценарием Shadow и рендером Canvas
  • Другим компонентом являются простые тексты.

РЕДАКТИРОВАТЬ: исправление в процессе

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

enter image description here

Это CardContainer во время выполнения (обратите внимание, что я присоединяю новые Canvas и GraphicsRaycaster к CardContainer, который является «корневым» элементом):

enter image description here

Ответы [ 2 ]

0 голосов
/ 12 мая 2018

Хорошо, так что все довольно просто.Таким образом, вы захотите добавить еще один компонент canvas к игровому объекту и проверить переопределение сортировки на true.Затем используйте

cardObject.GetComponent<Canvas>().sortingOrder = 1;

, чтобы поместить его спереди, и

cardObject.GetComponent<Canvas>().sortingOrder = 0;

, чтобы поставить его сзади.

вам также понадобится установить GraphicsRaycasterна каждом из объектов карты

Не обращайте внимания на мой другой ответ о средствах отображения спрайтов, они здесь не нужны

0 голосов
/ 11 мая 2018

Вы не уточнили, используете ли вы рендерер спрайтов или какой-либо другой метод, но вот ответ для каждого.

Рендерер спрайтов:

этопростой.В каждом рендере спрайта есть переменная «sortingOrder» в скрипте и «Order in layer» в инспекторе.sprite рендеринг с сортировкой Приказы, которые выше, отображаются в первую очередь.Все, что вам нужно сделать, это позвонить:

cardObject.GetComponent<SpriteRenderer>().sortingOrder = 1;

при нажатии на карту и

cardObject.GetComponent<SpriteRenderer>().sortingOrder = 0;

при ее снятии.Я надеюсь, что это имеет смысл!

Другой метод:

Этот способ немного сложнее, и я бы посоветовал вам переключиться на рендеры спрайтов, и это будет намного проще иболее стабильный в будущем, но я могу понять, если вы уже написали много скриптов и не хотите возвращаться и менять их.В любом случае, все, что вам нужно сделать, это создать два слоя: cardLower и cardUpper.затем создайте новую камеру и назовите ее topCamera.Теперь под объектом верхней камеры в Инспекторе измените маску отбраковки (она находится около верхней части) и убедитесь, что выбран cardUpper.затем измените флажки «Очистить» (первый) на «Не очищать», наконец, измените глубину на 0 (если это не сработает, измените ее на -2).Теперь объекты в cardUpper всегда будут отображаться выше всего остального.Вы можете изменить слой через скрипт с помощью

cardObject.layer = "cardUpper"

или

cardObject.layer = "cardLower"

Надеюсь, это поможет!

...