close

此篇過舊,可改看新篇文章Unity 客製化相機(新)

 

此篇文章已於2015年8月24日重新編寫

 

(建議先看過這篇文章,而NGUI按鈕事件則看請這篇文章)

希望相機也能夠隨著使用者手機解析度自動調整大小,所以還是一樣會使用到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即可拍照~

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 Yang 的頭像
    Yang

    Yang的部落格(轉貼文章請註記來源)

    Yang 發表在 痞客邦 留言(2) 人氣()