今天的筆記是從 Unity 官方文件中調出來的資料「輸出 Camera 當前畫面並存為 Texture2D」,可以用在遊戲中的肖像畫、風景或精彩瞬間的靜態拍攝中。
這裡的的程式碼大部分可以直接複製貼上,所以這功能算是可以很輕易達成的。從這篇 Unity 速記開始,我會分成 GameObject、Assets、Property 與 Script 來說明需要注意的地方,並在最後附上作為範例測試用的專案。
姑且說一下,在本篇文章中僅會記錄關鍵步驟,完整的專案結構請從文中提供的原始碼連結來進行參考。
物件 GameObject
Camera 在加上 Render Texture 之後會失去作為主攝影機的功能,所以我們要另外新增一個攝影機作為拍照使用。
![[Unity 速記] 擷取某一瞬間 Camera 畫面並存為 Texture2D 1 852820dae54ed36749f8af8a96960fd8](https://tedliou.com/wp-content/uploads/852820dae54ed36749f8af8a96960fd8.png)
我將它重新命名為 Render Camera。
資產 Assets
接下來要在 Project 視窗中,也就是 Assets 資料夾下新增一個 Render Texture 作為攝影機渲染輸出使用。Render Texture 除了可以應用在這次的擷圖功能,也可以應用在遊戲小地圖上。
![[Unity 速記] 擷取某一瞬間 Camera 畫面並存為 Texture2D 2 470766cf1226255ed30e019597cfebcf](https://tedliou.com/wp-content/uploads/470766cf1226255ed30e019597cfebcf.png)
屬性 Property
點開 Render Camera 物件的 Inspector,將剛才創建的 Render Texture 檔案關聯到 Camera 的 Target Texture 欄位。
![[Unity 速記] 擷取某一瞬間 Camera 畫面並存為 Texture2D 3 5d573401db6f16f924594545adf9d019](https://tedliou.com/wp-content/uploads/5d573401db6f16f924594545adf9d019.png)
記得喬個位置,讓攝影機能看到你想拍的東西。
腳本 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); }
大概效果是這樣:
![[Unity 速記] 擷取某一瞬間 Camera 畫面並存為 Texture2D 4 7b3f09ff7b54ea2c54296b11b15f5963](https://tedliou.com/wp-content/uploads/7b3f09ff7b54ea2c54296b11b15f5963.png)
上圖這個專案放在 GitLab.com/tedliou/camera-shot-sample,撰寫時間不用十分鐘,歡迎參考。