public override Action AddAction() { var result = new VisemeAction(); actions.Add(result); return(result); }
void BuildLayer(AnimationLayer layerType, string layerName, List <VisemeAction> actions, MenuActions.MenuAction parentAction) { var controller = GetController(layerType); var VisemeValues = System.Enum.GetValues(typeof(VisemeEnum)).Cast <VisemeEnum>(); //Add parameter AddParameter(controller, "Viseme", AnimatorControllerParameterType.Int, 0); //Prepare layer var layer = GetControllerLayer(controller, layerName); layer.stateMachine.entryTransitions = null; layer.stateMachine.anyStateTransitions = null; layer.stateMachine.states = null; layer.stateMachine.entryPosition = StatePosition(-1, 0); layer.stateMachine.anyStatePosition = StatePosition(-1, 1); layer.stateMachine.exitPosition = StatePosition(-1, 2); //Default AnimatorState defaultState = null; VisemeAction defaultAction = null; var unusedValues = new List <VisemeEnum>(); foreach (var value in VisemeValues) { unusedValues.Add(value); } //Build states int actionIter = 0; foreach (var action in this.actions) { //Check if valid if (!action.visimeTable.IsModified()) { EditorUtility.DisplayDialog("Build Warning", $"Visemes {action.name} has no selected conditions.", "Okay"); continue; } //Build var state = layer.stateMachine.AddState(action.name, StatePosition(0, actionIter + 1)); state.motion = action.GetAnimation(layerType, true); actionIter += 1; //Conditions foreach (var value in VisemeValues) { AddCondition(value); } void AddCondition(BaseActions.VisemeEnum visime) { if (action.visimeTable.GetValue(visime)) { //Transition var transition = layer.stateMachine.AddAnyStateTransition(state); transition.hasExitTime = false; transition.exitTime = 0; transition.duration = action.fadeIn; transition.canTransitionToSelf = false; transition.AddCondition(AnimatorConditionMode.Equals, (int)visime, "Viseme"); //Parent if (parentAction != null) { parentAction.AddCondition(transition, true); } //Cleanup unusedValues.Remove(visime); } } //Store default if (action.visimeTable.sil) { defaultState = state; defaultAction = action; } } //Default state if (defaultState == null) { defaultState = layer.stateMachine.AddState("Default", StatePosition(0, 0)); } layer.stateMachine.defaultState = defaultState; //Animation Layer Weight var layerWeight = defaultState.AddStateMachineBehaviour <VRC.SDK3.Avatars.Components.VRCAnimatorLayerControl>(); layerWeight.goalWeight = 1; layerWeight.layer = GetLayerIndex(controller, layer); layerWeight.blendDuration = 0; layerWeight.playable = VRC.SDKBase.VRC_AnimatorLayerControl.BlendableLayer.FX; //Default transitions foreach (var visime in unusedValues) { //Transition var transition = layer.stateMachine.AddAnyStateTransition(defaultState); transition.hasExitTime = false; transition.exitTime = 0; transition.duration = defaultAction != null ? defaultAction.fadeIn : 0f; transition.canTransitionToSelf = false; transition.AddCondition(AnimatorConditionMode.Equals, (int)visime, "Viseme"); } //Parent if (parentAction != null) { var transition = layer.stateMachine.AddAnyStateTransition(defaultState); transition.hasExitTime = false; transition.exitTime = 0; transition.duration = defaultAction != null ? defaultAction.fadeIn : 0f; transition.canTransitionToSelf = false; parentAction.AddCondition(transition, false); } }