在 canvas 中实例化的游戏对象显示在其他 canvas 项目后面
Gameobject instantiated in canvas shows up behind other canvas items
在我的游戏中,如果玩家是第一次玩游戏,那么我会显示一张图片。我像这样在 canvas 中实例化它:
if (PlayerPrefs.GetInt("First Time", 1) == 1)
{
introEnabled = true;
//pause all activity
pause.pauseOrResume();
intro = Instantiate (Resources.Load ("intro"), transform.position, Quaternion.identity) as GameObject;
Canvas canvas = GameObject.Find("Canvas").GetComponent<Canvas>();
intro.transform.SetParent(canvas.transform, false);
//robot = Instantiate (Resources.Load ("robot"), transform.position, Quaternion.identity) as GameObject;
PlayerPrefs.SetInt("First Time", 0);
PlayerPrefs.Save();
}
当游戏 运行 时,我可以在检查器中看到创建对象时,它确实显示在 canvas 中。我只是不知道为什么它不会出现在 canvas 中所有其他对象的顶部。
canvas 渲染模式设置为 "Screen space - Overlay" 并且在排序顺序中设置为 0。正在实例化的游戏对象的排序顺序也为 0,并且在默认层中。
我试过的都没有用。 z 值没有区别,甚至将 canvas 和实例化对象放在默认层中,并将 canvas 设置为 2 的排序顺序,将实例化对象设置为 1 的排序顺序(因此它首先呈现)没有区别。
将默认层 更改为 UI。
你想要的是使用 transform.SetAsLastSibling()
。 CanvasRenderer
根据其兄弟索引(在层次结构中的位置)从上到下按顺序呈现 GameObject
。
但是,在进一步检查您的代码后,我注意到了一些事情,我应该说,如果您正在尝试实例化介绍屏幕,我强烈建议用它自己的实例化它 Canvas
,而不是将其作为父级到现有的。重要的东西应该有自己的专用 Canvas
.
更新:这里的问题是您正在使用 transform
和 Sprite
渲染器实例化 GameObjects
。 Canvas
UI 最后渲染,遍及所有网格层,因此如果您希望新实例化的 GameObjects
参与其中,它们将需要 RectTransform
和 Image
组件代替。
您的代码看起来不错,可能是与附加此脚本的游戏对象相关的问题(因为您在实例化中传递 transform.position)。它可能会将实例化游戏对象定位在 canvas 之外。一旦它可能起作用就这样尝试。
intro = Instantiate (Resources.Load ("intro")) as GameObject;
并且在设置它的父级之后(非常重要),设置它的位置像这样
intro.transform.localPosition = new vector3(0,0,0);
在我的游戏中,如果玩家是第一次玩游戏,那么我会显示一张图片。我像这样在 canvas 中实例化它:
if (PlayerPrefs.GetInt("First Time", 1) == 1)
{
introEnabled = true;
//pause all activity
pause.pauseOrResume();
intro = Instantiate (Resources.Load ("intro"), transform.position, Quaternion.identity) as GameObject;
Canvas canvas = GameObject.Find("Canvas").GetComponent<Canvas>();
intro.transform.SetParent(canvas.transform, false);
//robot = Instantiate (Resources.Load ("robot"), transform.position, Quaternion.identity) as GameObject;
PlayerPrefs.SetInt("First Time", 0);
PlayerPrefs.Save();
}
当游戏 运行 时,我可以在检查器中看到创建对象时,它确实显示在 canvas 中。我只是不知道为什么它不会出现在 canvas 中所有其他对象的顶部。
canvas 渲染模式设置为 "Screen space - Overlay" 并且在排序顺序中设置为 0。正在实例化的游戏对象的排序顺序也为 0,并且在默认层中。
我试过的都没有用。 z 值没有区别,甚至将 canvas 和实例化对象放在默认层中,并将 canvas 设置为 2 的排序顺序,将实例化对象设置为 1 的排序顺序(因此它首先呈现)没有区别。
将默认层 更改为 UI。
你想要的是使用 transform.SetAsLastSibling()
。 CanvasRenderer
根据其兄弟索引(在层次结构中的位置)从上到下按顺序呈现 GameObject
。
但是,在进一步检查您的代码后,我注意到了一些事情,我应该说,如果您正在尝试实例化介绍屏幕,我强烈建议用它自己的实例化它 Canvas
,而不是将其作为父级到现有的。重要的东西应该有自己的专用 Canvas
.
更新:这里的问题是您正在使用 transform
和 Sprite
渲染器实例化 GameObjects
。 Canvas
UI 最后渲染,遍及所有网格层,因此如果您希望新实例化的 GameObjects
参与其中,它们将需要 RectTransform
和 Image
组件代替。
您的代码看起来不错,可能是与附加此脚本的游戏对象相关的问题(因为您在实例化中传递 transform.position)。它可能会将实例化游戏对象定位在 canvas 之外。一旦它可能起作用就这样尝试。
intro = Instantiate (Resources.Load ("intro")) as GameObject;
并且在设置它的父级之后(非常重要),设置它的位置像这样
intro.transform.localPosition = new vector3(0,0,0);