using System.Collections; using System.Collections.Generic; using System.Linq; 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; [HideInInspector] public bool lerp = true; [HideInInspector] public float lerpSeconds = 2; private float _lerpValue; private float _lerpTime; private bool _isLerping; public BlendShapesManager BlendShapesManager => GetBlendShapesManager(); private BlendShapesManager _blendShapesManager; private BlendShapesManager GetBlendShapesManager() { if (_blendShapesManager != null) return _blendShapesManager; if (TryGetComponent(out BlendShapesManager foundManager)) _blendShapesManager = foundManager; return _blendShapesManager; } public void StartTransitionToPreset(BlendShapePreset preset) { Debug.Log($"Start Transition to Preset {preset.name}"); SetToAndFromValues(preset); // save the current value and the "to" value on this preset _lerpValue = 0f; // reset this _lerpTime = 0f; // reset this _isLerping = true; // set this on StartCoroutine(nameof(LerpToPreset)); // Start the coroutine } public void StartTransitionToPreset(int presetIndex) { if (presetIndex < 0 || presets.Count <= presetIndex) { Debug.LogError($"Index {presetIndex} is out of range"); return; } StartTransitionToPreset(presets[presetIndex]); } public void StartTransitionToPreset(string presetName) { var foundPreset = presets.FirstOrDefault(x => x.name == presetName); if (foundPreset == null) { Debug.LogError($"No preset found named {presetName}"); return; } StartTransitionToPreset(foundPreset); } IEnumerator LerpToPreset() { while (_isLerping) { _lerpTime += Time.deltaTime / lerpSeconds; _lerpValue = Mathf.Lerp(0, 1, _lerpTime); BlendShapesManager.LerpToValue(_lerpValue); if (_lerpValue >= 1) break; yield return null; } } public void ValueBetweenTwoPresets(float value, BlendShapePreset from, BlendShapePreset to) { } /// /// 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); } } public void SetToAndFromValues(BlendShapePreset preset) { BlendShapesManager.SetToAndFromValues(preset); } /// /// 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; } }