您好,登錄后才能下訂單哦!
這篇文章主要為大家展示了Unity如何實現全屏截圖和QQ截圖,內容簡而易懂,希望大家可以學習一下,學習完之后肯定會有收獲的,下面讓小編帶大家一起來看看吧。
全屏截圖:要實現的是點擊鼠標左鍵,就實現截圖,并且將所截圖片保存到本地Assets目錄下的StreamingAssets文件夾下面。
代碼如下:
using UnityEngine; using System.Collections; public class TakeScreenShot : MonoBehaviour { void Update () { //點擊鼠標左鍵 if (Input.GetMouseButtonDown (0)) { //開啟協程方法 StartCoroutine (MyCaptureScreen ()); } } //我的截屏方法 IEnumerator MyCaptureScreen(){ //等待所有的攝像機和GUI被渲染完成。 yield return new WaitForEndOfFrame (); //創建一個空紋理(圖片大小為屏幕的寬高) Texture2D tex = new Texture2D (Screen.width,Screen.height); //只能在幀渲染完畢之后調用(從屏幕左下角開始繪制,繪制大小為屏幕的寬高,寬高的偏移量都為0) tex.ReadPixels (new Rect (0,0,Screen.width,Screen.height),0,0); //圖片應用(此時圖片已經繪制完成) tex.Apply (); //將圖片裝換成jpg的二進制格式,保存在byte數組中(計算機是以二進制的方式存儲數據) byte[] result = tex.EncodeToJPG (); //文件保存,創建一個新文件,在其中寫入指定的字節數組(要寫入的文件的路徑,要寫入文件的字節。) System.IO.File.WriteAllBytes (Application.streamingAssetsPath+"/1.JPG",result); } }
之后思考一下,如何像qq截圖那樣,繪制一個截屏的矩形框只截取自己想要的部分呢?
using UnityEngine; using System.Collections; using System.IO;//引入IO流 public class NewBehaviourScript : MonoBehaviour { //定義一個存儲截屏圖片的路徑 string filePath; void Start () { //圖片存儲在StreamingAssets文件夾內。 filePath = Application.streamingAssetsPath + "/1.png"; } Rect rect; //截屏開始的位置 Vector3 s_pos; //截屏結束的位置 Vector3 e_pos; //是否繪制 bool isDraw; void Update() { //按下鼠標左鍵時,記錄當前鼠標的位置為開始截屏時的位置 if(Input.GetMouseButtonDown(0)) { s_pos = Input.mousePosition; } //鼠標處于按下狀態時 if(Input.GetMouseButton(0)) { e_pos = Input.mousePosition; //可以開始繪制 isDraw = true; } //抬起鼠標左鍵時,記錄當前鼠標的位置為結束截屏時的位置 if(Input.GetMouseButtonUp(0)) { //結束繪制 isDraw = false; e_pos = Input.mousePosition; //獲取到截屏框起始點的位置,和寬高。 rect = new Rect(Mathf.Min(s_pos.x,e_pos.x),Mathf.Min(s_pos.y,e_pos.y),Mathf.Abs(s_pos.x-e_pos.x),Mathf.Abs(s_pos.y - e_pos.y)); //開啟繪制的協程方法 StartCoroutine(Capsture(filePath, rect)); } } IEnumerator Capsture(string filePath, Rect rect) { yield return new WaitForEndOfFrame(); //創建紋理(紋理貼圖的大小和截屏的大小相同) Texture2D tex = new Texture2D((int)rect.width, (int)rect.height); //讀取像素點 tex.ReadPixels(rect, 0, 0) ; //將像素點應用到紋理上,繪制圖片 tex.Apply(); //將圖片裝換成jpg的二進制格式,保存在byte數組中(計算機是以二進制的方式存儲數據) byte[] result =tex.EncodeToPNG(); //文件夾(如果StreamAssets文件夾不存在,在Assets文件下創建該文件夾) if(!Directory.Exists(Application.streamingAssetsPath)) Directory.CreateDirectory(Application.streamingAssetsPath); //將截屏圖片存儲到本地 File.WriteAllBytes(filePath, result); } //在這里要用GL實現繪制截屏的矩形框 //1.GL的回調函數 //2.定義一個材質Material public Material lineMaterial; void OnPostRender() { if(!isDraw) return; print (s_pos); Vector3 sPos = Camera.main.ScreenToWorldPoint(s_pos + new Vector3(0, 0, 10)); Vector3 ePos = Camera.main.ScreenToWorldPoint(e_pos + new Vector3(0, 0, 10)); print(string.Format("GL.....{0}, {1}", sPos, ePos)); // Set your materials Done GL.PushMatrix(); // yourMaterial.SetPass( ); lineMaterial.SetPass(0);//告訴GL使用該材質繪制 // Draw your stuff //始終在最前面繪制 GL.invertCulling = true; GL.Begin(GL.LINES);//開始繪制 //GL.Vertex(sPos); //GL.Vertex(ePos); //如果想要繪制,矩形,將下面代碼啟動 GL.Vertex(sPos); GL.Vertex(new Vector3(ePos.x, sPos.y, 0)); GL.Vertex(new Vector3(ePos.x, sPos.y, 0)); GL.Vertex(ePos); GL.Vertex(ePos); GL.Vertex(new Vector3(sPos.x, ePos.y, 0)); GL.Vertex(new Vector3(sPos.x, ePos.y, 0)); GL.Vertex(sPos); GL.End();//結束繪制 GL.PopMatrix(); } }
在腳本組件中拖入材質球
此圖片黑色的矩形框就是通過GL繪制出來的(通過記錄點的位置來依次繪制出線)
以上就是關于Unity如何實現全屏截圖和QQ截圖的內容,如果你們有學習到知識或者技能,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。