Files
Fishing2/Assets/CharacterCustomizer/UI/Scripts/Option_Slider.cs
2025-09-18 00:07:48 +08:00

129 lines
4.0 KiB
C#

using UnityEngine;
using UnityEngine.UI;
namespace CC
{
public class Option_Slider : MonoBehaviour, ICustomizerUI
{
public enum Type
{ Blendshape, Scalar, ModifyType };
public Type CustomizationType;
public CC_Property Property;
public Vector2 Range = new Vector2(0, 1);
public float DefaultValue = 0f;
public string DisplayOption = "Option";
public bool UsesDragCustomization;
public float dragMultiplier = 1f;
private Slider slider;
private CharacterCustomization customizer;
private CC_UI_Util parentUI;
#if UNITY_EDITOR
private void OnValidate()
{
UnityEditor.EditorApplication.delayCall += OnValidateCallback;
}
private void OnValidateCallback()
{
if (this == null || Application.isPlaying)
{
UnityEditor.EditorApplication.delayCall -= OnValidateCallback;
return;
}
slider = GetComponentInChildren<Slider>();
slider.minValue = Range.x;
slider.maxValue = Range.y;
slider.SetValueWithoutNotify(DefaultValue);
GetComponentInChildren<TMPro.TMP_Text>(true).text = DisplayOption;
gameObject.name = "Slider_" + DisplayOption;
}
#endif
public void InitializeUIElement(CharacterCustomization customizerScript, CC_UI_Util ParentUI)
{
slider = GetComponentInChildren<Slider>();
customizer = customizerScript;
parentUI = ParentUI;
if (UsesDragCustomization) CC_UI_Manager.instance.onDrag += onBodyCustomization;
slider.onValueChanged.AddListener(setProperty);
RefreshUIElement();
}
private void onBodyCustomization(string partX, string partY, float deltaX, float deltaY, bool first, bool last)
{
if (partX == Property.propertyName)
{
slider.value += deltaX * dragMultiplier;
}
if (partY == Property.propertyName)
{
slider.value += deltaY * dragMultiplier;
}
}
public void RefreshUIElement()
{
//Get saved value
switch (CustomizationType)
{
case Type.Blendshape:
case Type.ModifyType:
{
if (customizer.findProperty(customizer.StoredCharacterData.Blendshapes, Property, out Property, out int savedIndex))
{
slider.SetValueWithoutNotify(Property.floatValue);
}
else
{
slider.SetValueWithoutNotify(DefaultValue);
}
break;
}
case Type.Scalar:
{
if (customizer.findProperty(customizer.StoredCharacterData.FloatProperties, Property, out Property, out int savedIndex))
{
slider.SetValueWithoutNotify(Property.floatValue);
}
else
{
slider.SetValueWithoutNotify(DefaultValue);
}
break;
}
}
}
public void setProperty(float value)
{
Property.floatValue = value;
switch (CustomizationType)
{
case Type.Blendshape:
case Type.ModifyType:
{
customizer.setBlendshapeByName(Property.propertyName, value);
break;
}
case Type.Scalar:
{
customizer.setFloatProperty(Property, true);
break;
}
}
}
}
}