You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
CrowdControl/Assets/Feel/NiceVibrations/Scripts/Editor/HapticSourceInspector.cs

156 lines
6.1 KiB
C#

2 months ago
// Copyright (c) Meta Platforms, Inc. and affiliates.
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;
using System.IO;
namespace Lofelt.NiceVibrations
{
[CustomEditor(typeof(HapticSource))]
[CanEditMultipleObjects]
/// <summary>
/// Provides an inspector for the HapticSource component
/// </summary>
///
/// The inspector lets you link a HapticSource to a HapticClip.
public class HapticSourceInspector : Editor
{
string hapticsDirectory;
SerializedProperty hapticClip;
SerializedProperty priority;
SerializedProperty level;
SerializedProperty frequencyShift;
SerializedProperty loop;
SerializedProperty fallbackPreset;
public static GUIContent hapticClipLabel = EditorGUIUtility.TrTextContent("Haptic Clip", "The HapticClip asset played by the HapticSource.");
public static GUIContent fallbackPresetLabel = EditorGUIUtility.TrTextContent("Haptic Preset fallback", "Set the haptic preset to play in case the device doesn't support playback of haptic clips");
public static GUIContent loopLabel = EditorGUIUtility.TrTextContent("Loop", "Set the haptic source to loop playback of the haptic clip");
void OnEnable()
{
hapticClip = serializedObject.FindProperty("clip");
priority = serializedObject.FindProperty("priority");
level = serializedObject.FindProperty("_level");
frequencyShift = serializedObject.FindProperty("_frequencyShift");
fallbackPreset = serializedObject.FindProperty("_fallbackPreset");
loop = serializedObject.FindProperty("_loop");
}
public override void OnInspectorGUI()
{
serializedObject.Update();
EditorGUILayout.BeginHorizontal();
EditorGUILayout.PropertyField(hapticClip, hapticClipLabel);
EditorGUILayout.EndHorizontal();
EditorGUILayout.Space();
EditorGUILayout.BeginHorizontal();
EditorGUILayout.PropertyField(fallbackPreset, fallbackPresetLabel);
EditorGUILayout.EndHorizontal();
EditorGUILayout.Space();
EditorGUILayout.BeginHorizontal();
EditorGUILayout.PropertyField(loop, loopLabel);
EditorGUILayout.EndHorizontal();
EditorGUILayout.Space();
CreatePrioritySlider();
CreateLevelSlider();
CreateFrequencyShiftSlider();
serializedObject.ApplyModifiedProperties();
}
/// Helper function to create a priority slider for haptic source with High and Max text labels.
void CreatePrioritySlider()
{
Rect position = EditorGUILayout.GetControlRect(true, EditorGUIUtility.singleLineHeight);
EditorGUI.IntSlider(position, priority, 0, 256);
// Move to next line
position.y += EditorGUIUtility.singleLineHeight;
// Subtract the label
position.x += EditorGUIUtility.labelWidth;
position.width -= EditorGUIUtility.labelWidth;
// Subtract the text field width thats drawn with slider
position.width -= EditorGUIUtility.fieldWidth;
GUIStyle style = GUI.skin.label;
TextAnchor defaultAlignment = GUI.skin.label.alignment;
style.alignment = TextAnchor.UpperLeft; EditorGUI.LabelField(position, "High", style);
style.alignment = TextAnchor.UpperRight; EditorGUI.LabelField(position, "Low", style);
GUI.skin.label.alignment = defaultAlignment;
// Allow space for the High/Low labels
EditorGUILayout.Space();
EditorGUILayout.Space();
EditorGUILayout.Space();
}
/// Helper function to create a level slider for haptic
/// source with labels.
void CreateLevelSlider()
{
Rect position = EditorGUILayout.GetControlRect(true, EditorGUIUtility.singleLineHeight);
EditorGUI.Slider(position, level, 0.0f, 5.0f);
// Move to next line
position.y += EditorGUIUtility.singleLineHeight;
// Subtract the label
position.x += EditorGUIUtility.labelWidth;
position.width -= EditorGUIUtility.labelWidth;
// Subtract the text field width thats drawn with slider
position.width -= EditorGUIUtility.fieldWidth;
GUIStyle style = GUI.skin.label;
TextAnchor defaultAlignment = GUI.skin.label.alignment;
style.alignment = TextAnchor.UpperLeft; EditorGUI.LabelField(position, "0.0", style);
style.alignment = TextAnchor.UpperRight; EditorGUI.LabelField(position, "5.0", style);
GUI.skin.label.alignment = defaultAlignment;
// Allow space for the labels
EditorGUILayout.Space();
EditorGUILayout.Space();
EditorGUILayout.Space();
}
/// Helper function to create a frequency shift slider for haptic
/// source with labels.
void CreateFrequencyShiftSlider()
{
Rect position = EditorGUILayout.GetControlRect(true, EditorGUIUtility.singleLineHeight);
EditorGUI.Slider(position, frequencyShift, -1.0f, 1.0f);
// Move to next line
position.y += EditorGUIUtility.singleLineHeight;
// Subtract the label
position.x += EditorGUIUtility.labelWidth;
position.width -= EditorGUIUtility.labelWidth;
// Subtract the text field width thats drawn with slider
position.width -= EditorGUIUtility.fieldWidth;
GUIStyle style = GUI.skin.label;
TextAnchor defaultAlignment = GUI.skin.label.alignment;
style.alignment = TextAnchor.UpperLeft; EditorGUI.LabelField(position, "-1.0", style);
style.alignment = TextAnchor.UpperRight; EditorGUI.LabelField(position, "1.0", style);
GUI.skin.label.alignment = defaultAlignment;
// Allow space for the labels
EditorGUILayout.Space();
EditorGUILayout.Space();
EditorGUILayout.Space();
}
}
}