public void Build() { var expName = _expressionInfo.ExpressionName; var controller = _expressionInfo.Controller; AnimatorControllerLayer layer = AnimUtility.AddLayer(controller, expName, _dirtyAssets); controller.AddParameter(expName, AnimatorControllerParameterType.Bool); AnimatorStateMachine stateMachine = layer.stateMachine; var empty = AnimUtility.AddState(stateMachine, "Empty", true, _dirtyAssets); AnimatorState toggleState = AnimUtility.AddState(stateMachine, expName, false, _dirtyAssets); var animationClip = AnimUtility.CreateAnimation(_expressionInfo.AnimationsFolder.GetPath(), expName, _dirtyAssets); toggleState.motion = animationClip; foreach (var obj in GetObjects()) { switch (obj.Type) { case AdvancedToggleObjectMode.GameObject: AddToggleKeyframes(animationClip, obj.Target as Transform, obj.ToggleState, _dirtyAssets); break; case AdvancedToggleObjectMode.Material: AnimUtility.SetObjectReferenceKeyframe(animationClip, obj.Target, $"m_Materials.Array.data[{obj.MaterialSlot}]", obj.NewMaterial, _dirtyAssets); break; } } AnimatorStateTransition anyStateTransition = stateMachine.AddAnyStateTransition(toggleState); anyStateTransition.AddCondition(AnimatorConditionMode.If, 1, expName); AnimatorStateTransition exitTransition = toggleState.AddExitTransition(false); exitTransition.AddCondition(AnimatorConditionMode.IfNot, 0, expName); AnimUtility.AddVRCExpressionsParameter(_expressionInfo.AvatarDescriptor, VRCExpressionParameters.ValueType.Bool, expName, _dirtyAssets); if (_expressionInfo.Menu != null) { AnimUtility.AddVRCExpressionsMenuControl(_expressionInfo.Menu, ControlType.Toggle, expName, _dirtyAssets); } _dirtyAssets.SetDirty(); controller.AddObjectsToAsset(stateMachine, toggleState, anyStateTransition, exitTransition, empty); AssetDatabase.SaveAssets(); _dirtyAssets.Clear(); foreach (ObjectData obj in GetObjects().Where(o => o.Type == AdvancedToggleObjectMode.Parameter)) { AnimUtility.AddVRCParameterDriver(toggleState, obj.ParameterName, obj.ParameterValue, _dirtyAssets); } _dirtyAssets.SetDirty(); AssetDatabase.SaveAssets(); AssetDatabase.Refresh(); }
public void Build() { var expName = _expressionInfo.ExpressionName; var controller = _expressionInfo.Controller; AnimatorControllerLayer layer = AnimUtility.AddLayer(controller, expName, _dirtyAssets); controller.AddParameter(expName, AnimatorControllerParameterType.Float); AnimatorStateMachine stateMachine = layer.stateMachine; var empty = AnimUtility.AddState(stateMachine, "Empty", true, _dirtyAssets); AnimatorState state = AnimUtility.AddState(stateMachine, expName, false, _dirtyAssets); var blendTree = new BlendTree { name = "BlendTree", blendParameter = expName, }; state.motion = blendTree; _dirtyAssets.Add(blendTree); var materials = GetMaterials().ToList(); var directory = $"{_expressionInfo.AnimationsFolder.GetPath()}/{expName}"; var emptyClip = AnimUtility.CreateAnimation(directory, $"{expName}_{empty}", _dirtyAssets); blendTree.AddChild(emptyClip); for (var i = 0; i < materials.Count; i++) { Material material = materials[i]; var animationClip = AnimUtility.CreateAnimation(directory, $"{expName} [{i}] {material.name}", _dirtyAssets); AnimUtility.SetObjectReferenceKeyframe(animationClip, _renderer, $"m_Materials.Array.data[{_materialSlot}]", material, _dirtyAssets); blendTree.AddChild(animationClip); _dirtyAssets.Add(animationClip); } AnimatorStateTransition anyStateTransition = stateMachine.AddAnyStateTransition(state); anyStateTransition.AddCondition(AnimatorConditionMode.Greater, 0.01f, expName); AnimatorStateTransition exitTransition = state.AddExitTransition(false); exitTransition.AddCondition(AnimatorConditionMode.Less, 0.01f, expName); AnimUtility.AddVRCExpressionsParameter(_expressionInfo.AvatarDescriptor, VRCExpressionParameters.ValueType.Float, expName, _dirtyAssets); if (_expressionInfo.Menu != null) { AnimUtility.AddVRCExpressionsMenuControl(_expressionInfo.Menu, ControlType.RadialPuppet, expName, _dirtyAssets); } _dirtyAssets.SetDirty(); controller.AddObjectsToAsset(stateMachine, empty, state, anyStateTransition, exitTransition, blendTree); AssetDatabase.SaveAssets(); AssetDatabase.Refresh(); }
public void Build() { var expressionActiveState = _controller.ContentFrame.Q <Toggle>("expression-active-state"); var expressionObject = _controller.ContentFrame.Q <ObjectField>("expression-object"); var expName = _expressionInfo.ExpressionName; var controller = _expressionInfo.Controller; AnimatorControllerLayer layer = AnimUtility.AddLayer(controller, expName, _dirtyAssets); controller.AddParameter(expName, AnimatorControllerParameterType.Bool); AnimatorStateMachine stateMachine = layer.stateMachine; var empty = AnimUtility.AddState(stateMachine, "Empty", true, _dirtyAssets); AnimatorState toggleState = AnimUtility.AddState(stateMachine, expName, false, _dirtyAssets); var animationClip = AnimUtility.CreateAnimation(_expressionInfo.AnimationsFolder.GetPath(), expName, _dirtyAssets); AnimUtility.SetObjectReferenceKeyframe(animationClip, _renderer, $"m_Materials.Array.data[{_materialSlot}]", _material, _dirtyAssets); _dirtyAssets.Add(animationClip); toggleState.motion = animationClip; AnimatorStateTransition anyStateTransition = stateMachine.AddAnyStateTransition(toggleState); anyStateTransition.AddCondition(AnimatorConditionMode.If, 1, expName); AnimatorStateTransition exitTransition = toggleState.AddExitTransition(false); exitTransition.AddCondition(AnimatorConditionMode.IfNot, 0, expName); AnimUtility.AddVRCExpressionsParameter(_expressionInfo.AvatarDescriptor, VRCExpressionParameters.ValueType.Bool, expName, _dirtyAssets); if (_expressionInfo.Menu != null) { AnimUtility.AddVRCExpressionsMenuControl(_expressionInfo.Menu, ControlType.Toggle, expName, _dirtyAssets); } _dirtyAssets.SetDirty(); controller.AddObjectsToAsset(stateMachine, toggleState, anyStateTransition, exitTransition, empty); AssetDatabase.SaveAssets(); AssetDatabase.Refresh(); }
public void Build() { var expName = _expressionInfo.ExpressionName; var controller = _expressionInfo.Controller; AnimatorControllerLayer layer = AnimUtility.AddLayer(controller, expName, _dirtyAssets); controller.AddParameter(expName, AnimatorControllerParameterType.Bool); AnimatorStateMachine stateMachine = layer.stateMachine; var empty = AnimUtility.AddState(stateMachine, "Empty", true, _dirtyAssets); AnimatorState toggleState = AnimUtility.AddState(stateMachine, expName, false, _dirtyAssets); if (_createAnimation) { var animationClip = AnimUtility.CreateAnimation(_expressionInfo.AnimationsFolder.GetPath(), expName, _dirtyAssets); toggleState.motion = animationClip; } AnimatorStateTransition anyStateTransition = stateMachine.AddAnyStateTransition(toggleState); anyStateTransition.AddCondition(AnimatorConditionMode.If, 1, expName); AnimatorStateTransition exitTransition = toggleState.AddExitTransition(false); exitTransition.AddCondition(AnimatorConditionMode.IfNot, 0, expName); AnimUtility.AddVRCExpressionsParameter(_expressionInfo.AvatarDescriptor, ValueType.Bool, expName, _dirtyAssets); if (_expressionInfo.Menu != null) { AnimUtility.AddVRCExpressionsMenuControl(_expressionInfo.Menu, ControlType.Toggle, expName, _dirtyAssets); } _dirtyAssets.SetDirty(); controller.AddObjectsToAsset(stateMachine, toggleState, anyStateTransition, exitTransition, empty); AssetDatabase.SaveAssets(); AssetDatabase.Refresh(); }