Не удается изменить свойство 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 // может измениться
- 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();
}