#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… Я должен был выяснить это, но я действительно ценю вашу помощь, это было именно то поведение, которое я хотел!