由於上一篇客製化相機已經是一年之前的事情了,現在大家都在用UGUI,於是重新寫了一篇新的,而上一篇就留著作紀念吧......
P.S.可直接用於電腦或手機(皆必須有鏡頭才可正常工作),差別在於儲存地點而已。
開一個新專案,由於相機是2D畫面,所以建立了2D的專案
放置好RawImage和Button (其中RawImage也可換成Panel或Image,只是用來方便得知影像要顯示的範圍而已)
以及新增一個C#腳本
RawImage和Button的Text設置如下(Button本身晚點再說)
RawImage的Color部分不管什麼顏色都沒差,到時候顯示的影像會覆蓋在上面
然後開啟Text.cs,並輸入以下程式碼~
using System.Collections;
using System.IO;
using UnityEngine;
using UnityEngine.UI;
public class Test : MonoBehaviour
{
public GameObject rawImageObject;
private RectTransform cameraSize;//拍攝和顯示的影像大小
private RawImage showImage;//顯示圖片
private WebCamTexture myCam;//接收攝影機讀取到的圖片數據
private string filepath = @"D:\picture.jpg";//儲存照片的路徑
private void Start ()
{
//取得RectTransform和RawImage元件
cameraSize = rawImageObject.GetComponent<RectTransform>();
showImage = rawImageObject.GetComponent<RawImage>();
StartCoroutine(OpenCamera());//開啟攝影機鏡頭
}
private void OnGUI ()
{
//若有開啟鏡頭則將拍到的畫面顯示出來
if (myCam != null)
{
/* (new Rect(影像起始x軸,影像起始y軸,要顯示出來的寬度,要顯示出來的高度), 顯示的影像或圖片) */
GUI.DrawTexture(new Rect(0, 0, (int)cameraSize.rect.width, (int)cameraSize.rect.height), myCam);
}
}
public void GetButton()
{
StartCoroutine(GetPicture());//拍照
}
private IEnumerator OpenCamera()
{
yield return Application.RequestUserAuthorization(UserAuthorization.WebCam);//授權開啟鏡頭
if (Application.HasUserAuthorization(UserAuthorization.WebCam))//若同意開啟攝影機
{
//設置攝影機截取到的影像範圍
/* (攝影機名稱, 攝影機影像的寬度, 攝影機影像的高度, 攝影機的FPS) */
myCam = new WebCamTexture(WebCamTexture.devices[0].name, (int)cameraSize.rect.width, (int)cameraSize.rect.height, 30);
myCam.Play();//開啟攝影機
}
}
private IEnumerator GetPicture()
{
yield return new WaitForEndOfFrame(); //攝影機讀取到的Frame繪製完畢後才進行拍照
Texture2D t = new Texture2D((int)cameraSize.rect.width, (int)cameraSize.rect.height);//要保存的圖片大小
t.ReadPixels(new Rect(0, Screen.height - (int)cameraSize.rect.height, (int)cameraSize.rect.width, (int)cameraSize.rect.height), 0, 0, true);//圖片截取的區域//圖片截取的區域
using (FileStream fs = File.Open(filepath, FileMode.Create))
{
BinaryWriter bw = new BinaryWriter(fs);
bw.Write(t.EncodeToJPG());
}
Debug.Log("拍照完成!");
}
private void OnDisable()
{
myCam.Stop();//離開當前Scene後關閉攝影機
}
}
我將此腳本拖曳到Main Camera上
最後就是設置Button了!
都完成後即可執行!按下Get可成功拍照。

請問如果要for android手機拍照, 那麼路徑需要修改嗎? 怎麼修改
路徑要修改成下面這行 "URI=file:" + Application.persistentDataPath + "/" + [你想存放的路徑]; 然後PlayerSetting的Write Access要允許讀寫 詳細原因可以看這篇:http://www.cnblogs.com/murongxiaopifu/p/4199541.html
是指可儲到外部空間嗎? Write Access -> External(SDCard) 修改的部分是這樣改嗎? private string filepath = "URI=file:" + Application.persistentDataPath + "/" + "picture.jpg";
1.存在SD卡就按照你說的那樣,若存在內建RAM就不用改;Api Compatibility Level改為.NET 2.0 2.是的
修改完輸出到手機,拍照的部分沒有作用。 但我用 Application.CaptureScreenshot("Screenshot.png"); 是可行的。 我想請問這程式有解決方法嗎?
阿...抱歉,不用加"URI=file:"了,直接Application.persistentDataPath + "/" + [儲存的檔名] 另外在前面還要加上判斷此資料夾是否存在,若不存在則新增 if (!Directory.Exists(filepath)) Directory.CreateDirectory(filepath); 除此之外PlayerSetting的Default Orientation要設定Landscape Left,這樣畫面就是正常的了,不過截下來的圖片需要再向右翻轉90%。
*****
*****
*****
*****
不好意思請問一下...Android 6.0的手機該如何在請求相機時要求跳出詢問權限的視窗? 遊戲安裝時和開啟相機時都沒跳 App程式管理裡面有相機權限但是默認是關的 都要自己手動去開才能正常運作
利用這裡面提到的添加權限的方式去開啟 http://oblivious9.pixnet.net/blog/post/204640543-unity-%E4%BD%BF%E7%94%A8android-bluetooth-%28android-studio%29
拍謝可能...沒說清楚 unity專案裡面的 AndroidManifest 本來就已經有添加該權限
貌似是系統自己添加的,一開始就有,即使這樣還是要另外用Android Studio去寫Jar檔才能呼叫出開啟權限的視窗嗎?
既然已經有內建開啟相機的權限,專案也按照我文章的步驟做了,卻無法開啟相機,有可能是手機較為特殊的問題? 我使用ASUS ZE551ML Android 6.0,可以正常開啟
Unity從5.1.4升級到5.6.1f1這個問題自動解決了ORZ 還是謝謝大大的幫忙
請問為什麼我的按鈕可以點可是都看不到QQ
看不到按鈕的icon嗎? 請注意Hierarchy元件的排列順序,下方元件會蓋在上方元件上面
解決了~後來發現是因為GUI會擋住原本的UI,我改成顯示在自己的RawImage了~謝謝