Как изменить порядок рендеринга выбранного изображения в Unity?

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

Вот мой код:

using UnityEngine;
using UnityEngine.EventSystems;

public class DragAndDrop : MonoBehaviour, IDragHandler, IBeginDragHandler, IEndDragHandler
{
    private RectTransform selfRectTransform;
    private Canvas canvas;
    private int originalSortingOrder;

    private void Start()
    {
        selfRectTransform = GetComponent<RectTransform>();
        canvas = GetComponentInParent<Canvas>();
        originalSortingOrder = canvas.sortingOrder;
    }

    public void OnBeginDrag(PointerEventData eventData)
    {
        // Increase the canvas sorting order to render the object above others
        canvas.sortingOrder++;
    }

    public void OnDrag(PointerEventData eventData)
    {
        selfRectTransform.anchoredPosition += eventData.delta;
    }

    public void OnEndDrag(PointerEventData eventData)
    {
        // Restore the original canvas sorting order
        canvas.sortingOrder = originalSortingOrder;
    }
}

Установка настроек порядка в разделе «Слои» в редакторе.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
107
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Я думаю, что вы на правильном пути, то, что, по моему мнению, отсутствует, возможно, находится внутри вашей функции OnBeginDrag, я думаю, что вместо Canvas.sortingOrder++ вам следует использовать originalSortingOrder + 1, это позволит более точно обработать его.

canvas.sortingOrder = originalSortingOrder + 1;

Я тоже пробовал это, но проблема в том, что он по-прежнему ведет себя так же. Я не знаю, связано ли это с тем, что я не определил порядок в настройках слоев или с чем-то еще, но он ведет себя не так, как ожидалось.

mystheman 12.04.2024 02:31

Просто рекомендация: всякий раз, когда вы имеете дело со слоями, намного лучше иметь некоторую конфигурацию слоев и настройку Canvas, которую можно назначить, создать столько слоев сортировки, сколько вам нужно, и присвоить каждому элементу пользовательского интерфейса слой, дополнительно вы можете проверить настройки порядка и холста

Zevahc 12.04.2024 06:58

Проверьте, правильно ли работает перетаскивание.

  1. Основная камера должна иметь Raycaster.
  2. Холст для работы должен находиться в режиме «Экранное пространство — Наложение».
  3. Перетаскиваемый объект должен иметь коллайдер.
  4. Код должен находиться в объекте изображения.

Не могли бы вы переименовать ссылки на изображения, пожалуйста?

KimKulling 16.04.2024 11:53
Ответ принят как подходящий

Для тех, кто столкнулся с такой же проблемой, я нашел решение следующим образом:

  1. Я создал дубликат родительского элемента перетаскиваемых изображений внутри того же родителя.
  2. Я написал контроллер для родителя, который хранит ссылки на эти два дочерних изображения.
  3. Когда я начал перетаскивание, я деактивировал перетаскиваемый список и открыл другого родителя, чтобы неперетаскиваемые объекты остались такими, какие они есть, и установил active false для перетаскиваемого объекта во втором списке.

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

Другие вопросы по теме