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的資料夾,希望大家以後做相關專案的時候注意一下吧。好了,這就是今天的內容了,希望大家喜歡啊。
相關文章
- ubuntu如何用快捷鍵截圖Ubuntu
- 參加web前端培訓要學會哪些技能Web前端
- Python培訓分享學Python需要掌握哪些技能Python
- 成為ui設計師要培訓哪些技能呢?UI
- java培訓分享:java培訓架構師學習線路圖Java架構
- 北京web培訓哪裡好,哪些技能會讓面試加分Web面試
- 教育培訓原始碼的優勢之處原始碼
- U3D路線圖3D
- [Unity3D]Unity3D遊戲開發之Lua與遊戲的不解之緣終結篇:UniLua熱更新全然解讀Unity3D遊戲開發
- UI設計培訓之:5個小技巧快速學會PS摳圖UI
- 黑馬程式設計師Java培訓和Android培訓:培訓前奏程式設計師JavaAndroid
- 培訓遊戲遊戲
- Java培訓:長沙Java培訓機構排名Java
- 網路安全培訓何必冠以***培訓之名?薦
- web前端培訓分享Electron之Main Process APIWeb前端AIAPI
- web前端培訓分享Electron之IPC 通訊Web前端
- 好程式設計師Java培訓分享Java程式設計師技能提升指南程式設計師Java
- Unity3d遊戲開發注意事項Unity3D遊戲開發
- 黑馬程式設計師Java培訓和Android培訓Java GUI圖形使用者介面程式設計師JavaAndroidGUI
- weblogic培訓Web
- 培訓工作QHSE
- U3D 網路庫實現通訊 基於Warensoft Unity3d3DUnity
- MAC電腦使用技巧之Mac截圖快捷鍵截圖技巧與工具分享Mac
- UI設計培訓之UI設計系統知識UI
- 大話成像之數字成像系統培訓
- Java程式設計師技術培訓需要培訓哪些?Java程式設計師
- Python培訓分享:python如何用cookie實現自動模擬登入?PythonCookie
- MacOS專業截圖指南——截圖技巧和截圖工具分享Mac
- Android 普通View截圖 RecyclerView截圖 ScrollView截圖分享AndroidView
- UI培訓教程之系統圖示如何設計?UI
- web前端培訓之Javascript如何改變陣列的長度?Web前端JavaScript陣列
- java技術培訓之File類中常用的構造方法Java構造方法
- 總結!Python培訓之10道經典的面試題Python面試題
- 如何根據自己的需要培養遊戲開發技能?又一篇遊戲程式設計入門指南遊戲開發程式設計
- 長沙Java培訓機構哪家好?怎麼才能避免Java培訓的坑?Java
- 如何用Chrome自帶的截圖功能擷取超過一個螢幕的網頁Chrome網頁
- ABAQUS基礎培訓
- Oracle WareHouse Builder培訓OracleUI