2014-03-06 42 views
2

我有2層:GUI層和3D層。每層都有一個攝像頭。可以將GUI.DrawTexture等GUI元素分配給特定圖層嗎?

GUI層的相機設置:

  • 透明標誌:深度僅
  • 剔除面膜:GUI層
  • 深度:-1
  • 組件:一個C#腳本OnGUI()邏輯
  • GUILayer ,耀斑層&音頻監聽器:開啓

3D圖層的相機設置:

  • 透明標誌:深度僅
  • 剔除面膜:一切,但GUI層
  • 深度:0
  • GUILayer,火炬層&音頻監聽器:關

我的目標是顯示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;不改變這種狀況。

回答

4

沒有辦法在3D對象後面繪製GUI元素 - 除非您使用渲染紋理! 使用特殊的相機作爲GUI元素前面想要的3D對象,將此相機設置爲渲染到紋理,並在其他人面前繪製該紋理。

要渲染到紋理,請單擊相機並在Inspector上查看其設置;將會有一個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紋理。

+0

你可以有「渲染到紋理」的代碼示例? – Raptor

+0

我更新了我的答案,您實際上不需要任何代碼 - 只需在相機設置中使用該功能即可。 – Roberto

+0

如果我有一個複雜的紋理(多個'GUITexture'),有些計劃成爲按鈕(有擊中測試等)?此外,我目前需要腳本才能將其縮放到不同的屏幕尺寸(我正在使用移動設備) – Raptor

0

要在特定層繪製GUITexture,說「GUI層」在以下情況下,可以使用以下命令:

void Start() { 
    GameObject go = new GameObject(); 
    Rect r = new Rect(0, 0, 100, 100); // the size 
    go.AddComponent(new GUITexture().GetType()); 
    go.guiTexture.pixelInset = r; 
    go.guiTexture.texture = (Texture2D)Resources.Load("graphics_name"); // must be placed in Assets/Textures/UI/Resources 
    go.layer = LayerMask.NameToLayer("GUI Layer"); 
    go.transform.position = new Vector3(0, 0, 24); 
    go.transform.localScale = new Vector3(0, 0, 1); 
    go.name = "some name"; 
} 

通過設置相機深度控制層的順序,每個相機繪製不同的圖層併合適剔除掩模配置。

+0

這不回答如何在GUI元素前面繪製3d對象,也不知道如何正確處理點擊它們。 – Roberto

+0

問題的相機設置已經實現在GUI元素前面繪製3D對象。 – Raptor

0

你可以有一個三維物體在你GUITexture,這樣做,你只需要調用渲染相機的方法要上頂:

public Camera GUIcamera; 
void OnGUI() { 
    // Do your normal GUI stuff here, GUI.DrawTexture or whatever 
    GUIcamera.Render(); 
} 

當然你需要有GUIcamera正確配置:

  • 深度比主攝像頭
  • 透明標誌應該是「深度只有」
  • 剔除遮罩應該只是要放在頂層的對象所在的圖層。
相關問題