gpt4 book ai didi

c# - GUI.DrawTexture 等 GUI 元素可以分配给特定层吗?

转载 作者:行者123 更新时间:2023-11-30 20:50:51 29 4
gpt4 key购买 nike

我有 2 层:GUI 层和 3D 层。每层都有一个摄像头。

GUI层相机设置:

  • 清除标志:仅深度
  • 剔除 mask :GUI 层
  • 深度:-1
  • 组件:具有 OnGUI() 逻辑的 C# 脚本
  • GUILayer、Flare Layer 和 Audio Listener:开启

3D 图层相机设置:

  • 清除标志:仅深度
  • 剔除蒙版:除 GUI 层外的一切
  • 深度:0
  • GUILayer、Flare Layer 和 Audio Listener:关闭

我的目标是显示 3D 元素背后的 GUI 元素。如果删除/禁用 C# 脚本并改用 GUITexture 组件,则设置没问题。然而,通过使用GUITexture组件,很难通过脚本控制大小和逻辑。

因此,我在分配给相机的脚本中通过 GUI.DrawTexture() 绘制了一些图像。例如:

GUI.DrawTexture(new Rect(0, 0, Screen.width, Screen.height), 
backgroundTexture, ScaleMode.StretchToFill);

虽然脚本作为组件附加到GUI层,但它并没有在3D对象后面绘制;相反,它绘制在 3D 对象的前面。

我的问题是,如何分配 GUI.DrawTexture() 在特定图层上绘制/如何使图像绘制在 3D 对象后面?


更新OnGUI() 中尝试了 GUI.Depth = -99; 并没有改变这种情况。

最佳答案

无法在 3D 对象后面绘制 GUI 元素 - 除非您使用渲染纹理!在 GUI 元素的前面为您想要的 3D 对象使用一个特殊的相机,将这个相机设置为渲染到一个纹理,并将这个纹理绘制在其他纹理的前面。

要渲染到纹理,请单击相机并在检查器中查看其设置;将有一个Target Texture,将其分配给一个纹理。相机现在将在此纹理上绘制,您可以使用 GUI.DrawTexture 代码将其绘制在其他纹理之前。

您需要 Unity Pro 才能使用此功能。


要检查这些纹理中的点击,如果您像这样创建可点击的纹理,则可以验证它们:

Rect r = new Rect(x,y,width,height);
GUI.DrawTexture(r, texture);
Input.GetMouseButton(0)
if (r.Contains(Event.current.mousePosition)) DoStuff();

现在的问题是,如果您想在单击 3D 对象时排除单击 3D 对象后面的按钮。这更复杂。

您首先需要检测 3D 对象纹理中的点击(如上面的代码)。

然后,如果 true,您将不得不使用鼠标坐标从 3D 相机(您指定纹理的相机)转换光线(我认为使用 Camera.ViewportPointToRay()Camera.ScreenPointToRay 正确映射坐标,可能)。

最后,如果某些 3D 对象被击中,您只需不检查 UI 纹理即可。

关于c# - GUI.DrawTexture 等 GUI 元素可以分配给特定层吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22213552/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com