+using System.Collections;
+using System.Collections.Generic;
+using UnityStandardAssets.ImageEffects;
+public class CameraMgr : MonoBehaviour
+ public GameObject m_buttonPanel;
+ private bool m_isFrontFacing = false;
+ private WebCamDevice m_currCamera;
+ private WebCamDevice m_backCamera;
+ private WebCamDevice m_frontCamera;
+ private WebCamTexture m_cameraTexture;
+ // Source: https://answers.unity.com/questions/773464/webcamtexture-correct-resolution-and-ratio.html
+ public AspectRatioFitter m_cameraImageFitter;
+ Vector3 m_camRotationVector = new Vector3(0f, 0f, 0f);
+ private Rect m_cameraDefaultRect = new Rect(0f, 0f, 1f, 1f);
+ private Rect m_cameraFixedRect = new Rect(0f, 1f, 1f, -1f);
+ // Image Parent's scale
+ private Vector3 m_cameraDefaultScale = new Vector3(1f, 1f, 1f);
+ private Vector3 m_cameraFixedScale = new Vector3(-1f, 1f, 1f);
+ public RawImage m_cameraPlane;
+ private string m_currFileName;
+ public ColorCorrectionLookup m_colorCorrectionLookup;
+ m_isFrontFacing = false;
+ StartCoroutine(SetUpCamera());
+ // https://docs.unity3d.com/ScriptReference/WebCamTexture-ctor.html
+ // https://docs.unity3d.com/ScriptReference/WebCamTexture-videoRotationAngle.html
+ // https://docs.unity3d.com/ScriptReference/WebCamTexture-videoVerticallyMirrored.html
+ IEnumerator SetUpCamera()
+ yield return Application.RequestUserAuthorization(UserAuthorization.WebCam);
+ if (!Application.HasUserAuthorization(UserAuthorization.WebCam)) yield break;
+ WebCamDevice[] devices = WebCamTexture.devices;
+ for (int i = 0; i < devices.Length; i++)
+ Debug.Log("Camera Names " + devices[i].name);
+ if (devices[i].isFrontFacing)
+ { m_frontCamera = devices[i];
+ { m_backCamera = devices[i];
+ m_isFrontFacing = false;
+ StartCoroutine(StartCamera());
+ IEnumerator StartCamera()
+ // camera is flipped when testing with front facing camera in editor
+ if (Application.isEditor || m_isFrontFacing)
+ { m_currCamera = m_frontCamera;
+ { m_currCamera = m_backCamera;
+ m_cameraTexture = new WebCamTexture(m_currCamera.name, 1280, 720, 30);
+ // https://answers.unity.com/questions/1421387/webcamtexture-zoomed-in-on-ipad-pro.html
+ // https://answers.unity.com/questions/773464/webcamtexture-correct-resolution-and-ratio.html
+ m_cameraTexture.Play();
+ yield return new WaitUntil(() => m_cameraTexture.width != 16 && m_cameraTexture.height != 16); // Workaround for weird bug on macOS
+ m_cameraPlane.texture = m_cameraTexture;
+ // Set camera filter modes for a smoother looking image
+ m_cameraPlane.texture.filterMode = FilterMode.Trilinear;
+ // Set AspectRatioFitter's ratio
+ m_cameraImageFitter.aspectRatio = (float)m_cameraTexture.width / m_cameraTexture.height;
+ m_cameraImageFitter.aspectMode = AspectRatioFitter.AspectMode.WidthControlsHeight;
+ // If you want height to control width:
+ m_camImageFitter.aspectRatio = (float) m_cameraTexture.height / m_cameraTexture.width;
+ m_camImageFitter.aspectMode = AspectRatioFitter.AspectMode.HeightControlsWidth;
+ // Rotate image to show correct orientation
+ m_camRotationVector.z = -m_cameraTexture.videoRotationAngle;
+ m_cameraPlane.rectTransform.localEulerAngles = m_camRotationVector;
+ // Unflip if vertically flipped
+ m_cameraPlane.uvRect = m_cameraTexture.videoVerticallyMirrored ? m_cameraFixedRect : m_cameraDefaultRect;
+ // Mirror front-facing camera's image horizontally to look more natural
+ if (Application.isEditor)
+ { m_cameraPlane.transform.localScale = m_cameraFixedScale;
+ m_cameraPlane.transform.localScale = m_currCamera.isFrontFacing ? m_cameraFixedScale : m_cameraDefaultScale;
+ public void ClickFlipCameraBtn()
+ m_isFrontFacing = !m_isFrontFacing;
+ StartCoroutine(StartCamera());
+ public void StopCamera()
+ { m_cameraTexture.Stop();
+ public void ClickCameraBtn()
+ m_currFileName = "Photo" + PlayerPrefs.GetInt("PhotoIdx", 0) + ".png";
+ ScreenCapture.CaptureScreenshot(m_currFileName);
+ PlayerPrefs.SetInt("PhotoIdx", PlayerPrefs.GetInt("PhotoIdx", 0) + 1);
+ Invoke("ShowUI", 0.2f);
+ public void ClickFilterBtn(FilterBtn filterBtn)
+ if (m_colorCorrectionLookup != null)
+ if (filterBtn.m_filter != null)
+ m_colorCorrectionLookup.enabled = true;
+ m_colorCorrectionLookup.Convert(filterBtn.m_filter, "");
+ m_colorCorrectionLookup.enabled = false;
+ { m_buttonPanel.SetActive(false);
+ { m_buttonPanel.SetActive(true);