using UnityEngine; using UnityEditor; namespace Klak.Hap { [CanEditMultipleObjects] [CustomEditor(typeof(HapPlayer))] sealed class HapPlayerEditor : Editor { SerializedProperty _filePath; SerializedProperty _pathMode; SerializedProperty _time; SerializedProperty _speed; SerializedProperty _loop; SerializedProperty _targetTexture; SerializedProperty _flipHorizontal; SerializedProperty _flipVertical; static class Labels { public static readonly GUIContent Property = new GUIContent("Property"); public static readonly GUIContent Select = new GUIContent("Select"); } string _sourceInfo; void ShowSourceInfo(HapPlayer player) { if (!player.enabled || !player.gameObject.activeInHierarchy) return; if (!player.isValid) { EditorGUILayout.HelpBox( "Failed to open file. " + "Please specify a valid HAP-encoded .mov file.", MessageType.Warning ); return; } if (_sourceInfo == null) _sourceInfo = string.Format( "Codec: {0}\n" + "Frame dimensions: {1} x {2}\n" + "Stream duration: {3:0.00}\n" + "Frame rate: {4:0.00}", player.codecType, player.frameWidth, player.frameHeight, player.streamDuration, player.frameCount / player.streamDuration ); EditorGUILayout.HelpBox(_sourceInfo, MessageType.None); } void OnEnable() { _filePath = serializedObject.FindProperty("_filePath"); _pathMode = serializedObject.FindProperty("_pathMode"); _time = serializedObject.FindProperty("_time"); _speed = serializedObject.FindProperty("_speed"); _loop = serializedObject.FindProperty("_loop"); _targetTexture = serializedObject.FindProperty("_targetTexture"); _flipHorizontal = serializedObject.FindProperty("_flipHorizontal"); _flipVertical = serializedObject.FindProperty("_flipVertical"); } public override void OnInspectorGUI() { var reload = false; serializedObject.Update(); // Source infomation if (!_filePath.hasMultipleDifferentValues && !_pathMode.hasMultipleDifferentValues && !string.IsNullOrEmpty(_filePath.stringValue)) { ShowSourceInfo((HapPlayer)target); } // Source file (드래그 앤 드롭 + 파일 브라우저) EditorGUILayout.BeginHorizontal(); EditorGUI.BeginChangeCheck(); EditorGUILayout.DelayedTextField(_filePath); if (GUILayout.Button("파일 선택", GUILayout.Width(80))) { string path = EditorUtility.OpenFilePanel("HAP MOV 파일 선택", Application.dataPath, "mov"); if (!string.IsNullOrEmpty(path)) { string streamingPath = Application.streamingAssetsPath; if (path.StartsWith(streamingPath)) path = path.Substring(streamingPath.Length + 1); _filePath.stringValue = path; } } EditorGUILayout.EndHorizontal(); if (EditorGUI.EndChangeCheck()) reload = true; // 드래그 앤 드롭 지원 Rect dropRect = GUILayoutUtility.GetLastRect(); if (Event.current.type == EventType.DragUpdated || Event.current.type == EventType.DragPerform) { if (dropRect.Contains(Event.current.mousePosition)) { DragAndDrop.visualMode = DragAndDropVisualMode.Copy; if (Event.current.type == EventType.DragPerform) { DragAndDrop.AcceptDrag(); foreach (var dragged in DragAndDrop.paths) { if (dragged.ToLower().EndsWith(".mov")) { string path = dragged; string streamingPath = Application.streamingAssetsPath; if (path.StartsWith(streamingPath)) path = path.Substring(streamingPath.Length + 1); _filePath.stringValue = path; GUI.FocusControl(null); reload = true; break; } } Event.current.Use(); } } } // Playback control EditorGUILayout.PropertyField(_time); EditorGUILayout.PropertyField(_speed); EditorGUILayout.PropertyField(_loop); // Flip options EditorGUILayout.Space(); EditorGUILayout.LabelField("Flip Options", EditorStyles.boldLabel); EditorGUILayout.PropertyField(_flipHorizontal, new GUIContent("Flip Horizontal")); EditorGUILayout.PropertyField(_flipVertical, new GUIContent("Flip Vertical")); // Target texture EditorGUILayout.PropertyField(_targetTexture); serializedObject.ApplyModifiedProperties(); if (reload) { foreach (HapPlayer hp in targets) { hp.SendMessage("OnDestroy"); hp.SendMessage("LateUpdate"); } _sourceInfo = null; } } } }