【问题标题】:Cannot change Canvas.overrideSorting property无法更改 Canvas.overrideSorting 属性
【发布时间】:2019-01-31 08:04:24
【问题描述】:

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

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

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

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

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

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

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

【问题讨论】:

    标签: c# unity3d unity-ui


    【解决方案1】:

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

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

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

    更改Canvas.overrideSorting的要求:

    1.Canvas是其他Canvas的孩子

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

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

    在层次结构中处于活动状态意味着您要更改其Canvas.overrideSorting 的Canvas 的所有父 Canvas GameObject 必须处于活动状态,并且必须启用 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");
    

    【讨论】:

    • 是的,我在示例中没有明确说明,但这是一个嵌套画布。
    • 没关系。在您发表评论之前正在进行编辑。查看我的编辑。
    • 所有优点,但结帐很好。我基本上是在讨好一些预制件,将它们添加到父级(具有父级画布)并尝试设置它们的覆盖。如果我进入检查器并手动设置它工作的标志,它只是在代码中不起作用。
    • 是否可以在编辑器中手动设置它们并不重要。我在答案中所说的适用于您正在使用的代码。我注意到一个!我的回答中有错字,也没有添加启用检查。检查 if (_canvas.gameObject.activeInHierarchy && _canvas.enabled) 是否为 true 。如果这不是真的,它就行不通。我已经验证了这一点。只需使用if (_canvas.gameObject.activeInHierarchy && _canvas.enabled) 进行验证。告诉我。
    • 他们只需要更新他们的文档来说明我的答案。它不会抛出错误。我认为他们在更改该属性之前会在本机端对这两个进行一些检查。有时,我的文档不是最新的
    【解决方案2】:

    您需要等待一帧。

    private void Start()
    {
        Canvas canvas = GetComponent<Canvas>();
        StartCoroutine(OneFrame(() => { canvas.overrideSorting = true; }));
    }
    
    private IEnumerator OneFrame(Action callback)
    {
        yield return null;
        callback();
    }
    

    【讨论】:

      猜你喜欢
      • 2013-03-08
      • 1970-01-01
      • 2022-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多