示例#1
0
        public AnimatorControllerConfig LoadAnimatorConfigJson(string json)
        {
            AnimatorControllerConfig animatorControllerConfig = null;
            Dictionary <string, AnimatorControllerConfig> animatorControllerConfigDic = null;

            try
            {
                animatorControllerConfigDic = Tools.Json2Obj <Dictionary <string, AnimatorControllerConfig> >(json);
            }
            catch (Exception e)
            {
                Debug.Log("animatorControllerConfig 类型不为字典类型:" + e);
            }

            if (animatorControllerConfigDic != null)
            {
                animatorControllerConfig             = new AnimatorControllerConfig();
                animatorControllerConfig.parameters  = new List <AnimatorParameter>();
                animatorControllerConfig.states      = new List <AnimatorState>();
                animatorControllerConfig.transitions = new List <AnimatorTransition>();

                foreach (var pair in animatorControllerConfigDic)
                {
                    if (pair.Value.parameters != null)
                    {
                        foreach (var parameter in pair.Value.parameters)
                        {
                            animatorControllerConfig.parameters.Add(parameter);
                        }
                    }

                    if (pair.Value.states != null)
                    {
                        foreach (var state in pair.Value.states)
                        {
                            animatorControllerConfig.states.Add(state);
                        }
                    }

                    if (pair.Value.transitions != null)
                    {
                        foreach (var transition in pair.Value.transitions)
                        {
                            animatorControllerConfig.transitions.Add(transition);
                        }
                    }
                }
            }
            else
            {
                animatorControllerConfig = Tools.Json2Obj <AnimatorControllerConfig>(json);
            }

            Debug.Assert(animatorControllerConfig != null, "animatorControllerConfig 不能为空");

            return(animatorControllerConfig);
        }
示例#2
0
        void CreateAnimatorByJsonText(string text)
        {
            if (string.IsNullOrEmpty(text) == false)
            {
                string animatorControllerConfigJsonString         = text;
                AnimatorControllerConfig animatorControllerConfig =
                    LoadAnimatorConfigJson(animatorControllerConfigJsonString);
                Debug.Log("animatorControllerConfigJsonString = " + animatorControllerConfigJsonString);

                CreateAnimatorByConfig(animatorControllerConfig);
            }
        }
示例#3
0
        void CreateAnimatorByConfig(AnimatorControllerConfig animatorControllerConfig)
        {
            if (animatorControllerConfig != null)
            {
                Debug.Log("target = " + target);

                Undo.RecordObject(target, "animatorController"); // 支持撤销 add by TangJian 2018/04/16 15:41:34

                AnimatorController animatorController = target as AnimatorController;

                AnimationClip[]           animationClips           = animatorController.animationClips;
                AnimatorControllerLayer[] animatorControllerLayers = animatorController.layers;
                AnimatorStateMachine      animatorStateMachine     = animatorControllerLayers[0].stateMachine;

                string   animatorControllerPath = AssetDatabase.GetAssetPath(animatorController);
                Object[] clips = AssetDatabase.LoadAllAssetRepresentationsAtPath(animatorControllerPath);

                animatorController.parameters = null;
                foreach (var parameterConfig in animatorControllerConfig.parameters)
                {
                    animatorController.AddParameter(parameterConfig.name, parameterConfig.type);
                }

                // 添加所有状态 add by TangJian 2018/04/17 20:08:41
                foreach (var stateConfig in animatorControllerConfig.states)
                {
                    var state = animatorStateMachine.AddStateEx(stateConfig.name);
                    state.behaviours  = null;
                    state.transitions = null; // 清空所有状态 add by TangJian 2018/04/17 20:45:08
                    state.tag         = stateConfig.tag;
                    state.speed       = stateConfig.Speed;


                    CountsThrow(clips, stateConfig.animName);
                    state.motion = clips.First(o => o.name == stateConfig.animName) as Motion;
                    if (state.motion is AnimationClip animationClip)
                    {
                        AnimationClipSettings animationClipSettings =
                            AnimationUtility.GetAnimationClipSettings(animationClip);
                        animationClipSettings.loopTime = stateConfig.loop;
                        AnimationUtility.SetAnimationClipSettings(animationClip, animationClipSettings);
                    }



                    // 添加BlendTree
                    if (stateConfig.blendTree != null)
                    {
                        if (state.motion is UnityEditor.Animations.BlendTree)
                        {
                            UnityEditor.Animations.BlendTree blendTree = state.motion as UnityEditor.Animations.BlendTree;

                            // BlendTree属性设置 add by TangJian 2018/9/18 18:06
                            blendTree.name                   = "blendTree_" + state.name;
                            blendTree.blendParameter         = stateConfig.blendTree.blendParameter;
                            blendTree.useAutomaticThresholds = stateConfig.blendTree.useAutomaticThresholds;

                            List <UnityEditor.Animations.ChildMotion> addChildMotionList = new List <UnityEditor.Animations.ChildMotion>();
                            foreach (var childMotionConfig in stateConfig.blendTree.childMotions)
                            {
                                UnityEditor.Animations.ChildMotion childMotion = new UnityEditor.Animations.ChildMotion();
                                childMotion.threshold = childMotionConfig.threshold;
                                childMotion.timeScale = childMotionConfig.timeScale;
                                addChildMotionList.Add(childMotion);
                            }


                            var oldBlendTree = state.motion as UnityEditor.Animations.BlendTree;

                            var oldChildren = oldBlendTree.children;

                            var newChildren = new List <UnityEditor.Animations.ChildMotion>();

                            // 更新oldChildren add by TangJian 2018/9/18 18:07
                            for (int i = 0; i < oldChildren.Length; i++)
                            {
                                if (i < addChildMotionList.Count)
                                {
                                    oldChildren[i].threshold = addChildMotionList[i].threshold;
                                    oldChildren[i].timeScale = addChildMotionList[i].timeScale;
                                }
                            }

                            // 添加oldChildren中的motion到newChildren add by TangJian 2018/9/18 18:08
                            foreach (var item in oldChildren)
                            {
                                newChildren.Add(item);
                            }

                            // 添加剩余addChildMotionList中的motion到newChildren add by TangJian 2018/9/18 18:08
                            if (blendTree.children.Length > oldChildren.Length)
                            {
                                for (int i = oldChildren.Length; i < blendTree.children.Length; i++)
                                {
                                    newChildren.Add(blendTree.children[i]);
                                }
                            }


                            blendTree.children = newChildren.ToArray();

                            if (stateConfig.blendTree.useAutomaticThresholds)
                            {
                                if (stateConfig.blendTree.minThreshold > int.MinValue && stateConfig.blendTree.maxThreshold > int.MinValue)
                                {
                                    blendTree.minThreshold = stateConfig.blendTree.minThreshold;
                                    blendTree.maxThreshold = stateConfig.blendTree.maxThreshold;
                                }
                                else
                                {
                                    blendTree.minThreshold = 0;
                                    blendTree.maxThreshold = blendTree.children.Length - 1;
                                }
                            }

                            state.motion = blendTree;
                        }
                        else
                        {
                            state.motion = GetBlendTreeToMotion(animatorController, "blendTree_" + state.name,
                                                                stateConfig.blendTree);
                        }
                    }


                    if (stateConfig.script != null)
                    {
                        if (stateConfig.script == "RoleHide")
                        {
                            state.AddStateMachineBehaviour <RoleHideStateMachineBehaviour>();
                        }
                    }
                }

                // 添加额外的跳转 add by TangJian 2018/04/17 20:20:52
                foreach (var transitionConfig in animatorControllerConfig.transitions)
                {
                    if (transitionConfig.sourceAnimName == "Any")
                    {
                        foreach (var stateConfig in animatorControllerConfig.states)
                        {
                            var fromState = animatorStateMachine.GetState(stateConfig.name);
                            var toState   = animatorStateMachine.GetState(transitionConfig.destinationAnimName);
                            if (fromState != null && toState != null)
                            {
                                fromState.AddTransitionEx(toState, transitionConfig);
                            }
                        }
                    }
                    else
                    {
                        var fromState = animatorStateMachine.GetState(transitionConfig.sourceAnimName);
                        var toState   = animatorStateMachine.GetState(transitionConfig.destinationAnimName);

                        if (fromState != null && toState != null)
                        {
                            fromState.AddTransitionEx(toState, transitionConfig);
                        }
                    }
                }

                // 添加状态的跳转 add by TangJian 2018/04/17 20:11:08
                foreach (var stateConfig in animatorControllerConfig.states)
                {
                    // 添加状态的跳转 add by TangJian 2018/04/17 20:11:39
                    foreach (var transitionConfig in stateConfig.transitions)
                    {
                        var fromState = animatorStateMachine.GetState(stateConfig.name);
                        var toState   = animatorStateMachine.GetState(transitionConfig.destinationAnimName);

                        if (fromState != null && toState != null)
                        {
                            fromState.AddTransitionEx(toState, transitionConfig);
                        }
                    }
                }

                // 添加脚本 add by TangJian 2018/04/17 21:16:02
                foreach (var stateConfig in animatorControllerConfig.states)
                {
                    var state = animatorStateMachine.GetState(stateConfig.name);


                    RoleBehaviour roleBehaviour = state.AddStateMachineBehaviour <RoleBehaviour>();

                    // 限制状态可以执行到的时间 add by TangJian 2019/5/14 10:35
                    roleBehaviour.StateDuration = stateConfig.duration;

                    if (state.motion != null)
                    {
                        if (state.motion is UnityEditor.Animations.BlendTree)
                        {
                            var blendTree = state.motion as UnityEditor.Animations.BlendTree;
                            if (blendTree.children.Length != 0)
                            {
                                FrameEventBehaviour frameEventBehaviour = state.AddStateMachineBehaviour <FrameEventBehaviour>();
                                Motion motion = blendTree.children[0].motion;
                                if (motion != null)
                                {
                                    frameEventBehaviour.animName  = motion.name;
                                    frameEventBehaviour.Parameter = blendTree.blendParameter;
                                    frameEventBehaviour.namelist.Clear();
                                    frameEventBehaviour.beginTime = stateConfig.beginTime;
                                    frameEventBehaviour.endTime   = stateConfig.endTime;
                                    for (int i = 0; i < blendTree.children.Length; i++)
                                    {
                                        UnityEditor.Animations.ChildMotion child = blendTree.children[i];
                                        Motion childmotion = blendTree.children[i].motion;
                                        if (childmotion != null && string.IsNullOrWhiteSpace(childmotion.name) == false)
                                        {
//
                                            frameEventBehaviour.namelist.Insert(i, childmotion.name);
                                            frameEventBehaviour.floatList.Insert(i, child.threshold);
                                        }
                                    }
                                }
                            }
                        }
                        else
                        {
                            FrameEventBehaviour frameEventBehaviour = state.AddStateMachineBehaviour <FrameEventBehaviour>();
                            Motion motion = state.motion;
                            frameEventBehaviour.animName = motion.name;

                            if (motion is AnimationClip animationClip)
                            {
                                frameEventBehaviour.beginTime = stateConfig.beginTime / animationClip.length;
                                frameEventBehaviour.endTime   = stateConfig.endTime / animationClip.length;
                            }
                        }
                    }

                    state.AddStateMachineBehaviour <HumanMoveXYByAnimBehaviour>();

                    if (state.tag == "attack")
                    {
                        state.AddStateMachineBehaviour <HumanMainHandAttackBehaviour>();
                    }

                    if (state.name == "jump_1")
                    {
                        state.AddStateMachineBehaviour <RolePreJumpBehaviour>();
                    }

                    if (state.name == "JumpPre")
                    {
                        state.AddStateMachineBehaviour <RolePreJumpBehaviour>();
                    }

                    if (state.tag == "hurtHold")
                    {
                        state.AddStateMachineBehaviour <RoleHurtHoldStateMachineBehaviour>();
                    }

                    if (stateConfig.behaviours != null)
                    {
                        foreach (var item in stateConfig.behaviours)
                        {
                            MethodDelegate <bool> func = CSScript.CreateFunc <bool>(
                                @"
                                        using Tang;
                                        bool Sum(UnityEditor.Animations.AnimatorState state)
                                        {
                                            state.AddStateMachineBehaviour<" + item + @" > ();
                                            return true;
                                        }");

                            func(state);
                        }
                    }
                }

                // 记录未使用的状态 add by TangJian 2018/04/19 14:36:28
                List <UnityEditor.Animations.AnimatorState> unuseAnimatorStates = new List <UnityEditor.Animations.AnimatorState>();
                foreach (var state in animatorStateMachine.states)
                {
                    int index = animatorControllerConfig.states.FindIndex((AnimatorState a) =>
                    {
                        return(a.name == state.state.name);
                    });
                    if (index < 0)
                    {
                        unuseAnimatorStates.Add(state.state);
                    }
                }

                // 移除未使用的状态 add by TangJian 2018/04/19 14:38:34
                foreach (var state in unuseAnimatorStates)
                {
                    animatorStateMachine.RemoveState(state);
                }



                // 整理状态机位置 add by TangJian 2018/04/19 14:40:00
                ChildAnimatorState[] childAnimatorStates = animatorStateMachine.states;
                int cols = 3;
                for (int i = 0; i < childAnimatorStates.Length; i++)
                {
                    float x = (i % cols) * 204;
                    float y = (i / cols) * 50;

                    childAnimatorStates[i].position = new Vector3(x, y, 0);
                }
                animatorStateMachine.states = childAnimatorStates;


                // 保存生成的状态机 add by TangJian 2019/1/30 17:21
                EditorUtility.SetDirty(animatorController);
                AssetDatabase.SaveAssets();
                AssetDatabase.Refresh();
            }

            SupportEventDispatch();
        }