Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 无法更改Canvas.overrideSorting属性_C#_Unity3d_Unity Ui - Fatal编程技术网

C# 无法更改Canvas.overrideSorting属性

C# 无法更改Canvas.overrideSorting属性,c#,unity3d,unity-ui,C#,Unity3d,Unity Ui,非常奇怪的问题,我有一个Canvas对象,我正在尝试将overrideSorting标志设置为true public void SetSortingLevel(string sortinglayerName) { _canvas.overrideSorting = true; _canvas.sortingLayerName = sortinglayerName; } 但是,通常情况下这是可行的,但是如果我放置一个断点并查看代码,即使在将覆盖设置为true之后,它也是false

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

public void SetSortingLevel(string sortinglayerName)
{
    _canvas.overrideSorting = true;
    _canvas.sortingLayerName = sortinglayerName;
}
但是,通常情况下这是可行的,但是如果我放置一个断点并查看代码,即使在将覆盖设置为true之后,它也是false:

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

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

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


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

这是故意的。只能更改嵌套画布上Canvas.overrideSorting的值

例如,如果您的画布是其他画布或UI对象的根,则无法更改Canvas.overrideSorting的值

如果有任何画布是其他画布的子画布,则可以更改Canvas.overrideSorting的值

更改Canvas.overrideSorting的要求:

1.画布是其他画布的子级

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

“在层次结构中处于活动状态”表示您要更改其Canvas.overrideSorting的画布的所有父画布游戏对象必须处于活动状态,并且必须启用画布脚本本身。这可以通过gameObject.activeInHierarchy属性进行验证

如果Canvas.gameObject.activeInHierarchy不为true,则无法设置或更改Canvas.overrideSorting属性。最好在尝试更改Canvas.overrideSorting之前检查这些属性


这是故意的。只能更改嵌套画布上Canvas.overrideSorting的值

例如,如果您的画布是其他画布或UI对象的根,则无法更改Canvas.overrideSorting的值

如果有任何画布是其他画布的子画布,则可以更改Canvas.overrideSorting的值

更改Canvas.overrideSorting的要求:

1.画布是其他画布的子级

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

“在层次结构中处于活动状态”表示您要更改其Canvas.overrideSorting的画布的所有父画布游戏对象必须处于活动状态,并且必须启用画布脚本本身。这可以通过gameObject.activeInHierarchy属性进行验证

如果Canvas.gameObject.activeInHierarchy不为true,则无法设置或更改Canvas.overrideSorting属性。最好在尝试更改Canvas.overrideSorting之前检查这些属性


你需要等一帧

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

private IEnumerator OneFrame(Action callback)
{
    yield return null;
    callback();
}

你需要等一帧

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

private IEnumerator OneFrame(Action callback)
{
    yield return null;
    callback();
}

是的,我在我的例子中没有说清楚,但这是一个嵌套的画布。这很好。在评论之前的编辑中看到我的编辑。所有的优点,但他们很好。我基本上是在讨好一些预置,将它们添加到具有父画布的父画布中,并尝试设置它们的覆盖。如果我进入inspector并手动设置它可以使用的标志,那么它在代码中就不起作用了。如果您可以在编辑器中手动设置它们,这并不重要。我在回答中所说的适用于您正在使用的代码。我注意到了一个错误!我的答案有误,也没有添加启用检查。检查&u canvas.gameObject.activeInHierarchy&&u canvas.enabled是否为true。如果这不是真的,那就行不通了。我已经证实了这一点。只需使用if&u canvas.gameObject.activeInHierarchy&&u canvas.enabled进行验证。让我知道。他们只需要更新他们的文档来说明我的答案。它不会抛出错误。我想他们在更改属性之前会在本机端对这两个进行一些检查。有时,我没有更新文档是的,我在示例中没有明确说明,但这是一个嵌套的画布。这很好。在评论之前的编辑中看到我的编辑。所有的优点,但他们很好。我基本上是在讨好一些预置,将它们添加到具有父画布的父画布中,并尝试设置它们的覆盖。如果我进入inspector并手动设置它可以使用的标志,那么它在代码中就不起作用了。如果您可以在编辑器中手动设置它们,这并不重要。我在回答中所说的适用于您正在使用的代码。我注意到了一个错误!我的答案有误,也没有添加启用检查。检查&u canvas.gameObject.activeInHierarchy&&u canvas.enabled是否为true。如果这不是真的,那就行不通了。我已经证实了这一点。只需使用if&u canvas.gameObject.activeInHierarchy&&u canvas.enabled进行验证。让我知道。他们只需要更新他们的 医生说我的答案是什么。它不会抛出错误。我想他们在更改属性之前会在本机端对这两个进行一些检查。有时,我会发现我不是最新的