public static void Create(AnimatorStateMachine stateMachine, int index, BitActionSwitchGroup bitActionSwitchGroup, ActivationAnimationClipItem animationClip, int groupIndex) { stateMachine.entryPosition = Style.EntryPosition; stateMachine.anyStatePosition = Style.AnyStatePosition; stateMachine.exitPosition = Style.ExitPosition; var initState = stateMachine.AddStateDefaultParam("Init", Style.InitStatePosition); var staticBitActiveState = stateMachine.AddStateDefaultParam("Static Bit Active", Style.StaticBitActiveStatePosition); var staticBitInactiveState = stateMachine.AddStateDefaultParam("Static Bit Inactive", Style.StaticBitInactiveStatePosition); var bitActiveState = stateMachine.AddStateDefaultParam("Bit Active", Style.BitActiveStatePosition); var bitInactiveState = stateMachine.AddStateDefaultParam("Bit Inactive", Style.BitInactiveStatePosition); // set motion var bitActionSwitchItem = bitActionSwitchGroup.bitActionSwitchItems[index]; if (bitActionSwitchItem.registerType == BitActionSwitchItem.RegisterType.GameObject) { staticBitActiveState.motion = animationClip.NonDefaultClip; staticBitInactiveState.motion = animationClip.DefaultClip; bitActiveState.motion = staticBitActiveState.motion; bitInactiveState.motion = staticBitInactiveState.motion; } else { staticBitActiveState.motion = bitActionSwitchItem.staticNonDefaultClip; staticBitInactiveState.motion = bitActionSwitchItem.staticDefaultClip; bitActiveState.motion = bitActionSwitchItem.defaultClip == null ? staticBitActiveState.motion : bitActionSwitchItem.nonDefaultClip; bitInactiveState.motion = bitActionSwitchItem.nonDefaultClip == null ? staticBitInactiveState.motion : bitActionSwitchItem.defaultClip; } // transition stateMachine.AddAnyTransitionDefaultParam(initState, AnimatorConditionMode.If, 0.0f, ActionSwitchParameters.InitializedParameterName); staticBitActiveState.AddTransitionDefaultParam(bitInactiveState, AnimatorConditionMode.Equals, index + 1 + groupIndex * 9, ActionSwitchParameters.ObjectNumParameterName); staticBitInactiveState.AddTransitionDefaultParam(bitActiveState, AnimatorConditionMode.Equals, index + 1 + groupIndex * 9, ActionSwitchParameters.ObjectNumParameterName); var activeToInactive = bitActiveState.AddTransitionDefaultParam(bitInactiveState, AnimatorConditionMode.Less, 0.5f, ActionSwitchParameters.GetObjectFloatStatusParameterName(index + 1 + groupIndex * 9)); activeToInactive.hasExitTime = true; activeToInactive.exitTime = 1.0f; var inactiveToActive = bitInactiveState.AddTransitionDefaultParam(bitActiveState, AnimatorConditionMode.Greater, 0.5f, ActionSwitchParameters.GetObjectFloatStatusParameterName(index + 1 + groupIndex * 9)); inactiveToActive.hasExitTime = true; inactiveToActive.exitTime = 1.0f; var conditions = new List <AnimatorCondition>(); for (var i = 0; i < 1 << bitActionSwitchGroup.bitActionSwitchItems.Count; i++) { var targetDigit = ((1 << index) & i) != 0; if (!targetDigit) { continue; // 1,3,5,7 } initState.AddTransitionDefaultParam(staticBitActiveState, AnimatorConditionMode.Equals, i, bitActionSwitchGroup.variableName); conditions.Add(new AnimatorCondition { mode = AnimatorConditionMode.NotEqual, threshold = i, parameter = bitActionSwitchGroup.variableName }); } initState.AddTransitionDefaultParam(staticBitInactiveState, conditions.ToArray()); }