Skip to content

Instantly share code, notes, and snippets.

@yuujii
Last active July 21, 2020 02:34
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save yuujii/99899a893a94c33af24416644d221288 to your computer and use it in GitHub Desktop.
Save yuujii/99899a893a94c33af24416644d221288 to your computer and use it in GitHub Desktop.
MagicLeapのカメラ映像をリアルタイムに表示 #Unity #ML1
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.XR.MagicLeap;
[RequireComponent(typeof(PrivilegeRequester))]
public class MLCameraPreview : MonoBehaviour {
Texture2D texture;
private PrivilegeRequester _privilegeRequester;
private bool _hasStarted = false;
private bool _isCameraConnected = false;
private bool _isPreview;
void Awake()
{
_privilegeRequester = GetComponent<PrivilegeRequester>();
_privilegeRequester.OnPrivilegesDone += HandlePrivilegesDone;
}
/// <summary>
/// Responds to privilege requester result.
/// </summary>
/// <param name="result"/>
private void HandlePrivilegesDone(MLResult result)
{
if (!result.IsOk)
{
if (result.Code == MLResultCode.PrivilegeDenied)
{
Instantiate(Resources.Load("PrivilegeDeniedError"));
}
Debug.LogErrorFormat("Error: VideoPreview failed to get all requested privileges, disabling script. Reason: {0}", result);
enabled = false;
return;
}
Debug.Log("Succeeded in requesting all privileges");
if (!_hasStarted)
{
EnableMLCamera();
_hasStarted = true;
}
}
/// <summary>
/// Connects the MLCamera component and instantiates a new instance
/// if it was never created.
/// </summary>
private void EnableMLCamera()
{
MLResult result = MLCamera.Start();
if (result.IsOk)
{
result = MLCamera.Connect();
_isCameraConnected = true;
StartPreview();
}
else
{
if (result.Code == MLResultCode.PrivilegeDenied)
{
Instantiate(Resources.Load("PrivilegeDeniedError"));
}
Debug.LogErrorFormat("Error: VideoPreview failed starting MLCamera, disabling script. Reason: {0}", result);
enabled = false;
return;
}
}
/// <summary>
/// Disconnects the MLCamera if it was ever created or connected.
/// Also stops any video recording if active.
/// </summary>
private void DisableMLCamera()
{
if (MLCamera.IsStarted)
{
if (_isPreview)
{
StopPreview();
}
MLCamera.Disconnect();
_isCameraConnected = false;
MLCamera.Stop();
}
}
public void StartPreview()
{
if(!_isPreview && MLCamera.IsStarted && _isCameraConnected)
{
texture = new Texture2D(1920, 1080, TextureFormat.RGBA32, false);
MLResult result = MLCamera.StartPreview(texture);
if (result.IsOk)
{
_isPreview = true;
gameObject.GetComponent<Renderer> ().material.mainTexture = texture;
}
else
{
if (result.Code == MLResultCode.PrivilegeDenied)
{
Instantiate(Resources.Load("PrivilegeDeniedError"));
}
Debug.LogErrorFormat("Error: VideoPreview failed to start video preview for {0}. Reason: {1}", "", MLCamera.GetErrorCode().ToString());
}
}
else
{
Debug.LogErrorFormat("Error: VideoPreview failed to start video preview");
}
}
public void StopPreview()
{
if (_isPreview)
{
MLResult result = MLCamera.StopVideoCapture();
if (result.IsOk)
{
_isPreview = false;
}
else
{
if (result.Code == MLResultCode.PrivilegeDenied)
{
Instantiate(Resources.Load("PrivilegeDeniedError"));
}
Debug.LogErrorFormat("Error: VideoPreview failed to end video preview. Error Code: {0}", MLCamera.GetErrorCode().ToString());
}
}
else
{
Debug.LogError("Error: VideoPreview failed to end video preview because the camera is not recording.");
}
}
void OnApplicationPause(bool pause)
{
if (pause)
{
if (_isCameraConnected)
{
DisableMLCamera();
}
_hasStarted = false;
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment