// Copyright HTC Corporation All Rights Reserved. using System.Collections.Generic; using System.IO; using UnityEditor; using UnityEngine; using VIVE.OpenXR.Toolkits.Spectator.Helper; namespace VIVE.OpenXR.Toolkits.Spectator { /// /// Name: SpectatorCameraManager.Editor.cs /// Role: General script use in Unity Editor only /// Responsibility: Display the SpectatorCameraManager.cs in Unity Inspector /// public partial class SpectatorCameraManager { [SerializeField] private Material spectatorCameraViewMaterial; /// /// Material that show the spectator camera view /// private Material SpectatorCameraViewMaterial { // get; private set; get => spectatorCameraViewMaterial; set { spectatorCameraViewMaterial = value; if (SpectatorCameraBased && value) { SpectatorCameraBased.SpectatorCameraViewMaterial = value; } } } #if UNITY_EDITOR [field: SerializeField] private bool IsShowHmdPart { get; set; } [field: SerializeField] private bool IsShowTrackerPart { get; set; } [field: SerializeField] private bool IsRequireLoadJsonFile { get; set; } [CustomEditor(typeof(SpectatorCameraManager))] public class SpectatorCameraManagerEditor : UnityEditor.Editor { private static readonly Color HighlightRegionBackgroundColor = new Color(.2f, .2f, .2f, .1f); private SerializedProperty IsShowHmdPart { get; set; } private SerializedProperty IsShowTrackerPart { get; set; } private SerializedProperty IsRequireLoadJsonFile { get; set; } private List JsonFileList { get; set; } private Vector2 JsonFileScrollViewVector { get; set; } private SerializedProperty IsSmoothCameraMovement { get; set; } private SerializedProperty SmoothCameraMovementSpeed { get; set; } private SerializedProperty PanoramaResolution { get; set; } private SerializedProperty PanoramaOutputFormat { get; set; } private SerializedProperty PanoramaOutputType { get; set; } private SerializedProperty SpectatorCameraPrefab { get; set; } private void OnEnable() { IsShowHmdPart = serializedObject.FindProperty(EditorHelper.PropertyName("IsShowHmdPart")); IsShowTrackerPart = serializedObject.FindProperty(EditorHelper.PropertyName("IsShowTrackerPart")); IsRequireLoadJsonFile = serializedObject.FindProperty(EditorHelper.PropertyName("IsRequireLoadJsonFile")); JsonFileList = new List(); JsonFileScrollViewVector = Vector2.zero; IsSmoothCameraMovement = serializedObject.FindProperty(EditorHelper.PropertyName("IsSmoothCameraMovement")); SmoothCameraMovementSpeed = serializedObject.FindProperty(EditorHelper.PropertyName("SmoothCameraMovementSpeed")); PanoramaResolution = serializedObject.FindProperty(EditorHelper.PropertyName("PanoramaResolution")); PanoramaOutputFormat = serializedObject.FindProperty(EditorHelper.PropertyName("PanoramaOutputFormat")); PanoramaOutputType = serializedObject.FindProperty(EditorHelper.PropertyName("PanoramaOutputType")); SpectatorCameraPrefab = serializedObject.FindProperty(EditorHelper.PropertyName("SpectatorCameraPrefab")); } public override void OnInspectorGUI() { // Just return if not "SpectatorCameraManager" class if (!(target is SpectatorCameraManager)) { return; } serializedObject.Update(); DrawGUI(); serializedObject.ApplyModifiedProperties(); } private void DrawGUI() { #region GUIStyle var labelStyle = new GUIStyle() { richText = true, alignment = TextAnchor.MiddleCenter, normal = new GUIStyleState { textColor = EditorGUIUtility.isProSkin ? Color.green : Color.black } }; var resetButtonStyle = new GUIStyle(GUI.skin.button) { fontStyle = FontStyle.Bold, normal = new GUIStyleState { textColor = EditorGUIUtility.isProSkin ? Color.yellow : Color.red }, hover = new GUIStyleState { textColor = Color.red }, active = new GUIStyleState { textColor = Color.cyan }, }; var boldButtonStyle = new GUIStyle(GUI.skin.button) { fontStyle = FontStyle.Bold }; #endregion var script = (SpectatorCameraManager)target; // Button for reset value if (GUILayout.Button("Reset to default value", resetButtonStyle)) { Undo.RecordObject(target, "Reset SpectatorCameraManager to default value"); EditorUtility.SetDirty(target); script.ResetSetting(); } // Button for export setting if (GUILayout.Button("Export Spectator Camera HMD Setting", boldButtonStyle)) { script.ExportSetting2JsonFile(SpectatorCameraHelper.AttributeFileLocation.ResourceFolder); AssetDatabase.Refresh(); } #region Load Setting From JSON File GUILayout.BeginHorizontal(); EditorGUI.BeginDisabledGroup(IsRequireLoadJsonFile.boolValue); if (GUILayout.Button("Load Setting From JSON File in Resources Folder", boldButtonStyle) || IsRequireLoadJsonFile.boolValue) { IsRequireLoadJsonFile.boolValue = true; var searchPattern = $"{SpectatorCameraHelper.ATTRIBUTE_FILE_PREFIX_NAME}*.{SpectatorCameraHelper.ATTRIBUTE_FILE_EXTENSION}"; if (JsonFileList == null) { JsonFileList = new List(); } JsonFileList.Clear(); var dir = new DirectoryInfo(Path.Combine(Application.dataPath, "Resources")); var files = dir.GetFiles(searchPattern); foreach (var item in files) { JsonFileList.Add(item.Name); } if (JsonFileList.Count == 0) { Debug.Log( "Can't find any JSON file related to the spectator camera setting in the Resources folder."); IsRequireLoadJsonFile.boolValue = false; } } EditorGUI.EndDisabledGroup(); if (IsRequireLoadJsonFile.boolValue) { if (GUILayout.Button("Cancel")) { IsRequireLoadJsonFile.boolValue = false; } } GUILayout.EndHorizontal(); if (IsRequireLoadJsonFile.boolValue) { Rect r = EditorGUILayout.BeginVertical(); JsonFileScrollViewVector = EditorGUILayout.BeginScrollView(JsonFileScrollViewVector, GUILayout.Width(r.width), GUILayout.Height(80)); for (int i = 0; i < JsonFileList.Count; i++) { if (GUILayout.Button(JsonFileList[i])) { var path = Path.Combine( System.IO.Path.Combine(Application.dataPath, "Resources"), JsonFileList[i]); Undo.RecordObject(target, $"Load {JsonFileList[i]} setting to {target.name} SpectatorCameraManager"); EditorUtility.SetDirty(target); script.LoadSettingFromJsonFile(path); } } EditorGUILayout.EndScrollView(); EditorGUILayout.EndVertical(); } #endregion EditorGUILayout.LabelField("\n"); // Spectator camera prefab EditorGUILayout.PropertyField(SpectatorCameraPrefab, new GUIContent("Spectator Camera Prefab")); if (SpectatorCameraPrefab.objectReferenceValue != null && PrefabUtility.GetPrefabAssetType(SpectatorCameraPrefab.objectReferenceValue) == PrefabAssetType.NotAPrefab) { // The assign object is scene object Debug.Log("Please assign the object as prefab only."); SpectatorCameraPrefab.objectReferenceValue = null; } EditorGUILayout.LabelField("\n"); EditorGUILayout.LabelField("[ General Setting ]", labelStyle); // Setting of spectator camera reference source // EditorGUILayout.PropertyField(CameraSourceRef, new GUIContent("Camera Source")); EditorGUI.BeginChangeCheck(); var currentCameraSourceRef = (SpectatorCameraHelper.CameraSourceRef) EditorGUILayout.EnumPopup("Camera Source", script.CameraSourceRef); if (EditorGUI.EndChangeCheck()) { Undo.RecordObject(target, "Modified SpectatorCameraManager CameraSourceRef"); EditorUtility.SetDirty(target); script.CameraSourceRef = currentCameraSourceRef; } #region Tracker Region if (script.CameraSourceRef == SpectatorCameraHelper.CameraSourceRef.Tracker) { EditorGUI.BeginChangeCheck(); var currentFollowSpectatorCameraTracker = EditorGUILayout.ObjectField( "Tracker", script.FollowSpectatorCameraTracker, typeof(SpectatorCameraTracker), true) as SpectatorCameraTracker; if (EditorGUI.EndChangeCheck()) { Undo.RecordObject(target, "Modified SpectatorCameraManager FollowSpectatorCameraTracker"); EditorUtility.SetDirty(target); script.FollowSpectatorCameraTracker = currentFollowSpectatorCameraTracker; } if (script.FollowSpectatorCameraTracker == null) { // The assign object is null EditorGUILayout.HelpBox("Please assign the SpectatorCameraTracker", MessageType.Info, false); } else if (PrefabUtility.GetPrefabAssetType(script.FollowSpectatorCameraTracker) != PrefabAssetType.NotAPrefab) { // Don't allow assign object is prefab Debug.Log("Please assign the scene object."); script.FollowSpectatorCameraTracker = null; } else { // The assign object is scene object => ok EditorGUILayout.LabelField("\n"); IsShowTrackerPart.boolValue = EditorGUILayout.Foldout(IsShowTrackerPart.boolValue, "Tracker Setting"); if (IsShowTrackerPart.boolValue) { // If show the tracker setting Rect r = EditorGUILayout.BeginVertical(); SpectatorCameraTracker trackerObject = script.FollowSpectatorCameraTracker; if (trackerObject != null) { EditorGUILayout.HelpBox( $"You are now editing the tracker setting in \"{trackerObject.gameObject.name}\" GameObject", MessageType.Info, true); EditorGUI.BeginChangeCheck(); var currentTrackerObjectLayerMask = LayerMaskHelper.LayerMaskDrawer.LayerMaskField("Camera Layer Mask", trackerObject.LayerMask); if (EditorGUI.EndChangeCheck()) { Undo.RecordObject(trackerObject, $"Modified {trackerObject.name} LayerMask"); EditorUtility.SetDirty(trackerObject); trackerObject.LayerMask = currentTrackerObjectLayerMask; } EditorGUI.BeginChangeCheck(); var currentTrackerObjectIsSmoothCameraMovement= EditorGUILayout.Toggle("Enable Smoothing Camera Movement", trackerObject.IsSmoothCameraMovement); if (EditorGUI.EndChangeCheck()) { Undo.RecordObject(trackerObject, $"Modified {trackerObject.name} IsSmoothCameraMovement"); EditorUtility.SetDirty(trackerObject); trackerObject.IsSmoothCameraMovement = currentTrackerObjectIsSmoothCameraMovement; } if (trackerObject.IsSmoothCameraMovement) { EditorGUILayout.LabelField("\n"); EditorGUILayout.LabelField("[ Smooth Camera Movement Speed Setting ]", labelStyle); EditorGUI.BeginChangeCheck(); var currentTrackerObjectSmoothCameraMovementSpeed = EditorGUILayout.IntSlider( new GUIContent("Speed of Smoothing Camera Movement"), trackerObject.SmoothCameraMovementSpeed, SpectatorCameraHelper.SMOOTH_CAMERA_MOVEMENT_MIN, SpectatorCameraHelper.SMOOTH_CAMERA_MOVEMENT_MAX); if (EditorGUI.EndChangeCheck()) { Undo.RecordObject(trackerObject, $"Modified {trackerObject.name} SmoothCameraMovementSpeed"); EditorUtility.SetDirty(trackerObject); trackerObject.SmoothCameraMovementSpeed = currentTrackerObjectSmoothCameraMovementSpeed; } EditorGUILayout.LabelField("\n"); } EditorGUI.BeginChangeCheck(); // Spectator camera frustum show/hide var currentTrackerObjectIsFrustumShowed = EditorGUILayout.Toggle("Enable Camera FOV Frustum", trackerObject.IsFrustumShowed); if (EditorGUI.EndChangeCheck()) { Undo.RecordObject(trackerObject, $"Modified {trackerObject.name} IsFrustumShowed"); EditorUtility.SetDirty(trackerObject); trackerObject.IsFrustumShowed = currentTrackerObjectIsFrustumShowed; } EditorGUILayout.LabelField("\n"); #region VerticalFov EditorGUILayout.LabelField("[ Vertical FOV Setting ]", labelStyle); EditorGUI.BeginChangeCheck(); var currentTrackerObjectVerticalFov = EditorGUILayout.Slider( "Vertical FOV", trackerObject.VerticalFov, SpectatorCameraHelper.VERTICAL_FOV_MIN, SpectatorCameraHelper.VERTICAL_FOV_MAX); if (EditorGUI.EndChangeCheck()) { Undo.RecordObject(trackerObject, $"Modified {trackerObject.name} VerticalFov"); EditorUtility.SetDirty(trackerObject); trackerObject.VerticalFov = currentTrackerObjectVerticalFov; } #endregion EditorGUILayout.LabelField("\n"); #region Setting related to panorama capturing of spectator camera // Panorama resolution EditorGUILayout.LabelField("[ Panorama Setting ]", labelStyle); EditorGUI.BeginChangeCheck(); // Panorama output resolution var currentTrackerObjectPanoramaResolution = (SpectatorCameraHelper.SpectatorCameraPanoramaResolution) EditorGUILayout.EnumPopup("Resolution", trackerObject.PanoramaResolution); if (EditorGUI.EndChangeCheck()) { Undo.RecordObject(trackerObject, $"Modified {trackerObject.name} PanoramaResolution"); EditorUtility.SetDirty(trackerObject); trackerObject.PanoramaResolution = currentTrackerObjectPanoramaResolution; } EditorGUI.BeginChangeCheck(); // Panorama output format var currentTrackerObjectPanoramaOutputFormat = (TextureProcessHelper.PictureOutputFormat) EditorGUILayout.EnumPopup("Output Format", trackerObject.PanoramaOutputFormat); if (EditorGUI.EndChangeCheck()) { Undo.RecordObject(trackerObject, $"Modified {trackerObject.name} PanoramaOutputFormat"); EditorUtility.SetDirty(trackerObject); trackerObject.PanoramaOutputFormat = currentTrackerObjectPanoramaOutputFormat; } EditorGUI.BeginChangeCheck(); // Panorama output type var currentTrackerObjectPanoramaOutputType = (TextureProcessHelper.PanoramaType) EditorGUILayout.EnumPopup("Output Type", trackerObject.PanoramaOutputType); if (EditorGUI.EndChangeCheck()) { Undo.RecordObject(trackerObject, $"Modified {trackerObject.name} PanoramaOutputType"); EditorUtility.SetDirty(trackerObject); trackerObject.PanoramaOutputType = currentTrackerObjectPanoramaOutputType; } #endregion EditorGUILayout.LabelField("\n"); #region Setting related to frustum if (trackerObject.IsFrustumShowed) { EditorGUILayout.LabelField("[ Frustum Setting ]", labelStyle); #region Count of frustum and frustum center line EditorGUI.BeginChangeCheck(); var currentTrackerObjectFrustumLineCount = (SpectatorCameraHelper.FrustumLineCount) EditorGUILayout.EnumPopup("Frustum Line Total", trackerObject.FrustumLineCount); if (EditorGUI.EndChangeCheck()) { Undo.RecordObject(trackerObject, $"Modified {trackerObject.name} FrustumLineCount"); EditorUtility.SetDirty(trackerObject); trackerObject.FrustumLineCount = currentTrackerObjectFrustumLineCount; } EditorGUI.BeginChangeCheck(); var currentTrackerObjectFrustumCenterLineCount = (SpectatorCameraHelper.FrustumCenterLineCount) EditorGUILayout.EnumPopup("Frustum Center Line Total", trackerObject.FrustumCenterLineCount); if (EditorGUI.EndChangeCheck()) { Undo.RecordObject(trackerObject, $"Modified {trackerObject.name} FrustumCenterLineCount"); EditorUtility.SetDirty(trackerObject); trackerObject.FrustumCenterLineCount = currentTrackerObjectFrustumCenterLineCount; } #endregion EditorGUILayout.LabelField("\n"); #region Width of frustum and frustum center line EditorGUI.BeginChangeCheck(); var currentTrackerObjectFrustumLineWidth = EditorGUILayout.Slider( "Frustum Line Width", trackerObject.FrustumLineWidth, SpectatorCameraHelper.FRUSTUM_LINE_WIDTH_MIN, SpectatorCameraHelper.FRUSTUM_LINE_WIDTH_MAX); if (EditorGUI.EndChangeCheck()) { Undo.RecordObject(trackerObject, $"Modified {trackerObject.name} FrustumLineWidth"); EditorUtility.SetDirty(trackerObject); trackerObject.FrustumLineWidth = currentTrackerObjectFrustumLineWidth; } EditorGUI.BeginChangeCheck(); var currentTrackerObjectFrustumCenterLineWidth = EditorGUILayout.Slider( "Frustum Center Line Width", trackerObject.FrustumCenterLineWidth, SpectatorCameraHelper.FRUSTUM_CENTER_LINE_WIDTH_MIN, SpectatorCameraHelper.FRUSTUM_CENTER_LINE_WIDTH_MAX); if (EditorGUI.EndChangeCheck()) { Undo.RecordObject(trackerObject, $"Modified {trackerObject.name} FrustumCenterLineWidth"); EditorUtility.SetDirty(trackerObject); trackerObject.FrustumCenterLineWidth = currentTrackerObjectFrustumCenterLineWidth; } #endregion EditorGUILayout.LabelField("\n"); #region Material of frustum and frustum center line EditorGUI.BeginChangeCheck(); var currentTrackerObjectFrustumLineColor = EditorGUILayout.ColorField( "Frustum Line Color", trackerObject.FrustumLineColor); if (EditorGUI.EndChangeCheck()) { Undo.RecordObject(trackerObject, $"Modified {trackerObject.name} FrustumLineColor"); EditorUtility.SetDirty(trackerObject); trackerObject.FrustumLineColor = currentTrackerObjectFrustumLineColor; } EditorGUI.BeginChangeCheck(); var currentTrackerObjectFrustumCenterLineColor = EditorGUILayout.ColorField( "Frustum Center Line Color", trackerObject.FrustumCenterLineColor); if (EditorGUI.EndChangeCheck()) { Undo.RecordObject(trackerObject, $"Modified {trackerObject.name} FrustumCenterLineColor"); EditorUtility.SetDirty(trackerObject); trackerObject.FrustumCenterLineColor = currentTrackerObjectFrustumCenterLineColor; } #endregion } #endregion EditorGUILayout.EndVertical(); r = new Rect(r.x, r.y, r.width, r.height); EditorGUI.DrawRect(r, HighlightRegionBackgroundColor); EditorGUILayout.LabelField("\n"); } } } } #endregion #region HMD Region IsShowHmdPart.boolValue = EditorGUILayout.Foldout(IsShowHmdPart.boolValue, "HMD Setting"); if (IsShowHmdPart.boolValue) { Rect r = EditorGUILayout.BeginVertical(); EditorGUI.BeginChangeCheck(); // Setting of spectator camera layer mask var currentLayerMask = LayerMaskHelper.LayerMaskDrawer.LayerMaskField("Camera Layer Mask", script.LayerMask); if (EditorGUI.EndChangeCheck()) { Undo.RecordObject(target, "Modified SpectatorCameraManager LayerMask"); EditorUtility.SetDirty(target); script.LayerMask = currentLayerMask; } // Setting of smooth spectator camera movement EditorGUILayout.PropertyField(IsSmoothCameraMovement, new GUIContent("Enable Smoothing Camera Movement")); if (IsSmoothCameraMovement.boolValue) { EditorGUILayout.LabelField("\n"); EditorGUILayout.LabelField("[ Smooth Camera Movement Speed Setting ]", labelStyle); // Setting of smooth spectator camera movement speed EditorGUILayout.IntSlider( SmoothCameraMovementSpeed, SpectatorCameraHelper.SMOOTH_CAMERA_MOVEMENT_MIN, SpectatorCameraHelper.SMOOTH_CAMERA_MOVEMENT_MAX, "Speed of Smoothing Camera Movement"); EditorGUILayout.LabelField("\n"); } EditorGUI.BeginChangeCheck(); // Spectator camera frustum show/hide var currentIsFrustumShowed = EditorGUILayout.Toggle("Enable Camera FOV Frustum", script.IsFrustumShowed); if (EditorGUI.EndChangeCheck()) { Undo.RecordObject(target, "Modified SpectatorCameraManager IsFrustumShowed"); EditorUtility.SetDirty(target); script.IsFrustumShowed = currentIsFrustumShowed; } EditorGUILayout.LabelField("\n"); #region VerticalFov EditorGUILayout.LabelField("[ Vertical FOV Setting ]", labelStyle); EditorGUI.BeginChangeCheck(); // FOV var currentVerticalFov = EditorGUILayout.Slider( "Vertical FOV", script.VerticalFov, SpectatorCameraHelper.VERTICAL_FOV_MIN, SpectatorCameraHelper.VERTICAL_FOV_MAX); if (EditorGUI.EndChangeCheck()) { Undo.RecordObject(target, "Modified SpectatorCameraManager VerticalFov"); EditorUtility.SetDirty(target); script.VerticalFov = currentVerticalFov; } #endregion EditorGUILayout.LabelField("\n"); #region Setting related to panorama capturing of spectator camera // Panorama resolution EditorGUILayout.LabelField("[ Panorama Setting ]", labelStyle); EditorGUILayout.PropertyField(PanoramaResolution, new GUIContent("Resolution")); // Panorama output format EditorGUILayout.PropertyField(PanoramaOutputFormat, new GUIContent("Output Format")); // Panorama output type EditorGUILayout.PropertyField(PanoramaOutputType, new GUIContent("Output Type")); #endregion #region Setting related to frustum if (script.IsFrustumShowed) { EditorGUILayout.LabelField("\n"); EditorGUILayout.LabelField("[ Frustum Setting ]", labelStyle); EditorGUI.BeginChangeCheck(); // Count of frustum line var currentFrustumLineCount = (SpectatorCameraHelper.FrustumLineCount) EditorGUILayout.EnumPopup("Frustum Line Total", script.FrustumLineCount); if (EditorGUI.EndChangeCheck()) { Undo.RecordObject(target, "Modified SpectatorCameraManager FrustumLineCount"); EditorUtility.SetDirty(target); script.FrustumLineCount = currentFrustumLineCount; } EditorGUI.BeginChangeCheck(); // Count of frustum center line var currentFrustumCenterLineCount = (SpectatorCameraHelper.FrustumCenterLineCount) EditorGUILayout.EnumPopup("Frustum Center Line Total", script.FrustumCenterLineCount); if (EditorGUI.EndChangeCheck()) { Undo.RecordObject(target, "Modified SpectatorCameraManager FrustumCenterLineCount"); EditorUtility.SetDirty(target); script.FrustumCenterLineCount = currentFrustumCenterLineCount; } EditorGUILayout.LabelField("\n"); EditorGUI.BeginChangeCheck(); // Width of frustum line var currentFrustumLineWidth = EditorGUILayout.Slider( "Frustum Line Width", script.FrustumLineWidth, SpectatorCameraHelper.FRUSTUM_LINE_WIDTH_MIN, SpectatorCameraHelper.FRUSTUM_LINE_WIDTH_MAX); if (EditorGUI.EndChangeCheck()) { Undo.RecordObject(target, "Modified SpectatorCameraManager FrustumLineWidth"); EditorUtility.SetDirty(target); script.FrustumLineWidth = currentFrustumLineWidth; } EditorGUI.BeginChangeCheck(); // Width of frustum center line var currentFrustumCenterLineWidth = EditorGUILayout.Slider( "Frustum Center Line Width", script.FrustumCenterLineWidth, SpectatorCameraHelper.FRUSTUM_CENTER_LINE_WIDTH_MIN, SpectatorCameraHelper.FRUSTUM_CENTER_LINE_WIDTH_MAX); if (EditorGUI.EndChangeCheck()) { Undo.RecordObject(target, "Modified SpectatorCameraManager FrustumCenterLineWidth"); EditorUtility.SetDirty(target); script.FrustumCenterLineWidth = currentFrustumCenterLineWidth; } EditorGUILayout.LabelField("\n"); EditorGUI.BeginChangeCheck(); // Color of frustum line var currentFrustumLineColor = EditorGUILayout.ColorField( "Frustum Line Color", script.FrustumLineColor); if (EditorGUI.EndChangeCheck()) { Undo.RecordObject(target, "Modified SpectatorCameraManager FrustumLineColor"); EditorUtility.SetDirty(target); script.FrustumLineColor = currentFrustumLineColor; } EditorGUI.BeginChangeCheck(); // Color of frustum center line var currentFrustumCenterLineColor = EditorGUILayout.ColorField( "Frustum Center Line Color", script.FrustumCenterLineColor); if (EditorGUI.EndChangeCheck()) { Undo.RecordObject(target, "Modified SpectatorCameraManager FrustumCenterLineColor"); EditorUtility.SetDirty(target); script.FrustumCenterLineColor = currentFrustumCenterLineColor; } } #endregion EditorGUILayout.EndVertical(); r = new Rect(r.x, r.y, r.width, r.height); EditorGUI.DrawRect(r, HighlightRegionBackgroundColor); } #endregion EditorGUILayout.LabelField("\n"); #region Test 360 Output EditorGUILayout.LabelField("[ Debug Setting ]", labelStyle); EditorGUI.BeginChangeCheck(); var currentSpectatorCameraViewMaterial = EditorGUILayout.ObjectField( "Spectator Camera View Material", script.SpectatorCameraViewMaterial, typeof(Material), false) as Material; if (EditorGUI.EndChangeCheck()) { Undo.RecordObject(target, "Modified SpectatorCameraManager SpectatorCameraViewMaterial"); EditorUtility.SetDirty(target); script.SpectatorCameraViewMaterial = currentSpectatorCameraViewMaterial; } EditorGUILayout.HelpBox("Test - Output 360 photo", MessageType.Info, true); if (GUILayout.Button("Test - Output 360 photo")) { script.CaptureSpectatorCamera360Photo(); } #endregion } } #endif } }