[Unity 速記] 擷取某一瞬間 Camera 畫面並存為 Texture2D

今天的筆記是從 Unity 官方文件中調出來的資料「輸出 Camera 當前畫面並存為 Texture2D」,可以用在遊戲中的肖像畫、風景或精彩瞬間的靜態拍攝中。

這裡的的程式碼大部分可以直接複製貼上,所以這功能算是可以很輕易達成的。從這篇 Unity 速記開始,我會分成 GameObject、Assets、Property 與 Script 來說明需要注意的地方,並在最後附上作為範例測試用的專案。

姑且說一下,在本篇文章中僅會記錄關鍵步驟,完整的專案結構請從文中提供的原始碼連結來進行參考。

物件 GameObject

Camera 在加上 Render Texture 之後會失去作為主攝影機的功能,所以我們要另外新增一個攝影機作為拍照使用。

852820dae54ed36749f8af8a96960fd8

我將它重新命名為 Render Camera。

資產 Assets

接下來要在 Project 視窗中,也就是 Assets 資料夾下新增一個 Render Texture 作為攝影機渲染輸出使用。Render Texture 除了可以應用在這次的擷圖功能,也可以應用在遊戲小地圖上。

470766cf1226255ed30e019597cfebcf

屬性 Property

點開 Render Camera 物件的 Inspector,將剛才創建的 Render Texture 檔案關聯到 Camera 的 Target Texture 欄位。

5d573401db6f16f924594545adf9d019

記得喬個位置,讓攝影機能看到你想拍的東西。

腳本 Script

最後開啟你在寫的腳本,將這個方法直接複製貼上。之後在適當的時機呼叫 RTImage 並帶入場景中的 Render Camera 即可取得 Texture2D 型別的圖片。

Texture2D RTImage(Camera camera)
{
    // The Render Texture in RenderTexture.active is the one
    // that will be read by ReadPixels.
    var currentRT = RenderTexture.active;
    RenderTexture.active = camera.targetTexture;

    // Render the camera's view.
    camera.Render();

    // Make a new texture and read the active Render Texture into it.
    Texture2D image = new Texture2D(camera.targetTexture.width, camera.targetTexture.height);
    image.ReadPixels(new Rect(0, 0, camera.targetTexture.width, camera.targetTexture.height), 0, 0);
    image.Apply();

    // Replace the original active Render Texture.
    RenderTexture.active = currentRT;
    return image;
}

如果想要顯示出來,可以將回傳的 Texture2D 直接指派給 UI 的 Raw Image。

[SerializeField]
Camera renderCamera;

[SerializeField]
RawImage rawImage;

public void Shot()
{
    rawImage.texture = RTImage(renderCamera);
}

大概效果是這樣:

7b3f09ff7b54ea2c54296b11b15f5963

上圖這個專案放在 GitLab.com/tedliou/camera-shot-sample,撰寫時間不用十分鐘,歡迎參考。

參考資料 Reference

訂閱
Notify of
guest
0 留言
Inline Feedbacks
檢視所有留言