2

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

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

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

在此处输入图像描述

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

我以前使用过这段代码,它通常可以工作。

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

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

4

2 回答 2

7

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

例如,如果您有一个Canvas它是其他画布或 UI 对象的根,您将无法更改Canvas.overrideSorting.

如果您有任何 是otherCanvas 的孩子Canvas,您将能够更改 的值Canvas.overrideSorting

变更要求Canvas.overrideSorting

1 . 这是其他人Canvas 的孩子Canvas

  • 画布 //不能改变
    • 帆布 //可以改变
      • 帆布 //可以改变

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

层次结构中的活动意味着您要更改其的所有父 Canvas GameObject必须处于活动状态,并且必须启用脚本本身。这可以通过属性进行验证。CanvasCanvas.overrideSortingCanvasgameObject.activeInHierarchy

如果Canvas.gameObject.activeInHierarchy不是,则不能设置 或更改该属性。最好在尝试更改之前检查这些属性。trueCanvas.overrideSortingCanvas.overrideSorting

if (_canvas.gameObject.activeInHierarchy && _canvas.enabled)
    _canvas.overrideSorting = true;
else
    Debug.Log("Cannot change Canvas overrideSorting");
于 2018-08-24T20:44:38.730 回答
2

您需要等待一帧。

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

private IEnumerator OneFrame(Action callback)
{
    yield return null;
    callback();
}
于 2019-06-03T19:37:39.673 回答