使用渲染紋理將另一個場景的內容顯示為紋理
驗證環境
- 窗戶
-
- 視窗 11
- 統一編輯器
-
- 2021.3.3f1
- 輸入系統包
-
- 1.3.0
此提示的先決條件
作為此提示描述的前提,已預先進行了以下設置。
起先
渲染紋理允許您將繪圖寫入紋理而不是螢幕。 這允許您在遊戲執行期間自由生成紋理,而無需提前準備紋理圖像。
您還可以寫入每幀動態更改的渲染紋理,例如,將主攝像機的不同圖像投影到遊戲中存在的顯示器上。
準備映像
使用渲染紋理時,不需要準備圖像,但可以將其準備為示例,以使繪製結果更易於理解。
創建渲染紋理
從專案創建資產。 從“創建”中,選擇“渲染紋理”。
名稱可以是任意的。 由於此時未直接從外部指定 NewRenderTexture
名稱,因此保留為 。
選擇渲染紋理並從檢查器中指定其大小。 由於渲染紋理是繪圖區域,因此必須指定大小。 這次,我想寫一個單獨創建的場景,所以我將縱橫比設置為16:9。
設置渲染紋理目標
從最初創建的場景的層次結構中選擇「UI」>「原始圖像」。 顯示此物件中渲染紋理的內容。 它是UI的一個物件,但你需要的是一個「原始圖像」元件,可以將其設置為另一個物件。
原始圖像已被放置。 因為它是UI物件,所以它被放置在畫布中。 我還沒有設置任何東西,所以我只得到一個白色矩形。
我們希望比例彼此相等,因此我們將RawImage物件的大小設置為與渲染紋理相同。 如果保持縱橫比不變,即使更改大小也只會縮放繪製結果,但如果更改縱橫比,則繪製結果將垂直或水平壓碎。
RawImage 物件的原始圖像元件具有「紋理」,因此請在此處設置剛剛創建的渲染紋理。 渲染紋理的內容仍然是空的,因此它們在視圖中是透明的。
創建渲染紋理繪圖內容的場景
接下來,創建一個新場景以創建要在渲染紋理中繪製的內容。 從功能表中選擇檔,然後選擇新建場景。
由於此示例是 2D,因此您還將選擇 2D 場景。
在場景資料夾中創建它。 SampleSceneTexture
將名稱保留為 。
創建場景后,適當地放置物件。 您所要做的就是確保您知道渲染紋理的內容。 為了確認沒有繪製任何突出在相機外部的東西,還會在相機框架附近放置一個精靈。
如果物件重疊,則物件的上下文將是不確定的,因此如果您有背景,請降低背景圖層的順序。
選擇「主相機」后,在「目標紋理」中設置渲染紋理。 這會導致在渲染紋理中繪製繪圖。
刪除設置為「主攝像機」的「音頻偵聽器」元件。 渲染紋理所需的只是繪圖,因此不需要音訊偵聽器。 如果在運行時有多個「音訊偵聽器」 ,將顯示警告。
順便說一下,如果在此狀態下運行渲染紋理的場景,螢幕上不會顯示任何內容。 這是因為您是在渲染紋理上繪製的。 如果要在螢幕上檢查它,請刪除「目標紋理」,然後執行它。
層次設置
在此範例中,您必須同時移動兩個場景,但如果按原樣移動它們,則要在渲染紋理中繪製的內容也將顯示在主螢幕上,因此不會單獨繪製圖層。
首先,從編輯器右上角的圖層中選擇“編輯圖層”。
名稱和位置是任意的,但在這裡我們將添加一個名為 RenderTarget
.
添加圖層后,打開渲染紋理的場景,選擇要繪製的所有物件,然後將圖層值更改為剛剛創建的 RenderTarget
圖層值。
SampleSceneTexture
這將結束場景的編輯,因此請保存它。
顯示渲染紋理
SampleScene
打開場景后,通過拖放場景將其添加到層次結構 SampleSceneTexture
中。
然後,層次結構中應該有兩個場景,並且場景的內容應該顯示在 SampleSceneTexture
螢幕上。
SampleSceneTexture
場景的內容令人不安,因此請按兩下層次結構中場景 SampleSceneTexture
的眼睛圖示。
SampleSceneTexture
這將隱藏場景中的對象,並且僅顯示場景 SampleScene
的內容。
順便說一下,由於所有渲染紋理設置都已完成,SampleScene
因此渲染紋理的內容應顯示在場景中放置的原始圖像中。
但是,眼睛圖示隱藏只是一個設置,使其在編輯器上不可見,因此如果您按原樣運行SampleSceneTexture
遊戲,場景的內容也會顯示在螢幕上。
SampleScene
然後選擇場景Main Camera
並取消選中RenderTarget
檢查器中的Camera
剔除蒙版。
這可以防止在遊戲運行時顯示RenderTarget
圖層中的物件。
嘗試運行遊戲。 它應該按預期顯示。
嘗試移動渲染紋理
但是,在這種狀態下,很難知道它是否真的用作渲染紋理或只是將圖像顯示為裁剪,因此讓我們移動它。
內容可以是任何東西,但在這裡我們將設置移動以自動旋轉精靈。 建立一個 SelfRotate
文稿並將建立為 .
在這裡,我們將包括一個一點一點地旋轉自己的簡單過程。
using UnityEngine;
public class SelfRotate : MonoBehaviour
{
// 更新はフレームごとに 1 回呼び出されます
void Update()
{
transform.Rotate(0, 0, 0.1f);
}
}
創建文稿后,將越來越多的內容附加到要旋轉的物件。
然後運行遊戲,看看它是否旋轉。 我想你可以看到對象在渲染紋理中移動。
如何同時移動多個場景
在這裡,我們創建了一個簡單的例子,以便我們從一開始就運行兩個場景,但在真正的遊戲中,在許多情況下,您必須從單個場景開始。 在這種情況下,我認為您必須在場景開始時動態添加場景以使其成為多個場景。
有關如何添加場景的說明,請參閱“添加場景”。
基本上, SceneManager.LoadScene("<シーン名>", LoadSceneMode.Additive);
呼叫應該可以解決大部分問題。
如何在不使用圖層的情況下防止渲染紋理的內容顯示在主螢幕上
渲染紋理的內容顯示在主螢幕上,因為主場景和渲染紋理場景位於同一位置。 因此,如果將渲染紋理的內容移動到主場景中從未顯示的位置,則它將不會顯示在主螢幕上。 例如,可以將渲染紋理物件或攝像機移動到 (-10000, -10000) 位置。 這樣,圖層設置就沒有必要了。
當您想要在一個場景中完成渲染紋理的內容而不將其劃分為不同的場景時
這是使用與沒有層的先前方法相同的技術完成的。 您可以將渲染紋理顯示的內容移動到主攝像機上永遠不會顯示的內容。 與分離場景的方法不同的是,您需要放置兩個攝像機,但除此之外,您將基本上具有與分離場景的方法相同的設置。
如果要將 3D 遊戲中從不同角度捕獲的內容捕獲為渲染紋理
這個技巧沒有過多地談論3D,因為它專注於2D,但方法基本相同。 由於您是從多個視角投影單個 3D 空間,因此不需要有兩個以上的場景。 您所要做的就是根據需要放置任意數量的攝像機,將繪製目標設置為渲染紋理,並設置顯示渲染紋理的位置。