ict.lixian.single/Assets/Scenes/Wj/WebcamControllerPanel.cs

169 lines
4.4 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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();
}
}
}