Exemplo n.º 1
0
    static AnimatorController BuildAnimationController(List <AnimationClip> clips, string name, string fileName)
    {
        AnimatorController animatorController =
            UnityEditor.Animations.AnimatorController.CreateAnimatorControllerAtPath(
                AnimationControllerPath + "/" + name + "/" + name + ".controller");

        AnimatorControllerLayer layer = animatorController.layers[0];
        AnimatorStateMachine    sm    = layer.stateMachine;

        animatorController.AddParameter("Attack", AnimatorControllerParameterType.Trigger);
        animatorController.AddParameter("Hurt", AnimatorControllerParameterType.Trigger);

        Dictionary <string, AnimatorState> animatorStates = new Dictionary <string, AnimatorState>();

        foreach (AnimationClip newClip in clips)
        {
            //AnimatorStateMachine machine = sm.AddStateMachine(newClip.name);
            AnimatorState state = sm.AddState(newClip.name);
            animatorStates.Add(newClip.name, state);
            state.motion = newClip;
            //AnimatorStateTransition trans = sm.AddAnyStateTransition(state);
            if (newClip.name == "Idle")
            {
                sm.defaultState = state;
            }
        }

        AssetDatabase.SaveAssets();
        return(animatorController);
    }
Exemplo n.º 2
0
    private static int[] GetStateKeys(Animator animator, int layer)
    {
        List <int> stateKeys = new List <int>();

        AnimatorController animatorController = animator.runtimeAnimatorController as AnimatorController;

        AnimatorControllerLayer animlayer    = animatorController.GetLayer(layer);
        StateMachine            stateMachine = animlayer.stateMachine;

        //StateMachine stateMachine = animatorController.GetLayerStateMachine(layer);


        /*List<State> states = stateMachine.statesRecursive;
         * foreach (State state in states)
         * {
         *      stateKeys.Add(state.GetUniqueNameHash());
         * }*/

        for (int i = 0; i < stateMachine.stateCount; i++)
        {
            stateKeys.Add(stateMachine.GetState(i).uniqueNameHash);
        }

        return(stateKeys.ToArray());
    }
    /// <summary>
    /// 添加动画状态机状态
    /// </summary>
    /// <param name="path"></param>
    /// <param name="layer"></param>
    private static void AddStateTranstion(string path, AnimatorControllerLayer layer)
    {
        AnimatorStateMachine sm = layer.stateMachine;
        // 根据动画文件读取它的AnimationClip对象
        var datas = AssetDatabase.LoadAllAssetsAtPath(path);

        if (datas.Length == 0)
        {
            Debug.Log(string.Format("Can't find clip in {0}", path));
            return;
        }
        // 先添加一个默认的空状态
        var emptyState = sm.AddState("empty");

        sm.AddAnyStateTransition(emptyState);
        // 遍历模型中包含的动画片段,将其加入状态机中
        foreach (var data in datas)
        {
            if (!(data is AnimationClip))
            {
                continue;
            }
            var newClip = data as AnimationClip;
            if (newClip.name.StartsWith("__"))
            {
                continue;
            }
            // 取出动画名字,添加到state里面
            var state = sm.AddState(newClip.name);
            state.motion = newClip;
            // 把State添加在Layer里面
            sm.AddAnyStateTransition(state);
        }
    }
Exemplo n.º 4
0
    public void ShowLayersGUI()
    {
        scrollPos = EditorGUILayout.BeginScrollView(scrollPos);
        {
            AnimatorControllerLayer[] layers = animatorController.layers;
            for (int i = 0; i < layers.Length; i++)
            {
                AnimatorControllerLayer layer      = layers[i];
                AnimatorStateMachine    machine    = layer.stateMachine;
                ChildAnimatorState[]    states     = machine.states;
                AnimatorState[]         animStates = new AnimatorState[states.Length];
                for (int j = 0; j < states.Length; j++)
                {
                    animStates[j] = states[j].state;
                }

                string key = "Layer " + i;
                if (!fieldsFoldout.ContainsKey(key))
                {
                    fieldsFoldout[key] = true;
                }
                fieldsFoldout[key] = EditorGUI.Foldout(GUILayoutUtility.GetRect(100, 25), fieldsFoldout[key], "Layer " + i + " : " + layer.name);
                if (fieldsFoldout[key])
                {
                    ShowStateGUI(animStates);
                }
            }
        }
        EditorGUILayout.EndScrollView();
    }
Exemplo n.º 5
0
    private void GenerateActions()
    {
        ActionsSequencer   sequencer  = target as ActionsSequencer;
        AnimatorController controller = sequencer.controller as AnimatorController;

        while (sequencer.transform.childCount > 0)
        {
            DestroyImmediate(sequencer.transform.GetChild(0).gameObject);
        }

        AnimatorControllerLayer mainLayer = controller.layers[0];

        AnimatorState state = mainLayer.stateMachine.defaultState;
        GameObject    stateParentGameObject = new GameObject(state.name);

        stateParentGameObject.transform.parent = sequencer.transform;
        while (state.transitions.Length > 0)
        {
            AnimatorState subState           = state.transitions[0].destinationState;
            GameObject    subStateGameObject = new GameObject(subState.name);
            subStateGameObject.transform.parent = stateParentGameObject.transform;
            state = subState;
            stateParentGameObject = subStateGameObject;
        }

        //foreach(ChildAnimatorState childState in mainLayer.stateMachine.states)
        //{
        //    GameObject go = new GameObject(childState.state.name);
        //    go.transform.parent = sequencer.transform;
        //}
    }
Exemplo n.º 6
0
    /// <summary>
    /// 动画控制器比较特殊,不能通过序列化得到
    /// </summary>
    /// <param name="info"></param>
    /// <param name="o"></param>
    private void AnalyzeObjectReference2(Object o, AssetBundle ab)
    {
        UnityEditor.Animations.AnimatorController ac = o as UnityEditor.Animations.AnimatorController;
        if (ac)
        {
#if UNITY_5 || UNITY_5_3_OR_NEWER
            foreach (var clip in ac.animationClips)
            {
                AnalyzeObjectReference(o, ab);
            }
#else
            List <State> list = new List <State>();
            for (int i = 0; i < ac.layerCount; i++)
            {
                AnimatorControllerLayer layer = ac.GetLayer(i);
                list.AddRange(AnimatorStateMachine_StatesRecursive(layer.stateMachine));
            }
            foreach (State state in list)
            {
                var clip = state.GetMotion() as AnimationClip;
                if (clip)
                {
                    AnalyzeObjectReference(clip, ab);
                }
            }
#endif
        }
    }
        /// <summary>
        /// 动画控制器比较特殊,不能通过序列化得到
        /// </summary>
        /// <param name="info"></param>
        /// <param name="o"></param>
        private static void SettingObjectReference2(UnityEngine.Object o)
        {
            AnimationClip cx  = (AnimationClip)AssetDatabase.LoadAssetAtPath("Assets/_Test/C/X.anim", typeof(AnimationClip));
            AnimationClip caa = (AnimationClip)AssetDatabase.LoadAssetAtPath("Assets/_Test/aa.anim", typeof(AnimationClip));

            UnityEditor.Animations.AnimatorController ac = o as UnityEditor.Animations.AnimatorController;
            if (ac)
            {
                                #if UNITY_5 || UNITY_5_3_OR_NEWER
                for (int i = 0; i < ac.animationClips.Length; i++)
                {
                }
                                #else
                List <State> list = new List <State>();
                for (int i = 0; i < ac.layerCount; i++)
                {
                    AnimatorControllerLayer layer = ac.GetLayer(i);
                    list.AddRange(AnimatorStateMachine_StatesRecursive(layer.stateMachine));
                }
                foreach (State state in list)
                {
                    var clip = state.GetMotion() as AnimationClip;
                    if (clip == cx)
                    {
                        state.SetAnimationClip(caa);
                    }
                }
                                #endif
            }
        }
Exemplo n.º 8
0
        protected override YAMLMappingNode ExportYAMLRoot(IExportContainer container)
        {
            AnimatorControllerExportCollection collection = (AnimatorControllerExportCollection)container.CurrentCollection;

            AnimatorControllerParameter[] @params = new AnimatorControllerParameter[Controller.Values.Instance.ValueArray.Count];
            for (int i = 0; i < Controller.Values.Instance.ValueArray.Count; i++)
            {
                @params[i] = new AnimatorControllerParameter(this, i);
            }

            AnimatorControllerLayer[] layers = new AnimatorControllerLayer[Controller.LayerArray.Count];
            for (int i = 0; i < Controller.LayerArray.Count; i++)
            {
                int stateMachineIndex             = Controller.LayerArray[i].Instance.StateMachineIndex;
                AnimatorStateMachine stateMachine = collection.StateMachines[stateMachineIndex];
                layers[i] = new AnimatorControllerLayer(stateMachine, this, i);
            }

            YAMLMappingNode node = base.ExportYAMLRoot(container);

            node.AddSerializedVersion(GetSerializedVersion(container.ExportVersion));
            node.Add(AnimatorParametersName, @params.ExportYAML(container));
            node.Add(AnimatorLayersName, layers.ExportYAML(container));
            return(node);
        }
Exemplo n.º 9
0
    public static void autioBuildController()
    {
        AnimatorController      animatorController = AnimatorController.CreateAnimatorControllerAtPath("Assets/animation.controller");
        AnimatorControllerLayer layer = animatorController.layers[0];

        //clip文件名
        List <string> list = new List <string>();

        list.Add("AccountToRoot");
        list.Add("root");


        for (int i = 0; i < list.Count; i++)
        {
            //文件路径
            string        path = string.Format("Assets/Res/Ani/cam/{0}.anim", list[i]);
            AnimationClip clip = AssetDatabase.LoadAssetAtPath <AnimationClip>(path);
            if (clip != null)
            {
                AnimatorStateMachine stateMachine = layer.stateMachine;
                AnimatorState        state        = stateMachine.AddState(clip.name);
                state.motion = clip;
                //相当于 AnimatorController 中的连线
                AnimatorStateTransition transition = stateMachine.AddAnyStateTransition(state);
            }
            else
            {
                Debug.Log("路径找不到 animation clip文件 ");
            }
        }
        AssetDatabase.SaveAssets();
    }
Exemplo n.º 10
0
	// ----- ------ Default Clips ----- ------
	private static AnimationClip SetAnimationDefault(AnimatorController superAnimator, GameObject gameObject, AvatarMask mask, string folder) {
	 AnimatorControllerLayer animDefault = new AnimatorControllerLayer {
		name = "TEA Defaults",
		defaultWeight = 1,
		avatarMask = mask,
		stateMachine = new AnimatorStateMachine()
	 };

	 AnimatorStateMachine stateMachine = animDefault.stateMachine;
	 AnimationClip def_clip = new AnimationClip {
		name = "TEA Defaults"
	 };

	 AnimatorState defaultState = stateMachine.AddState("TEA Defaults");

	 foreach(AnimatorControllerLayer layer in superAnimator.layers) {
		SetAnimationDefault(def_clip, layer.stateMachine.states, gameObject);
		foreach(ChildAnimatorStateMachine childMachine in layer.stateMachine.stateMachines) {
		 SetAnimationDefault(def_clip, childMachine.stateMachine.states, gameObject);
		}
	 }

	 string actionPath = folder + "/" + superAnimator.name + "-def_clip.anim";
	 AssetDatabase.CreateAsset(def_clip, actionPath);
	 AnimationClip retClip = AssetDatabase.LoadAssetAtPath<AnimationClip>(actionPath);
	 defaultState.writeDefaultValues = true;
	 defaultState.motion = retClip;

	 AnimatorControllerLayer[] layers = superAnimator.layers;
	 ArrayUtility.Insert<AnimatorControllerLayer>(ref layers, 0, animDefault);
	 superAnimator.layers = layers;

	 return retClip;
	}
Exemplo n.º 11
0
        private static AnimatorControllerLayer DuplicateLayer(AnimatorControllerLayer srcLayer, string dstLayerName, bool firstLayer = false)
        {
            var newLayer = new AnimatorControllerLayer()
            {
                avatarMask    = srcLayer.avatarMask,
                blendingMode  = srcLayer.blendingMode,
                defaultWeight = srcLayer.defaultWeight,
                iKPass        = srcLayer.iKPass,
                name          = dstLayerName,
                // 新しく作らないとLayer削除時にコピー元LayerのStateが消える
                stateMachine             = DuplicateStateMachine(srcLayer.stateMachine),
                syncedLayerAffectsTiming = srcLayer.syncedLayerAffectsTiming,
                syncedLayerIndex         = srcLayer.syncedLayerIndex
            };

            // 最初のレイヤーはdefaultWeightがどんなものでも自動的にweightが1扱いになっているので
            // defaultWeightを1にする
            if (firstLayer)
            {
                newLayer.defaultWeight = 1f;
            }

            // StateとStateMachineをすべて追加後に遷移を設定
            // 親階層へ伸びているっぽい遷移もある?
            CopyTransitions(srcLayer.stateMachine, newLayer.stateMachine);

            return(newLayer);
        }
Exemplo n.º 12
0
    static void ReflashAnimatorController(string name, string assetPath)
    {
        string path = "Assets/Resources/Bear/" + name + ".controller";

        if (!File.Exists(path))
        {
            Debug.LogError(name + "没有动画控制文件");
            return;
        }
        AnimatorController      animatorController = AssetDatabase.LoadAssetAtPath <AnimatorController> (path);
        AnimatorControllerLayer layer   = animatorController.layers[0];
        AnimatorStateMachine    machine = layer.stateMachine;

        List <AnimationClip> clips = new List <AnimationClip>();

        UnityEngine.Object[] objects = AssetDatabase.LoadAllAssetsAtPath(assetPath);
        for (int m = 0; m < objects.Length; m++)
        {
            if (objects[m].GetType() == typeof(AnimationClip) && !objects[m].name.Contains("Take 001"))
            {
                AnimationClip clip = (AnimationClip)objects[m];
                if (clip != null)
                {
                    clips.Add(clip);
                }
            }
        }
        CheckAndRefreshAnimatorController(clips, machine);
    }
Exemplo n.º 13
0
	private void CombineAnimator(AnimatorController superAnimator, AnimatorController animator, AvatarMask mask) {
	 if(null == animator || null == superAnimator)
		return;

	 foreach(AnimatorControllerParameter param in animator.parameters) {
		if(!string.IsNullOrEmpty(param.name) && !HasAnimatorParameter(superAnimator, param.name))
		 superAnimator.AddParameter(param);
	 }

	 foreach(AnimatorControllerLayer layer in animator.layers) {
		//Debug.Log($"combining [{superAnimator.name}] with [{animator.name}] layer[{layer.name}]");
		AnimatorControllerLayer newLayer = new AnimatorControllerLayer {
		 avatarMask = null == mask ? layer.avatarMask : mask,
		 name = layer.name,
		 blendingMode = layer.blendingMode,
		 defaultWeight = layer.defaultWeight,
		 iKPass = layer.iKPass,
		 stateMachine = layer.stateMachine,
		 syncedLayerAffectsTiming = layer.syncedLayerAffectsTiming,
		 syncedLayerIndex = layer.syncedLayerIndex
		};
		superAnimator.AddLayer(newLayer);
	 }
	 //Debug.Log("-----------");
	}
Exemplo n.º 14
0
        public static AnimatorStateMachine FindStateMachine(RuntimeAnimatorController runtimeAnimatorController,
                                                            string layerName, params string[] stateMachineNames)
        {
            AnimatorControllerLayer layer = FindLayer(runtimeAnimatorController, layerName);

            return(FindStateMachine(layer, stateMachineNames));
        }
Exemplo n.º 15
0
    /// <summary>
    /// 给预制体添加动画
    /// </summary>
    /// <param name="obj"></param>
    /// <param name="modelPath"></param>
    /// <param name="animatorControllerPath"></param>
    /// <param name="name"></param>
    public static void SetAnimatorController(GameObject obj, string modelPath, string animatorControllerPath, string name)
    {
        Animator anim = obj.GetComponent <Animator>();

        if (anim)
        {
            AnimatorController controller = AnimatorController.CreateAnimatorControllerAtPath(animatorControllerPath + name + ".controller");
            AnimatorController.SetAnimatorController(anim, controller);
            AnimatorControllerLayer layer   = controller.layers[0];
            AnimatorStateMachine    machine = layer.stateMachine;

            controller.AddParameter("e", AnimatorControllerParameterType.Bool);

            AnimatorState IdleState = machine.AddState("Idle", new Vector3(300, 0, 0));
            machine.defaultState = IdleState;
            AnimatorState behaviorState = machine.AddState("behavior", new Vector3(550, 0, 0));
            behaviorState.motion = GetAnimationClip(modelPath);

            AnimatorStateTransition behaviorTrue = IdleState.AddTransition(behaviorState);
            behaviorTrue.AddCondition(AnimatorConditionMode.If, 1f, "e");
            AnimatorStateTransition behaviorFlas = behaviorState.AddTransition(IdleState);
            behaviorFlas.AddCondition(AnimatorConditionMode.IfNot, 1F, "e");
        }
        else
        {
            Debug.Log(obj.name + "没有挂载动画状态机组件");
        }
    }
        private void AddDefaultState(AnimatorController ac, int i)
        {
            AnimatorControllerLayer layer        = ac.layers[i];
            AnimatorStateMachine    stateMachine = layer.stateMachine;

            layer.defaultWeight = 1.0f;

            string strEmptyNameParam = "Empty" + i;

            //每层必须先加一个空状态
            AnimatorState stateEmpty = stateMachine.AddState(strEmptyNameParam, new Vector3(stateMachine.entryPosition.x + 300, stateMachine.entryPosition.y, 0));

            //添加trigger参数
            ac.AddParameter(strEmptyNameParam, AnimatorControllerParameterType.Trigger);

            //添加速度修正参数
            AnimatorControllerParameter acpEmpty = new AnimatorControllerParameter();
            string strSpeedParamEmpty            = strEmptyNameParam + "speed";

            acpEmpty.name         = strSpeedParamEmpty;
            acpEmpty.defaultFloat = 1.0f;
            acpEmpty.type         = AnimatorControllerParameterType.Float;
            ac.AddParameter(acpEmpty);

            //添加Any到Empty的transition
            AnimatorStateTransition ToEmptyTransition = stateMachine.AddAnyStateTransition(stateEmpty);

            ToEmptyTransition.AddCondition(AnimatorConditionMode.If, 0, strEmptyNameParam);
            ToEmptyTransition.duration = 0f;
            ToEmptyTransition.name     = strEmptyNameParam;

            m_LayerDefaultState.Add(i, stateEmpty);
        }
Exemplo n.º 17
0
    static void CreateAnimator(string[] files)
    {
        string path = new System.Text.StringBuilder().Append(@Application.streamingAssetsPath).Append('/').Append(AppConst.TextDir).Append('/').ToString();

        EditorUtil.Init <AnimatorInfo>(path);
        EditorUtil.Init <AnimatorTransInfo>(path);
        EditorUtil.Init <AnimatorTransfer>(path);
        int width  = 250;
        int height = 50;

        for (int i = 0; i < files.Length; i++)
        {
            string                  pName      = Path.GetFileNameWithoutExtension(files[i]);
            AnimatorController      controller = AnimatorController.CreateAnimatorControllerAtPath(AppConst.AssetPath + "/Animator/" + pName + ".controller");
            AnimatorControllerLayer currLayer  = null;
            if (controller.layers.Length > 0)
            {
                currLayer = controller.layers[0];
            }
            else
            {
                currLayer      = new AnimatorControllerLayer();
                currLayer.name = "Base Layer";
                controller.AddLayer(currLayer);
            }

            currLayer.stateMachine.anyStatePosition = new Vector3(0, height * 3, 0);
            currLayer.stateMachine.entryPosition    = new Vector3(0, height, 0);
            currLayer.stateMachine.exitPosition     = new Vector3(((int)AnimatState.AnimaState_MAX / 5 + 1) * width, height * 3, 0);
            AddAnimatorState(controller, currLayer, width, height, pName);
            AddParameters(controller);
            AddTransition(currLayer);
        }
    }
Exemplo n.º 18
0
    AnimatorStateTransition GetTransition(string nextStateName, AnimatorControllerLayer layer)
    {
        var animator = target.GetComponent <Animator>();
        AnimatorStateMachine stateMachine = layer.stateMachine;

        // Find transition from current state
        int index       = animator.GetLayerIndex(layer.name);
        int currentHash = animator.GetCurrentAnimatorStateInfo(index).fullPathHash;

        foreach (var childState in stateMachine.states)
        {
            if (Animator.StringToHash(layer.name + "." + childState.state.name) == currentHash)
            {
                var transition = System.Array.Find <AnimatorStateTransition>
                                     (childState.state.transitions, p => p.destinationState.name == nextStateName);
                if (transition != null)
                {
                    return(transition);
                }
            }
        }

        // Find transition from "Any State"
        return(System.Array.Find <AnimatorStateTransition>(
                   stateMachine.anyStateTransitions,
                   p => p.destinationState.name == nextStateName
                   ));
    }
        private static void ExportController(AnimatorOverrideController overrideController)
        {
            string overrideControllerPath = AssetDatabase.GetAssetPath(overrideController);
            string controllerPath         = AssetDatabase.GetAssetPath(overrideController.runtimeAnimatorController);
            string copyControllerPath     = overrideControllerPath.Replace(".overrideController", ".controller");

            if (AssetDatabase.CopyAsset(controllerPath, copyControllerPath))
            {
                RuntimeAnimatorController controller = AssetDatabase.LoadAssetAtPath <RuntimeAnimatorController> (copyControllerPath);
                AnimatorController        animator   = controller as AnimatorController;
                AnimatorControllerLayer   baseLayer  = animator.layers[0];
                foreach (var clipPair in overrideController.clips)
                {
                    AnimationClip overrideClip = new AnimationClip();
                    EditorUtility.CopySerialized(clipPair.overrideClip, overrideClip);
                    overrideClip.hideFlags = HideFlags.None;
                    AssetDatabase.AddObjectToAsset(overrideClip, controller);
                    for (int i = 0; i < baseLayer.stateMachine.states.Length; i++)
                    {
                        AnimatorState state = baseLayer.stateMachine.states[i].state;
                        if (state.motion == clipPair.originalClip)
                        {
                            state.motion = overrideClip;
                        }
                    }
                }
            }
            AssetDatabase.SaveAssets();
            AssetDatabase.Refresh();
        }
Exemplo n.º 20
0
        public static AnimatorStateTransition GetTransitionTo(FPlayAnimationEvent animEvt)
        {
            FAnimationTrack animTrack = (FAnimationTrack)animEvt.Track;

            if (animTrack.AnimatorController == null)
            {
                return(null);
            }

            AnimatorController controller = (AnimatorController)animTrack.AnimatorController;

            AnimatorState animState = null;

            AnimatorControllerLayer layer = FindLayer(controller, ((FAnimationTrack)animEvt.Track).LayerName);

            if (layer == null)
            {
                return(null);
            }

            if (layer.stateMachine.stateMachines.Length == 0)
            {
                return(null);
            }

            ChildAnimatorStateMachine fluxSM = layer.stateMachine.stateMachines[0];

            AnimatorStateMachine stateMachine = fluxSM.stateMachine;

            for (int i = 0; i != stateMachine.states.Length; ++i)
            {
                if (stateMachine.states[i].state.nameHash == animEvt._stateHash)
                {
                    animState = stateMachine.states[i].state;
                    break;
                }
            }

            if (animState == null)
            {
                //				Debug.LogError("Couldn't find state " + animEvt._animationClip );
                return(null);
            }

            for (int i = 0; i != stateMachine.states.Length; ++i)
            {
                AnimatorState state = stateMachine.states[i].state;

                AnimatorStateTransition[] transitions = state.transitions;
                for (int j = 0; j != transitions.Length; ++j)
                {
                    if (transitions[j].destinationState == animState)
                    {
                        return(transitions[j]);
                    }
                }
            }

            return(null);
        }
Exemplo n.º 21
0
    /// <summary>
    /// 创建动画控制器
    /// </summary>
    /// <param name="obj"></param>
    /// <param name="path"></param>
    /// <returns></returns>
    private static AnimatorController CreateAnimatorController(Object obj, string path)
    {
        string        assetPath     = AssetDatabase.GetAssetPath(obj);
        AnimationClip animationClip = AssetDatabase.LoadAssetAtPath <AnimationClip>(assetPath);

        AnimatorController animatorController = AnimatorController.CreateAnimatorControllerAtPath(path + "/" + obj.name + ".controller");

        animatorController.AddParameter("isLoop", AnimatorControllerParameterType.Bool);

        AnimatorControllerLayer animatorControllerLayer = animatorController.layers[0];
        AnimatorStateMachine    animatorStateMachine    = animatorControllerLayer.stateMachine;

        AnimatorState animatorState = animatorStateMachine.AddState(animationClip.name);

        animatorState.motion = animationClip;

        AnimatorState emptyState = animatorStateMachine.AddState("Empty", new Vector3(animatorStateMachine.entryPosition.x + 400,
                                                                                      animatorStateMachine.entryPosition.y + 400, 0));

        AnimatorStateTransition animatorStateTransition = animatorState.AddTransition(emptyState);

        animatorStateTransition.hasExitTime = true;

        animatorStateTransition = emptyState.AddTransition(animatorState);
        animatorStateTransition.AddCondition(AnimatorConditionMode.If, 1, "isLoop");

        return(animatorController);
    }
    void SetMecanimData()
    {
        if (gogoAnimator.animator == null)
        {
            return;
        }

        animationClipArray = AnimationUtility.GetAnimationClips(gogoAnimator.gameObject);

        animationStateList.Clear();
        animationStateNameList.Clear();

        AnimatorController ac = gogoAnimator.animator.runtimeAnimatorController as UnityEditor.Animations.AnimatorController;

        if (ac != null)
        {
            for (int i = 0; i < ac.layers.Length; i++)
            {
                AnimatorControllerLayer layer = ac.layers[i];

                for (int j = 0; j < layer.stateMachine.states.Length; j++)
                {
                    animationStateList.Add(layer.stateMachine.states[j]);
                    animationStateNameList.Add(layer.stateMachine.states[j].state.name);
                }
            }
        }
    }
Exemplo n.º 23
0
        private void InsertLayer(AnimatorController controller, AnimatorControllerLayer layer, int toIndex)
        {
            var fromIndex = Array.IndexOf(controller.layers.Select(x => x.name).ToArray(), layer.name);
            if (fromIndex == -1)
            {
                controller.AddLayer(layer);
                fromIndex = controller.layers.Length - 1;
            }
            if (fromIndex == toIndex) return;

            var layers = controller.layers;

            var insert = layers[fromIndex];
            var di = fromIndex > toIndex ? 1 : -1;
            int i = toIndex;
            while(i >= 0 && i < layers.Length)
            {
                var work = layers[i];
                layers[i] = insert;
                insert = work;
                if (i == fromIndex) break;
                i += di;
            }
            controller.layers = layers;
            AssetDatabase.SaveAssets();
        }
Exemplo n.º 24
0
        /// <summary>
        /// Creates a Unity sprite animation from the given <see cref="Layer"/> that is a group layer.  It grabs all of the children art
        /// layers and uses them as the frames of the animation.
        /// </summary>
        /// <param name="layer">The group <see cref="Layer"/> to use to create the sprite animation.</param>
        private static void CreateAnimation(Layer layer)
        {
            float fps = 30;

            string[] args = layer.Name.Split(new[] { '|' }, StringSplitOptions.RemoveEmptyEntries);

            foreach (string arg in args)
            {
                if (arg.ContainsIgnoreCase("FPS="))
                {
                    layer.Name = layer.Name.Replace("|" + arg, string.Empty);

                    string[] fpsArgs = arg.Split(new[] { '=' }, StringSplitOptions.RemoveEmptyEntries);
                    if (!float.TryParse(fpsArgs[1], out fps))
                    {
                        Debug.LogError(string.Format("Unable to parse FPS: \"{0}\"", arg));
                    }
                }
            }

            List <Sprite> frames = new List <Sprite>();

            Layer          firstChild     = layer.Children.First();
            SpriteRenderer spriteRenderer = CreateSpriteGameObject(firstChild);

            spriteRenderer.name = layer.Name;

            foreach (Layer child in layer.Children)
            {
                frames.Add(CreateSprite(child, layer.Name));
            }

            spriteRenderer.sprite = frames[0];

#if UNITY_5
            // Create Animator Controller with an Animation Clip
            UnityEditor.Animations.AnimatorController controller = new UnityEditor.Animations.AnimatorController();
            controller.AddLayer("Base Layer");

            UnityEditor.Animations.AnimatorControllerLayer controllerLayer = controller.layers[0];
            UnityEditor.Animations.AnimatorState           state           = controllerLayer.stateMachine.AddState(layer.Name);
            state.motion = CreateSpriteAnimationClip(layer.Name, frames, fps);

            AssetDatabase.CreateAsset(controller, GetRelativePath(currentPath) + "/" + layer.Name + ".controller");
#else // Unity 4
            // Create Animator Controller with an Animation Clip
            AnimatorController      controller      = new AnimatorController();
            AnimatorControllerLayer controllerLayer = controller.AddLayer("Base Layer");

            State state = controllerLayer.stateMachine.AddState(layer.Name);
            state.SetAnimationClip(CreateSpriteAnimationClip(layer.Name, frames, fps));

            AssetDatabase.CreateAsset(controller, GetRelativePath(currentPath) + "/" + layer.Name + ".controller");
#endif

            // Add an Animator and assign it the controller
            Animator animator = spriteRenderer.gameObject.AddComponent <Animator>();
            animator.runtimeAnimatorController = controller;
        }
Exemplo n.º 25
0
        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();
        }
Exemplo n.º 26
0
        public override bool OnLayer(AnimatorControllerLayer layer, int lNum)
        {
            LayerRecord layerRecord = new LayerRecord(
                lNum,
                layer);

            AconDocument.layers.Add(layerRecord); return(true);
        }
Exemplo n.º 27
0
    public override void Initialize(AnimatorControllerLayer layer)
    {
        EditorAnimationItem dressidle   = new EditorAnimationItem_dressidle(resType, layer, sex);
        EditorAnimationItem changecloth = new EditorAnimationItem_changecloth(resType, layer, sex);

        changecloth.AddTransition(dressidle, AnimatorConditionMode.IfNot, 0f, ActionConst.CHANGE_CLOTH);
        dressidle.AddTransition(changecloth, AnimatorConditionMode.If, 0f, ActionConst.CHANGE_CLOTH, false);
    }
Exemplo n.º 28
0
        public AnimatorLayerDefinition(AnimatorDefinition parent, AnimatorControllerLayer controllerLayer)
        {
            Layer  = controllerLayer;
            Name   = controllerLayer.name;
            Parent = parent;

            AddStateMachine(controllerLayer.stateMachine);
        }
    public EditorAnimationItem(ECharacterResType type, AnimatorControllerLayer layer, EnumCharacterType _sex)
    {
        resType = type;
        AnimatorStateMachine baseSm = layer.stateMachine;

        state        = baseSm.AddState(ClipName);
        sex          = _sex;
        state.motion = motion;
    }
        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();
        }
Exemplo n.º 31
0
    private static State AddStateTransition(string path, AnimatorControllerLayer layer, State lastState)
    {
        UnityEditorInternal.StateMachine sm = layer.stateMachine;
          //根据动画文件读取它的AnimationClip对象
          AnimationClip newClip = AssetDatabase.LoadAssetAtPath (path, typeof(AnimationClip)) as AnimationClip;
          AnimationUtility.SetAnimationType (newClip, ModelImporterAnimationType.Generic);
          //取出动画名子 添加到state里面
          State state = sm.AddState (newClip.name);
          state.SetAnimationClip (newClip, layer);
          //把state添加在layer里面
          if (lastState != null)
          {
          sm.AddTransition (lastState, state);
          }

          return state;
    }
Exemplo n.º 32
0
 public BlendTree CreateBlendTree(AnimatorControllerLayer layer)
 {
     return null;
 }
Exemplo n.º 33
0
 public Motion GetMotion(AnimatorControllerLayer layer)
 {
     return null;
 }