此篇過舊,可改看新篇文章Unity 客製化相機(新)
此篇文章已於2015年8月24日重新編寫
希望相機也能夠隨著使用者手機解析度自動調整大小,所以還是一樣會使用到NGUI。(版本請看置頂文)
但若只是純粹希望顯示出鏡頭畫面,則可以參考彥霖大大的這篇文章(使用Plane)
新建一個全新的專案
並引入NGUI後,將原先的Camera和Light都刪掉,並且選擇 NGUI → Create → Widget (或是使用快捷建Alt+Shift+W)
這個Container就是影像要顯示的區域,而Container的設定如下:
再來 NGUI → Create → Texture (或是使用快捷建Alt+Shift+T)
這個Texture就是要當成Image Button使用
Texture的UI Texture(Script)內的Texture使用右邊這張圖(圖片名稱為 camera )→
然後記得幫Texture加上 UI Event Listener(Script),這個為NGUI內建的腳本,可以用來處理按鈕事件
以及Box Collider處理觸碰(紅圈處請打勾,讓實際可觸碰的範圍隨著Texture的圖片大小改變)
都弄完後Scene內的物件會像這樣
再來就是直接編寫程式碼了!
新增一個C#腳本,命名為 useCamera
P.S.這篇文章會使用到StartCoroutine和yield return這兩個方法和關鍵字,這兩個的意思可以看這篇文章
P.S.這篇會使用到截圖(Texture2D的ReadPixels方法),可以參考我的這篇文章認識一下這個方法的參數作用
using UnityEngine;
using System.Collections;
using System;
using System.IO;
public class useCamera : MonoBehaviour
{
private WebCamTexture myCam;//接收攝影機讀取到的圖片數據
private string filepath = @"D:\";//儲存照片的路徑,在此我設定為自己的D槽
public UIWidget cameraSize;//相機影像顯示的範圍
public GameObject getPicture;//拍照的Image Button
void Start()
{
StartCoroutine(open_Camera());//開啟相機
UIEventListener.Get(getPicture).onClick = getPictureOnClick;//註冊按鈕事件
}
void OnGUI()
{
//若有攝影機則將攝影機拍到的畫面繪出
if (myCam != null)
{
/* (new Rect(影像起始x軸,影像起始y軸,要顯示出來的寬度,要顯示出來的高度), 顯示的影像或圖片) */
GUI.DrawTexture(new Rect(0, 0, cameraSize.width, cameraSize.height), myCam);
}
}
private void getPictureOnClick(GameObject button)
{
StartCoroutine(getTexture2d());//拍照
}
IEnumerator open_Camera()
{
yield return Application.RequestUserAuthorization(UserAuthorization.WebCam);//授權開啟鏡頭
if (Application.HasUserAuthorization(UserAuthorization.WebCam))//若同意開啟攝影機
{
//設置攝影機截取到的影像範圍
/* (攝影機名稱, 攝影機影像的寬度, 攝影機影像的高度, 攝影機的FPS) */
myCam = new WebCamTexture(WebCamTexture.devices[0].name, cameraSize.width, cameraSize.height, 60);
myCam.Play();//開啟攝影機
}
}
IEnumerator getTexture2d()
{
yield return new WaitForEndOfFrame(); //攝影機讀取到的畫面繪製完畢後才進行拍照
Texture2D t = new Texture2D(cameraSize.width, cameraSize.height);//要保存的圖片大小
//圖片截取的區域
t.ReadPixels(new Rect(0, 0, cameraSize.width, cameraSize.height), 0, 0, false);
t.Apply();
filepath += String.Format("{0:yyyyMMddHHmmss}", DateTime.Now) + ".png"; //要儲存的圖片名稱,以當前時間來命名。假設當前時間為2015年05月21日19時51分13秒,則該檔名為20150521195113.png
using (FileStream fs = File.Open(filepath, FileMode.Create)) //開啟檔案串流
{
BinaryWriter binary = new BinaryWriter(fs);
binary.Write(t.EncodeToPNG()); //將圖片轉換為byte陣列並寫入二進位檔(圖片檔)
}
Debug.Log("照片已儲存");
}
void OnDisable()
{
//當離開該場景時會自動呼叫此方法關閉攝影機
myCam.Stop();
}
}
將程式碼托放到UI Root上,並將Container和Texture分別拖曳到指定位置
執行之後就會出現畫面了~
按下Texture這個Image Button即可拍照~