无法更改 Canvas.overrideSorting 属性

Cannot change Canvas.overrideSorting property

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

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

然而,通常这是有效的,但是如果我放置一个断点并查看代码,即使在将覆盖设置为 true 之后,它也是 false:

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

我以前用过这个代码,它正常工作。

注意:这是一个嵌套的canvas所以应该允许它设置排序层。

回答:正如下面的回答所指出的,activeInHierarchy 检查结果是错误的。

这是设计使然。您只能在嵌套的 canvas 上更改 Canvas.overrideSorting 的值。

例如,如果您有一个 Canvas 是其他 canvas 或 UI Objects 的根,您将无法更改其值Canvas.overrideSorting.

如果您有 任何 Canvas ,这是其他 Canvas 的 child,您将能够更改 Canvas.overrideSorting.

的值

变更要求Canvas.overrideSorting:

1.Canvas 这是其他 Canvas[=30 的 child =]

  • Canvas//不能改变
    • Canvas //可以改
      • Canvas //可以改

2。GameObject 必须在层次结构中处于活动状态,并且必须启用 Canvas 组件才能更改 Canvas.overrideSorting

Active in hierarchy 意味着 all parent Canvas 您要更改 Canvas 的 GameObject 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();
}