[Unity] 截圖的實(shí)現(xiàn)

下面是我總結(jié)的、在u3d中的,三種截屏方法:

1、使用Application類下的CaptureScreenshot方法。

void?CaptureScreen()

????Application.CaptureScreenshot("Screenshot.png",?0);??

這個(gè)方法,截取的是某一幀時(shí)整個(gè)游戲的畫面,或者說是全屏截圖吧。

a、不能針對某一個(gè)相機(jī)(camera)的畫面,進(jìn)行截圖。

b、對局部畫面截圖,實(shí)現(xiàn)起來不方便,效率也低,不建議在項(xiàng)目中使用:

雖然CaptureScreenshot這個(gè)方法呢,本身是不要做到這一點(diǎn)的。但是我們可以走曲線救國的路線來實(shí)現(xiàn)它。思路是這樣的:你可以先用這個(gè)方法截圖一個(gè)全屏,然后通過路徑獲取到這個(gè)截圖;接下來就通過相關(guān)的圖形類來,取得這個(gè)截圖的局部區(qū)域并保存下來,這樣就能得到一個(gè)局部截圖了。在這里我就不實(shí)現(xiàn)它了,不過有興趣的可以試試,肯定是可以實(shí)現(xiàn)的。

2、這第二個(gè)截圖的方法是,使用Texture2d類下的相關(guān)方法,也可實(shí)現(xiàn)截圖功能。

///?<summary>??

///?Captures?the?screenshot2.??

///?</summary>??

///?<returns>The?screenshot2.</returns>??

///?<param?name="rect">Rect.截圖的區(qū)域,左下角為o點(diǎn)</param>??

Texture2D?CaptureScreenshot2(Rect?rect)???

????//?先創(chuàng)建一個(gè)的空紋理,大小可根據(jù)實(shí)現(xiàn)需要來設(shè)置??

Texture2D?screenShot?=newTexture2D((int)rect.width,?(int)rect.height,?TextureFormat.RGB24,false);

????//?讀取屏幕像素信息并存儲(chǔ)為紋理數(shù)據(jù),??

????screenShot.ReadPixels(rect,?0,?0);??

????screenShot.Apply();??

????//?然后將這些紋理數(shù)據(jù),成一個(gè)png圖片文件??

byte[]?bytes?=?screenShot.EncodeToPNG();

stringfilename?=?Application.dataPath?+?"/Screenshot.png";

????System.IO.File.WriteAllBytes(filename,?bytes);??

Debug.Log(string.Format("截屏了一張圖片:?{0}",?filename));

????//?最后,我返回這個(gè)Texture2d對象,這樣我們直接,所這個(gè)截圖圖示在游戲中,當(dāng)然這個(gè)根據(jù)自己的需求的。??

returnscreenShot;

截全屏:?

CaptureScreenshot2( new Rect( Screen.width*0f, Screen.height*0f, Screen.width*1f, Screen.height*1f));

截中間4分之1:

CaptureScreenshot2( new Rect( Screen.width*0.25f, Screen.height*0.25f, Screen.width*0.5f, Screen.height*0.5f));

這里使用了幾個(gè)Texture2d類的方法,使用上也有一些要注意的地方,自己看吧。

當(dāng)然,這個(gè)方法也不要到實(shí)現(xiàn)針對某個(gè)相機(jī)的截圖的功能。不過關(guān)鍵接口已經(jīng)出現(xiàn)了,它就是Texture2d.ReadPixels(),這段就不說了,接著往下看吧!

3、這第三個(gè)方法,最牛了,可以針對某個(gè)相機(jī)進(jìn)行截圖。

這樣的話,我就可截下,我的Avatar在游戲中場景中所看的畫面了,UI界面(用一個(gè)專門的camera顯示)什么的是不應(yīng)該有的。要做到這一點(diǎn),我們應(yīng)該將分出一個(gè)camera來專門顯示ui界面,用另一個(gè)camera相機(jī)來場景顯示場景畫面。然后,我們只對場景相機(jī)進(jìn)行截屏就是了。所以這關(guān)鍵點(diǎn)就是:如何實(shí)現(xiàn)對某個(gè)相機(jī)進(jìn)行截屏了。這里用到一個(gè)新的類是RenderTexture。

代碼如下:

///?<summary>??

///?對相機(jī)截圖。???

///?</summary>??

///?<returns>The?screenshot2.</returns>??

///?<param?name="camera">Camera.要被截屏的相機(jī)</param>??

///?<param?name="rect">Rect.截屏的區(qū)域</param>??

Texture2D?CaptureCamera(Camera?camera,?Rect?rect)???

????//?創(chuàng)建一個(gè)RenderTexture對象??

RenderTexture?rt?=newRenderTexture((int)rect.width,?(int)rect.height,?0);

????//?臨時(shí)設(shè)置相關(guān)相機(jī)的targetTexture為rt,?并手動(dòng)渲染相關(guān)相機(jī)??

????camera.targetTexture?=?rt;??

????camera.Render();??

????????//ps:?---?如果這樣加上第二個(gè)相機(jī),可以實(shí)現(xiàn)只截圖某幾個(gè)指定的相機(jī)一起看到的圖像。??

????????//ps:?camera2.targetTexture?=?rt;??

????????//ps:?camera2.Render();??

????????//ps:?-------------------------------------------------------------------??

????//?激活這個(gè)rt,?并從中中讀取像素。??

????RenderTexture.active?=?rt;??

Texture2D?screenShot?=?new?Texture2D((int)rect.width,?(int)rect.height,?TextureFormat.RGB24,false);

????screenShot.ReadPixels(rect,?0,?0);//?注:這個(gè)時(shí)候,它是從RenderTexture.active中讀取像素??

????screenShot.Apply();??

????//?重置相關(guān)參數(shù),以使用camera繼續(xù)在屏幕上顯示??

camera.targetTexture?=null;

????????//ps:?camera2.targetTexture?=?null;??

RenderTexture.active?=null;?//?JC:?added?to?avoid?errors

????GameObject.Destroy(rt);??

????//?最后將這些紋理數(shù)據(jù),成一個(gè)png圖片文件??

byte[]?bytes?=?screenShot.EncodeToPNG();

string?filename?=?Application.dataPath?+?"/Screenshot.png";

????System.IO.File.WriteAllBytes(filename,?bytes);??

Debug.Log(string.Format("截屏了一張照片:?{0}",?filename));

return?screenShot;

多的我就不說了,相關(guān)知識自己去找資料吧,因?yàn)槲乙膊欢?/p>

直接上圖了。

無ui的全屏圖:

只有ui的全屏圖:

有ui有場景的全屏圖(只指定這兩個(gè)相機(jī)哦,相關(guān)提示在代碼的“//ps”中):

轉(zhuǎn)載請?jiān)谖氖鬃⒚鞒鎏帲?a target="_blank" rel="nofollow">http://blog.csdn.net/anyuanlzh/article/details/17008909

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容