无法更改Canvas.overrideSorting属性

时间:2018-08-24 20:24:47

标签: c# unity3d unity-ui

一个非常奇怪的问题,我有一个Canvas对象,并且我试图将overrideSorting标志设置为true。

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

但是,通常这是可行的,但是,即使我设置了一个断点并查看代码,即使将覆盖率设置为true后,它也是错误的:

enter image description here

api显示这只是一个setter / getter。知道为什么会这样吗?

我以前使用过此代码,并且可以正常工作。

注意:这是一个嵌套的画布,因此应允许其设置其排序层。

答案:如下面的答案所述,activeInHierarchy检查结果是错误的。

2 个答案:

答案 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();
}