Не удается изменить свойство Canvas.overrideSorting - PullRequest
0 голосов
/ 24 августа 2018

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

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

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

enter image description here

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

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

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

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

Ответы [ 2 ]

0 голосов
/ 03 июня 2019

Вам нужно подождать один кадр.

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

private IEnumerator OneFrame(Action callback)
{
    yield return null;
    callback();
}
0 голосов
/ 24 августа 2018

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

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

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

Требования дляменяется Canvas.overrideSorting:

1 . 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");
...