Unity3D遊戲開發之如何用U3D截圖的技能培訓
歡迎來到企業培訓教育專區,這裡有很多我們致力於打造業內培訓、學習第一品牌
今天我們來做點簡單的東西,做個什麼呢?答案就是截圖。如圖,下面是收集的部分截圖:
好了,欣賞完美麗的風景,下面我們就來一起學習在Unity3D實現截圖,先給出實現截圖的三種實現方式:
- /// <summary>
- /// 使用Application類下的CaptureScreenshot()方法實現截圖
- /// 優點:簡單,可以快速地擷取某一幀的畫面、全屏截圖
- /// 缺點:不能針對攝像機截圖,無法進行區域性截圖
- /// </summary>
- /// <param name="mFileName">M file name.</param>
- private void CaptureByUnity(string mFileName)
- {
- Application.CaptureScreenshot(mFileName,0);
- }
- /// <summary>
- /// 根據一個Rect型別來擷取指定範圍的螢幕
- /// 左下角為(0,0)
- /// </summary>
- /// <param name="mRect">M rect.</param>
- /// <param name="mFileName">M file name.</param>
- private IEnumerator CaptureByRect(Rect mRect,string mFileName)
- {
- //等待渲染執行緒結束
- yield return new WaitForEndOfFrame();
- //初始化Texture2D
- Texture2D mTexture=new Texture2D((int)mRect.width,(int)mRect.height,TextureFormat.RGB24,false);
- //讀取螢幕畫素資訊並儲存為紋理資料
- mTexture.ReadPixels(mRect,0,0);
- //應用
- mTexture.Apply();
- //將圖片資訊編碼為位元組資訊
- byte[] bytes = mTexture.EncodeToPNG();
- //儲存
- System.IO.File.WriteAllBytes(mFileName, bytes);
- //如果需要可以返回截圖
- //return mTexture;
- }
- private IEnumerator CaptureByCamera(Camera mCamera,Rect mRect,string mFileName)
- {
- //等待渲染執行緒結束
- yield return new WaitForEndOfFrame();
- //初始化RenderTexture
- RenderTexture mRender=new RenderTexture((int)mRect.width,(int)mRect.height,0);
- //設定相機的渲染目標
- mCamera.targetTexture=mRender;
- //開始渲染
- mCamera.Render();
- //啟用渲染貼圖讀取資訊
- RenderTexture.active=mRender;
- Texture2D mTexture=new Texture2D((int)mRect.width,(int)mRect.height,TextureFormat.RGB24,false);
- //讀取螢幕畫素資訊並儲存為紋理資料
- mTexture.ReadPixels(mRect,0,0);
- //應用
- mTexture.Apply();
- //釋放相機,銷燬渲染貼圖
- mCamera.targetTexture = null;
- RenderTexture.active = null;
- GameObject.Destroy(mRender);
- //將圖片資訊編碼為位元組資訊
- byte[] bytes = mTexture.EncodeToPNG();
- //儲存
- System.IO.File.WriteAllBytes(mFileName,bytes);
- //如果需要可以返回截圖
- //return mTexture;
- }
- }
接下來,我們來呼叫這三個方法實現一個簡單的截圖的例子:
- //定義圖片儲存路徑
- private string mPath1;
- private string mPath2;
- private string mPath3;
- //相機
- public Transform CameraTrans;
- void Start()
- {
- //初始化路徑
- mPath1=Application.dataPath+"\\ScreenShot\\ScreenShot1.png";
- mPath2=Application.dataPath+"\\ScreenShot\\ScreenShot2.png";
- mPath3=Application.dataPath+"\\ScreenShot\\ScreenShot3.png";
- }
- //主方法,使用UGUI實現
- void OnGUI()
- {
- if(GUILayout.Button("截圖方式1",GUILayout.Height(30))){
- CaptureByUnity(mPath1);
- }
- if(GUILayout.Button("截圖方式2",GUILayout.Height(30))){
- StartCoroutine(CaptureByRect(new Rect(0,0,1024,768),mPath2));
- }
- if(GUILayout.Button("截圖方式3",GUILayout.Height(30))){
- //啟用頂檢視相機
- CameraTrans.camera.enabled=true;
- //禁用主相機
- Camera.main.enabled=false;
- StartCoroutine(CaptureByCamera(CameraTrans.camera,new Rect(0,0,1024,768),mPath3));
- }
- }
我們下面來看三種方法截圖的效果:
從截圖的效果來看,第一種方法的效果是最好的,不過定製化是個問題。第二種方法效果一般吧,感覺這裡TextureFormat沒有選好吧。第三種效果基本達到了想要的要求,不過攝像機的投影範圍似乎沒有設計好。這裡我們發現第二張截圖會把編輯器的視窗渲染到裡面,認為是程式執行的時候,即使將Game視窗放到最大,仍然會受到視窗的影響,後來就把程式編譯成可執行檔案,不過程式執行完之後,卻沒有找到對應的截圖。後來查詢了官方的API才知道原因是這樣的:
Description
Contains the path to the game data folder (Read Only).
The value depends on which platform you are running on:
Unity Editor: <path to project folder>/AssetsMac player: <path to player app bundle>/ContentsiPhone player: <path to player app bundle>/<AppName.app>/DataWin player: <path to executablename_Data folder>Web player: The absolute url to the player data file folder (without the actual data file name)Flash: The absolute url to the player data file folder (without the actual data file name)Note that the string returned on a PC will use a forward slash as a folder separator顯然,我們從這裡可以知道Application.datapath在不同的平臺上對應的位置。對於可執行(.exe,Windows平臺)的檔案,它對應在和應用程式對應的一個資料夾裡,例如可執行檔案的名字叫做UnityGame,那麼對應的位置就是UnityGame_Data這個檔案啦。所以問題應該是出在沒有在這裡建一個ScreenShot的資料夾,希望大家以後做相關專案的時候注意一下吧。好了,這就是今天的內容了,希望大家喜歡啊。
相關文章
- unity3d開發的大型網路遊戲Unity3D遊戲
- 【Unity3D開發小遊戲】《戰棋小遊戲》Unity開發教程Unity3D遊戲
- Unity3D如何開發最簡單的VR遊戲 vrPlus(神之眼)Unity3DVR遊戲
- 入門遊戲測試,我們到底要學什麼?技能的誕生:《遊戲測試技能與工具鏈應用培訓》開啟報名!遊戲
- 如何根據自己的需要培養遊戲開發技能?又一篇遊戲程式設計入門指南遊戲開發程式設計
- win10系統遊戲截圖儲存在哪_如何開啟win10遊戲截圖儲存位置Win10遊戲
- U3D遊戲開發從入門到彎道超車(一):序章3D遊戲開發
- ubuntu如何用快捷鍵截圖Ubuntu
- 這個春天,TRIZ培訓如約而來!
- win10遊戲截圖儲存在哪_win10 遊戲截圖圖片怎麼檢視Win10遊戲
- CocosCreator遊戲開發(五)實現技能按鈕遊戲開發
- Python培訓分享學Python需要掌握哪些技能Python
- FPGA/CPLD開發培訓課程FPGA
- win10遊戲截圖儲存在哪裡 win10遊戲截圖在哪資料夾裡Win10遊戲
- 遊戲開發者如何點亮主播/UP主技能?遊戲開發
- 參加web前端培訓要學會哪些技能Web前端
- 學java培訓開發需要多少錢Java
- 開發者談:懂得經營是遊戲開發環境的基本技能屬性遊戲開發開發環境
- 活動推薦|遊戲海外發行必備攻略培訓——廈門站遊戲
- 教育APP開發_教育培訓APP開發解決方案APP
- 成為ui設計師要培訓哪些技能呢?UI
- 《Visual Studio 2017 Web 開發》截圖Web
- NX建模和工程圖培訓
- 《大前端開發》培訓2周小結前端
- Python開發培訓課程都學哪些Python
- web前端開發主要培訓哪些內容Web前端
- 遊戲大地圖開發指南:遊戲外部空間設計遊戲地圖
- java培訓分享:java培訓架構師學習線路圖Java架構
- 《Unpacking》的開發者如何用1000件物品講述一個遊戲故事?遊戲
- web前端培訓:常用的Web前端開發框架有哪些?Web前端框架
- Web前端培訓:有哪些好用的前端開發工具呢?Web前端
- 教育培訓APP開發時需要注意的問題APP
- go語言開發培訓班哪裡好Go
- 教育培訓行業APP開發需要哪些功能?行業APP
- 學習Linux開發課程需要培訓嗎Linux
- 成都Java開發培訓多少錢?貴不貴?Java
- 世界觀架構之射擊遊戲技能設定架構遊戲
- AI打遊戲-貳(收集訓練圖片)AI遊戲
- 教育培訓原始碼的優勢之處原始碼