169 lines
4.4 KiB
C#
169 lines
4.4 KiB
C#
using System;
|
||
using System.Collections;
|
||
using UnityEngine;
|
||
using UnityEngine.UI;
|
||
|
||
public class WebcamControllerPanel : PanelBasic
|
||
{
|
||
public RawImage camera_rawimage;//相机渲染的UI
|
||
//public GameObject quad;//相机渲染的GameObject
|
||
private WebCamTexture webCamTexture;
|
||
private Coroutine open_camera;
|
||
|
||
public delegate void OpenCameraDelegate(string _msg, string _type);
|
||
public OpenCameraDelegate open_camera_msg;
|
||
void Start()
|
||
{
|
||
|
||
}
|
||
|
||
private void Update()
|
||
{
|
||
|
||
if (Input.GetKey(KeyCode.H))
|
||
{
|
||
webCamTexture.Stop();
|
||
}
|
||
if (Input.GetKey(KeyCode.M))
|
||
{
|
||
webCamTexture.Play();
|
||
}
|
||
|
||
}
|
||
|
||
/// <summary>
|
||
/// 打开摄像机
|
||
/// </summary>
|
||
public void ToOpenCamera()
|
||
{
|
||
open_camera = StartCoroutine("OpenCamera");
|
||
}
|
||
public IEnumerator OpenCamera()
|
||
{
|
||
int maxl = Screen.width;
|
||
if (Screen.height > Screen.width)
|
||
{
|
||
maxl = Screen.height;
|
||
}
|
||
|
||
// 申请摄像头权限
|
||
yield return Application.RequestUserAuthorization(UserAuthorization.WebCam);
|
||
if (Application.HasUserAuthorization(UserAuthorization.WebCam))
|
||
{
|
||
if (webCamTexture != null)
|
||
{
|
||
webCamTexture.Stop();
|
||
}
|
||
|
||
//打开渲染图
|
||
if (camera_rawimage != null)
|
||
{
|
||
camera_rawimage.gameObject.SetActive(true);
|
||
}
|
||
//if (quad != null)
|
||
//{
|
||
// quad.gameObject.SetActive(true);
|
||
//}
|
||
|
||
// 监控第一次授权,是否获得到设备(因为很可能第一次授权了,但是获得不到设备,这里这样避免)
|
||
// 多次 都没有获得设备,可能就是真没有摄像头,结束获取 camera
|
||
int i = 0;
|
||
while (WebCamTexture.devices.Length <= 0 && 1 < 300)
|
||
{
|
||
yield return new WaitForEndOfFrame();
|
||
i++;
|
||
}
|
||
WebCamDevice[] devices = WebCamTexture.devices;//获取可用设备
|
||
if (WebCamTexture.devices.Length <= 0)
|
||
{
|
||
Debug.LogError("没有摄像头设备,请检查");
|
||
open_camera_msg?.Invoke("没有摄像头设备,请检查!", "warning");
|
||
}
|
||
else
|
||
{
|
||
string devicename = devices[0].name;
|
||
webCamTexture = new WebCamTexture(devicename, maxl, maxl == Screen.height ? Screen.width : Screen.height, 30)
|
||
{
|
||
wrapMode = TextureWrapMode.Repeat
|
||
};
|
||
|
||
// 渲染到 UI 或者 游戏物体上
|
||
if (camera_rawimage != null)
|
||
{
|
||
camera_rawimage.texture = webCamTexture;
|
||
}
|
||
|
||
//if (quad != null)
|
||
//{
|
||
// quad.GetComponent<Renderer>().material.mainTexture = webCamTexture;
|
||
//}
|
||
|
||
webCamTexture.Play();
|
||
|
||
open_camera_msg?.Invoke("摄像头已打开", "log");
|
||
}
|
||
}
|
||
else
|
||
{
|
||
Debug.LogError("未获得读取摄像头权限");
|
||
open_camera_msg?.Invoke("未获得读取摄像头权限!", "warning");
|
||
}
|
||
}
|
||
|
||
private void OnApplicationPause(bool pause)
|
||
{
|
||
// 应用暂停的时候暂停camera,继续的时候继续使用
|
||
if (webCamTexture != null)
|
||
{
|
||
if (pause)
|
||
{
|
||
webCamTexture.Pause();
|
||
}
|
||
else
|
||
{
|
||
webCamTexture.Play();
|
||
}
|
||
}
|
||
|
||
}
|
||
|
||
public void OnActive(bool _use_real_camera)
|
||
{
|
||
OnActive();
|
||
if (_use_real_camera)
|
||
{
|
||
ToOpenCamera();
|
||
}
|
||
}
|
||
|
||
public override void OnActive(Image _main_panel = null, Image _mask = null, Action _callback = null)
|
||
{
|
||
base.OnActive(_main_panel, _mask, _callback);
|
||
camera_rawimage.gameObject.SetActive(true);
|
||
}
|
||
|
||
public override void OnNagetive(bool _active_last_panel)
|
||
{
|
||
base.OnNagetive(_active_last_panel);
|
||
if (open_camera != null)
|
||
{
|
||
StopCoroutine(open_camera);
|
||
open_camera_msg?.Invoke("摄像头已关闭", "log");
|
||
//后添加的用来在停止摄像头的时候禁用摄像头的方法
|
||
if (webCamTexture != null)
|
||
{
|
||
webCamTexture.Stop();
|
||
}
|
||
}
|
||
camera_rawimage.gameObject.SetActive(false);
|
||
}
|
||
|
||
private void OnDestroy()
|
||
{
|
||
if (webCamTexture != null)
|
||
{
|
||
webCamTexture.Stop();
|
||
}
|
||
}
|
||
}
|