using System.Collections.Generic; using UnityEngine; namespace InfinityPBR { [RequireComponent(typeof(BlendShapesManager))] [System.Serializable] public class BlendShapesPresetManager : MonoBehaviour { public List presets = new List(); [HideInInspector] public string[] onTriggerMode = new[] {"Explicit", "Random"}; [HideInInspector] public List shapeList = new List(); [HideInInspector] public string[] shapeListNames; [HideInInspector] public int shapeListIndex = 0; [HideInInspector] public bool showHelpBoxes = true; [HideInInspector] public bool showFullInspector = false; [HideInInspector] public bool showSetup = true; public BlendShapesManager BlendShapesManager => GetBlendShapesManager(); private BlendShapesManager _blendShapesManager; private BlendShapesManager GetBlendShapesManager() { if (_blendShapesManager != null) return _blendShapesManager; if (TryGetComponent(out BlendShapesManager foundManager)) _blendShapesManager = foundManager; return _blendShapesManager; } /// /// Activates an individual preset /// /// public void ActivatePreset(int index) { for (int v = 0; v < presets[index].presetValues.Count; v++) { BlendShapePresetValue presetValue = presets[index].presetValues[v]; BlendShapeGameObject obj = BlendShapesManager.GetBlendShapeObject(presetValue.objectName); BlendShapeValue value = BlendShapesManager.GetBlendShapeValue(obj, presetValue.valueTriggerName); value.value = presetValue.onTriggerMode == "Explicit" ? presetValue.shapeValue : Random.Range(presetValue.limitMin, presetValue.limitMax); BlendShapesManager.TriggerShape(obj,value); } } /// /// Activates an individual named preset /// /// public void ActivatePreset(string name) { for (int i = 0; i < presets.Count; i++) { if (presets[i].name != name) continue; ActivatePreset(i); return; } } } [System.Serializable] public class BlendShapePreset { public string name; public List presetValues = new List(); [HideInInspector] public bool showValues = false; } [System.Serializable] public class BlendShapePresetValue { public string objectName; public string valueTriggerName; public string onTriggerMode; [HideInInspector] public int onTriggerModeIndex = 0; public float shapeValue; public float limitMin; public float limitMax; public float min; public float max; } [System.Serializable] public class Shape { public BlendShapeGameObject obj; public BlendShapeValue value; } }