public AddCondition ( AnimatorStateTransition transition, bool equals ) : void | ||
transition | AnimatorStateTransition | |
equals | bool | |
return | void |
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); } }
void BuildLayer(AnimationLayer layerType, string layerName, List <GestureAction> actions, MenuActions.MenuAction parentAction) { var controller = GetController(layerType); //Add parameter if (side == GestureSide.Left || side == GestureSide.Both) { AddParameter(controller, "GestureLeft", AnimatorControllerParameterType.Int, 0); } if (side == GestureSide.Right || side == GestureSide.Both) { AddParameter(controller, "GestureRight", 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 state AnimatorState defaultState = null; GestureAction defaultAction = null; var unusedGestures = new List <GestureEnum>(); unusedGestures.Add(GestureEnum.Neutral); unusedGestures.Add(GestureEnum.Fist); unusedGestures.Add(GestureEnum.OpenHand); unusedGestures.Add(GestureEnum.FingerPoint); unusedGestures.Add(GestureEnum.Victory); unusedGestures.Add(GestureEnum.RockNRoll); unusedGestures.Add(GestureEnum.HandGun); unusedGestures.Add(GestureEnum.ThumbsUp); //Build states int actionIter = 0; foreach (var action in this.actions) { //Check if valid if (!action.gestureTable.IsModified()) { EditorUtility.DisplayDialog("Build Warning", $"Simple Gesture {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 AddGestureCondition(GestureEnum.Neutral); AddGestureCondition(GestureEnum.Fist); AddGestureCondition(GestureEnum.OpenHand); AddGestureCondition(GestureEnum.FingerPoint); AddGestureCondition(GestureEnum.Victory); AddGestureCondition(GestureEnum.RockNRoll); AddGestureCondition(GestureEnum.HandGun); AddGestureCondition(GestureEnum.ThumbsUp); void AddGestureCondition(BaseActions.GestureEnum gesture) { if (!action.gestureTable.GetValue(gesture)) { return; } //Transition var transition = layer.stateMachine.AddAnyStateTransition(state); transition.hasExitTime = false; transition.exitTime = 0; transition.duration = action.fadeIn; if (side == GestureSide.Left || side == GestureSide.Both) { transition.AddCondition(AnimatorConditionMode.Equals, (int)gesture, "GestureLeft"); } if (side == GestureSide.Right || side == GestureSide.Both) { transition.AddCondition(AnimatorConditionMode.Equals, (int)gesture, "GestureRight"); } //Parent if (parentAction != null && gesture != GestureEnum.Neutral) { parentAction.AddCondition(transition, true); } //Cleanup unusedGestures.Remove(gesture); } //Default if (action.gestureTable.neutral) { defaultState = state; defaultAction = action; } } //Default state if (defaultState == null) { defaultState = layer.stateMachine.AddState("Neutral", 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 gesture in unusedGestures) { //Transition var transition = layer.stateMachine.AddAnyStateTransition(defaultState); transition.hasExitTime = false; transition.exitTime = 0; transition.duration = defaultAction != null ? defaultAction.fadeIn : 0f; if (side == GestureSide.Left || side == GestureSide.Both) { transition.AddCondition(AnimatorConditionMode.Equals, (int)gesture, "GestureLeft"); } if (side == GestureSide.Right || side == GestureSide.Both) { transition.AddCondition(AnimatorConditionMode.Equals, (int)gesture, "GestureRight"); } } //Parent if (parentAction != null) { var transition = layer.stateMachine.AddAnyStateTransition(defaultState); transition.hasExitTime = false; transition.exitTime = 0; transition.duration = defaultAction != null ? defaultAction.fadeIn : 0f; parentAction.AddCondition(transition, false); } }