在 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.

更新:这里的问题是您正在使用 transformSprite 渲染器实例化 GameObjectsCanvas UI 最后渲染,遍及所有网格层,因此如果您希望新实例化的 GameObjects 参与其中,它们将需要 RectTransformImage组件代替。

您的代码看起来不错,可能是与附加此脚本的游戏对象相关的问题(因为您在实例化中传递 transform.position)。它可能会将实例化游戏对象定位在 canvas 之外。一旦它可能起作用就这样尝试。

intro = Instantiate (Resources.Load ("intro")) as GameObject;

并且在设置它的父级之后(非常重要),设置它的位置像这样

intro.transform.localPosition = new vector3(0,0,0);