【问题标题】:Gameobject instantiated in canvas shows up behind other canvas items在画布中实例化的游戏对象显示在其他画布项目后面
【发布时间】:2015-08-16 17:04:11
【问题描述】:

在我的游戏中,如果这是玩家第一次玩游戏,那么我会显示一个图像。我像这样在画布中实例化它:

    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();
    }

我可以在游戏运行时在检查器中看到,当创建对象时,它确实显示在画布中。我只是不知道为什么它不会出现在画布中所有其他对象的顶部。

画布渲染模式设置为“屏幕空间-叠加”,排序顺序设置为0。被实例化的游戏对象的排序顺序也为 0,并且位于默认层中。

我尝试过的任何方法都没有奏效。 z 值没有任何区别,甚至将画布和实例化对象放在默认图层中并将画布设置为 2 的排序顺序,将实例化对象设置为 1 的排序顺序(因此它首先呈现)不会产生区别。

【问题讨论】:

    标签: c# unity3d perspectivecamera gameobject


    【解决方案1】:

    你想要的是使用 transform.SetAsLastSibling()CanvasRenderer 根据同级索引(层次结构中的位置)从上到下依次呈现GameObject

    但是,在进一步检查您的代码之后,我注意到了一些事情,我应该说,如果您尝试实例化介绍屏幕,我强烈建议使用它自己的 Canvas 实例化它,而不是将其作为现有的父级.重要的东西应该有它自己的专用Canvas

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

    【讨论】:

    • 在分别尝试将 transform.SetAsLastSibling() 添加到画布和新实例化的游戏对象后,新实例化的游戏对象仍显示在旧画布项目后面。
    • 他们有RectTransforms?还有Image 组件?
    • 新实例化的游戏对象有一个变换和一个精灵渲染器。这就对了。这是我正在实例化的预制件。
    • 这就是问题所在。
    • 什么是?我需要改变什么?
    【解决方案2】:

    代替默认图层将其图层更改为 UI。

    【讨论】:

    • 适合哪一个?画布还是新实例化的对象?
    • 画布和游戏对象都应该在ui层中。
    • 我试了一下,它什么也没做。我不知道这将如何做任何事情,因为如果默认情况下它们都在默认层中并且它们不能正常工作,那么将它们放在另一个层中不会有任何区别。
    • 我认为它们可能在不同的层中。
    【解决方案3】:

    您的代码看起来不错,这可能与附加此脚本的游戏对象有关(因为您在 Instantiate 中传递了 transform.position)。它可能将实例化的游戏对象定位在画布之外。尝试这样,一旦它可能有效。

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

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

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

    【讨论】:

    • 我尝试了你所说的一切,但没有任何区别。它仍然显示在其他画布对象的后面。
    猜你喜欢
    • 2023-03-07
    • 2012-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多