1. 程式人生 > >Unity3d截圖方法合集

Unity3d截圖方法合集

最近專案需求截圖,於是就全部研究了一下,期間遇到了各種問題,與諸位大神討論後終於解決了 主要有三種方法:
  • unity自帶的全屏截圖
  • unity主場景區域性區域截圖
  • unity針對某個相機看到的區域區域性截圖
  1. 針對第一種方案的截圖很容易

            使用Application.CaptureScreenshot方法,       第一個引數是檔案路徑名,第二個引數是截圖的大小,預設是0,1代表當前大小的一倍,以此類推

          

  1. unity主場景區域性區域截圖

          這裡遇到兩個個坑。           坑一:座標轉換           一開始不知道座標系不一樣,發現一些座標一執行截圖方法,unity就崩了,還無從查詢問題,後來費了好大一番功夫,發現GUI的rect的座標系和ReadPixels用的矩形座標系不一樣。如下圖所示:
                下面我們先驗證一下這個說法:           如圖使我們場景執行的效果,我們想要截按鈕那個地方的圖,Rect(0, 0, 200, 200):                    理想的截圖出來應該是左邊圖樣的,實際截出來的圖是右邊的圖樣,明顯的截了左下角的了:                                      於是我寫了一個矩形轉換座標的函式:                          截圖前轉換矩形座標後:              截出來的圖如圖,現在就對上了,而且範圍超出螢幕範圍,unity會崩掉,這裡直接容錯:           坑二:相機渲染順序           官網的案例是寫在OnPostRender中的,然後在相機渲染玩所有它的物體之後被呼叫,但是在其它相機和GUI被渲染前呼叫:            
            結果如圖:截圖中沒有GUI,由於OnPostRender只能掛在攝像機上,你也可以其它地方直接呼叫截圖方法。其它方法類似情況也出現過,比如只有天空盒子,或者只有GUI沒有三維模型等等。還會報如下圖的錯誤                    解決方案:              WaitForEndOfFrame,可以把OnPostRender方法改成協同,也可以直接把截圖方法改成協同呼叫                下面言歸正傳:                 踩過上面兩個坑後,我們就可以正常的截圖幕中的任意矩形了,比如Rect(200, 200, 200, 200),如圖:
                     
  1. unity針對某個相機看到的區域區域性截圖

          當場景中不止一個相機時,你想要截圖某個相機看到的部分割槽域時,就要使用相機的rendertexture來截圖:           這裡的截圖和2基本差不多,不過這裡不需要做座標轉換,RenderTexture的座標和GUI的是一樣的。           我的第二個相機只能看到兩個球:                      執行場景如圖:         
        截圖如圖所示:                      原理是此攝像機的renderTexture是全屏的,我們從中擷取我們需要的                      第三種方案還已遺留了個坑,當第二個攝像機帶有天空盒子時,截圖只看到天空盒子,大神高手會的幫忙解答下。