Как вывести определенного дочернего элемента на передний план в горизонтальной компоновке в Unity

#c# #unity3d #layout #gameobject

#c# #unity3d #макет #gameobject

Вопрос:

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

Я попытался изменить индекс z и слой, но все карты в руке управляются одним и тем же горизонтальным расположением…

Должен ли я просто нажимать карты с каждой стороны от наведенной? Или у кого-то есть решение нарисовать определенного дочернего элемента перед другими?

Ответ №1:

Что вы можете сделать, так это динамически добавлять новый холст к вашему объекту, который вы хотите разместить впереди, и переопределять сортировку:

введите описание изображения здесь

В коде вы можете сделать что-то вроде этого:

 var newCanvas = yourGameObject.AddComponent<Canvas>();
newCanvas.overrideSorting = true;
newCanvas.sortingOrder = 1; // this has to be higher than order of parent canvas
 

Конечно, вы должны помнить, чтобы удалить этот холст, когда он больше не нужен.

Редактировать: обновил решение полным кодом, который, как я проверил, работает. Чего мне не хватало, так это добавления raycaster к новому холсту. Это полный код:

 public class YourClass : MonoBehaviour, IPointerExitHandler, IPointerEnterHandler
{
    private Canvas tempCanvas;
    private GraphicRaycaster tempRaycaster;

    public void OnPointerEnter(PointerEventData eventData)
    {
        // add and configure necessary components
        tempCanvas = gameObject.AddComponent<Canvas>();
        tempCanvas.overrideSorting = true;
        tempCanvas.sortingOrder = 1;
        tempRaycaster = gameObject.AddComponent<GraphicRaycaster>();
        
        // your operations on the object
        transform.localScale = new Vector2(1.1f, 1.1f);
        // ...
    }

    public void OnPointerExit(PointerEventData eventData)
    {
        // remove components that are not needed anymore
        Destroy(tempRaycaster);
        Destroy(tempCanvas);
        
        // your operations on the object
        transform.localScale = new Vector2(1f, 1f);
        // ...
    }
}
 

Комментарии:

1. Спасибо за ответ, я пытался добавить холст, но, похоже, он удаляет и прерывает любые события указателя, знаете ли вы, правильное ли это поведение? Может быть, я сделал это неправильно? У моих игровых объектов есть несколько событий указателя, которые мне нужно поддерживать активными, например, перетаскивание карты. Я просто хочу, чтобы объект отображался перед другими, которые находятся в том же горизонтальном расположении.

2. Эй, Танги, извини, что не вернулся к тебе раньше. Когда вы добавляете новый холст, вам также необходимо добавить новый raycaster для корректной работы событий. Обновлен ответ, чтобы показать полный код. Надеюсь, это поможет!

3. Да, я немного новичок в Unity и raycast… Я должен был выяснить это, но я действительно ценю вашу помощь, это было именно то поведение, которое я хотел!