一个非常奇怪的问题,我有一个Canvas对象,并且我试图将overrideSorting标志设置为true。
public void SetSortingLevel(string sortinglayerName)
{
_canvas.overrideSorting = true;
_canvas.sortingLayerName = sortinglayerName;
}
但是,通常这是可行的,但是,即使我设置了一个断点并查看代码,即使将覆盖率设置为true后,它也是错误的:
api显示这只是一个setter / getter。知道为什么会这样吗?
我以前使用过此代码,并且可以正常工作。
注意:这是一个嵌套的画布,因此应允许其设置其排序层。
答案:如下面的答案所述,activeInHierarchy检查结果是错误的。
答案 0 :(得分:1)
这是设计使然。您只能在嵌套画布上更改Canvas.overrideSorting
的值。
例如,如果您有一个Canvas
是其他画布或UI对象的根,则将无法更改Canvas.overrideSorting
的值。
如果您有任何个Canvas
(是其他Canvas
的孩子),则可以更改{{1 }}。
更改Canvas.overrideSorting
的要求:
1 。Canvas.overrideSorting
是其他Canvas
2 。GameObject必须在层次结构中处于活动状态,并且必须启用Canvas
组件才能更改Canvas
。
在层次结构中处于活动状态意味着要更改其Canvas.overrideSorting
的{{1}}的父级Canvas GameObject必须全部处于活动状态,并且Canvas
脚本本身必须处于活动状态被启用。可以使用Canvas.overrideSorting
属性进行验证。
如果Canvas
不是 gameObject.activeInHierarchy
,则不能设置或更改Canvas.gameObject.activeInHierarchy
属性。最好在尝试更改true
之前先检查这些属性。
Canvas.overrideSorting
答案 1 :(得分:1)
您需要等待一帧。
private void Start()
{
Canvas canvas = GetComponent<Canvas>();
StartCoroutine(OneFrame(() => { canvas.overrideSorting = true; }));
}
private IEnumerator OneFrame(Action callback)
{
yield return null;
callback();
}