Не удается изменить свойство Canvas.overrideSorting

Очень странная проблема, у меня есть объект Canvas, и я пытаюсь установить для флага overrideSorting значение true.

public void SetSortingLevel(string sortinglayerName)
{
    _canvas.overrideSorting = true;
    _canvas.sortingLayerName = sortinglayerName;
}

Тем не менее, обычно это работает, однако если я поставлю точку останова и посмотрю на код, даже сразу после установки переопределения в true, это ложно:

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

API показывает, что это просто сеттер / геттер. Есть идеи, почему это происходит?

Я использовал этот код раньше, и он обычно работает.

Примечание. Это вложенный холст, поэтому ему следует разрешить установку слоя сортировки.

Ответ: Как отмечено в ответе ниже, проверка activeInHierarchy оказывается ложной.

1 ответ

Решение

Это по замыслу. Вы можете изменить только значение Canvas.overrideSorting на вложенном холсте.

Например, если у вас есть Canvas который является корнем других холстов или объектов пользовательского интерфейса, вы не сможете изменить значение Canvas.overrideSorting,

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

Требования к изменению Canvas.overrideSorting:

1 Canvas который является ребенком другого Canvas

  • Canvas // не может измениться
    • Canvas // может измениться
      • Canvas // может измениться

2. GameObject должен быть активным в иерархии и Canvas компонент должен быть включен для того, чтобы можно было изменить Canvas.overrideSorting,

Активный в иерархии означает, что все родительские объекты Canvas GameObject Canvas Вы хотите изменить его Canvas.overrideSorting должен быть активным и Canvas сам скрипт должен быть включен. Это можно проверить с помощью gameObject.activeInHierarchy имущество.

Если Canvas.gameObject.activeInHierarchy не true Вы не можете установить или изменить Canvas.overrideSorting имущество. Лучше проверить эти свойства, прежде чем пытаться изменить Canvas.overrideSorting,

if (_canvas.gameObject.activeInHierarchy && _canvas.enabled)
    _canvas.overrideSorting = true;
else
    Debug.Log("Cannot change Canvas overrideSorting");

Вам нужно дождаться одного кадра.

private void Start()
{
    Canvas canvas = GetComponent<Canvas>();
    StartCoroutine(OneFrame(() => { canvas.overrideSorting = true; }));
}

private IEnumerator OneFrame(Action callback)
{
    yield return null;
    callback();
}
Другие вопросы по тегам