Example #1
0
    static public EBAniParameters parseByMap(Hashtable map)
    {
        EBAniParameters ret = new EBAniParameters();

        ret.parse(map);
        return(ret);
    }
Example #2
0
    static public void initDatas()
    {
        if (isInitData)
        {
            return;
        }
        // isInitData = true;

        dicControls.Clear();

        string    json;
        ArrayList list;
        int       index;
        int       lens;

        EBAniLayers     layer;
        EBAniParameters parameter;
        EBAniControls   controls;


        // 动画层级数据
        Dictionary <int, EBAniLayers> dicLayers = new Dictionary <int, EBAniLayers> ();

        json = File.ReadAllText(JSON_PATH_Layer);
        list = JSON.DecodeList(json);
        lens = list.Count;
        for (index = 0; index < lens; index++)
        {
            layer = EBAniLayers.parseByMap((Hashtable)list [index]);
            if (layer.unqid > 0)
            {
                dicLayers.Add(layer.unqid, layer);
            }
        }

        // 动画参数数据
        Dictionary <int, EBAniParameters> dicParameters = new Dictionary <int, EBAniParameters> ();

        json = File.ReadAllText(JSON_PATH_Parameters);
        list = JSON.DecodeList(json);
        lens = list.Count;
        for (index = 0; index < lens; index++)
        {
            parameter = EBAniParameters.parseByMap((Hashtable)list [index]);
            if (parameter.unqid > 0)
            {
                dicParameters.Add(parameter.unqid, parameter);
            }
        }

        // 动画状态机数据·
        json = File.ReadAllText(JSON_PATH_States);
        //list = JSON.DecodeList (json);
        Hashtable actMap    = JSON.DecodeMap(json);
        ArrayList actMapKey = new ArrayList(actMap.Keys);

        lens = actMapKey.Count;

        Dictionary <int, List <EBAniState> > dicActState = new Dictionary <int, List <EBAniState> > ();

        for (index = 0; index < lens; index++)
        {
            ArrayList aniStateList = (ArrayList)actMap[actMapKey[index]];
            int       dicKey       = int.Parse(actMapKey[index].ToString());
            dicActState [dicKey] = new List <EBAniState> ();
            for (int i = 0, len = aniStateList.Count; i < len; i++)
            {
                EBAniState state = EBAniState.parseByMap((Hashtable)aniStateList [i]);
                state.DescParams(dicParameters);
                dicActState [dicKey].Add(state);
            }

            //EBAniSate state = EBAniSate.parseByMap ((Hashtable)list [index]);
            //			if (state.unqid > 0) {
            //
            //				state.DescParams (dicParameters);
            //
            //				controls = dicControls [state.ctrlUnqid];
            //				if (controls != null) {
            //					controls.listState.Add (state);
            //				}
            //			}
        }

        // ========= 动画控制器数据  很重要的=========
        json = File.ReadAllText(JSON_PATH_Controls);
        list = JSON.DecodeList(json);
        lens = list.Count;
        for (index = 0; index < lens; index++)
        {
            controls = EBAniControls.parseByMap((Hashtable)list [index]);
            if (controls.unqid > 0)
            {
                foreach (int lunqid in controls.layerUnqids)
                {
                    layer = dicLayers [lunqid];
                    if (layer != null)
                    {
                        controls.listLayers.Add(layer);
                    }
                }

                foreach (int lunqid in controls.parsUnqids)
                {
                    parameter = dicParameters [lunqid];
                    if (parameter != null)
                    {
                        controls.listParameters.Add(parameter);
                    }
                }
                dicControls.Add(controls.unqid, controls);

                controls.listState = dicActState[controls.activeId];
            }
        }
    }
Example #3
0
    static void makeOneEBAniCtrlAndFab(EBAniControls controls)
    {
        bool isExists = File.Exists(controls.fbxPath);

        if (!isExists)
        {
            Debug.LogWarning(controls.fbxPath + "不存在!!!");
            return;
        }

        string _fold        = Path.GetDirectoryName(controls.fbxPath);
        string _pathAniCtrl = _fold + Path.DirectorySeparatorChar + controls.name + ".controller";

        if (File.Exists(_pathAniCtrl))
        {
            File.Delete(_pathAniCtrl);
        }

        //创建animationController文件,保存在Assets路径下
        AnimatorController aniController = AnimatorController.CreateAnimatorControllerAtPath(_pathAniCtrl);

        int lens = 0;

        // =========== layer begin ============
        aniController.RemoveLayer(0);
        lens = controls.listLayers.Count;

        Dictionary <string, AvatarMask> mapAvatarMask = new Dictionary <string, AvatarMask> ();
        AvatarMask mask;

        for (int i = 0; i < lens; i++)
        {
            EBAniLayers tmp = controls.listLayers [i];
            aniController.AddLayer(tmp.name);

            AnimatorControllerLayer aniLayer = aniController.layers [i];
            aniLayer.defaultWeight = tmp.weight;
            if (string.IsNullOrEmpty(tmp.mask))
            {
                continue;
            }
            if (mapAvatarMask.ContainsKey(tmp.mask))
            {
                mask = mapAvatarMask [tmp.mask];
            }
            else
            {
                if (File.Exists(tmp.mask))
                {
                    mask = AssetDatabase.LoadAssetAtPath(tmp.mask, typeof(AvatarMask)) as AvatarMask;
                    mapAvatarMask [tmp.mask] = mask;
                }
                else
                {
                    mask = null;
                }
            }

            if (mask != null)
            {
                aniLayer.avatarMask = mask;
            }
        }

        // =========== parameter begin ============
        lens = controls.listParameters.Count;
        for (int i = 0; i < lens; i++)
        {
            EBAniParameters tmp = controls.listParameters [i];
            aniController.AddParameter(tmp.name, tmp.getPType);
        }

        // =========== AnimationClip state begin ============
        lens = controls.listState.Count;
        string _fabName   = Path.GetFileName(controls.fbxPath);
        int    _indSuffex = _fabName.LastIndexOf(".");
        string _fabName2  = _fabName.Substring(0, _indSuffex);
        string _suffex    = _fabName.Substring(_indSuffex + 1);

        if (controls.isHumanid)
        {
            string _pathClip = "";
            for (int i = 0; i < lens; i++)
            {
                EBAniState _state = controls.listState [i];
                if (string.IsNullOrEmpty(_state.actName))
                {
                    continue;
                }
                _pathClip = _fold + Path.DirectorySeparatorChar + _fabName2 + "@" + _state.actName + "." + _suffex;
                if (File.Exists(_pathClip))
                {
                    UnityEngine.Object[] _objs = AssetDatabase.LoadAllAssetsAtPath(_pathClip);
                    relishipClip(_objs, controls, _state);
                }
            }
        }
        else
        {
            UnityEngine.Object[] _objs = AssetDatabase.LoadAllAssetsAtPath(controls.aniPath);
            relishipClip(_objs, controls, null);
        }



        Dictionary <string, AnimatorState>[] stateDics = new Dictionary <string, AnimatorState> [aniController.layers.Length];

        for (int i = 0; i < lens; i++)
        {
            EBAniState _state = controls.listState [i];

            if (_state.aniClip != null || "None".Equals(_state.name))
            {
                AnimatorControllerLayer aniLayer   = aniController.layers [_state.layerIndex];              // .GetLayer (_state.layerIndex);
                AnimatorStateMachine    aniMachine = aniLayer.stateMachine;
                AnimatorState           aniState   = aniMachine.AddState(_state.name);
                if ("None".Equals(_state.name))
                {
                    aniMachine.defaultState = aniState;
                }

//				BlendTree tree = new BlendTree ();
//				tree.blendType = BlendTreeType.SimpleDirectional2D;
//				tree.blendParameter = "Action";
//				tree.AddChild(_state.aniClip, new Vector2(0.2f, 0.5f));
//				tree.name = "_state.name";

                aniState.motion = _state.aniClip;
                aniState.speed  = _state.speed;

                if (stateDics [_state.layerIndex] == null)
                {
                    stateDics [_state.layerIndex] = new Dictionary <string, AnimatorState> ();
                }
                stateDics[_state.layerIndex].Add(_state.name, aniState);
            }
        }

        //需要先将state添加完成后,才能建立 state之间的关系、
        //但这里有个问题,就是怎么判断不同layer的state

        for (int i = 0, len = controls.listState.Count; i < len; i++)
        {
            EBAniState _state = controls.listState [i];
            AnimatorControllerLayer aniLayer   = aniController.layers [_state.layerIndex];          // .GetLayer (_state.layerIndex);
            AnimatorStateMachine    aniMachine = aniLayer.stateMachine;

            if (stateDics [_state.layerIndex] [_state.name] == null)
            {
                Debug.Log(_state.layerIndex + " " + _state.name + " " + stateDics [_state.layerIndex]);
            }
            AnimatorState aniState = stateDics[_state.layerIndex] [_state.name];

            AnimatorStateTransition startTransition = null;
            if (!string.IsNullOrEmpty(_state.enterState))
            {
                if (_state.enterState.Equals("Entry"))
                {
                    aniMachine.defaultState = aniState;
                }
                else if (_state.enterState.Equals("Any"))
                {
                    startTransition = aniMachine.AddAnyStateTransition(aniState);
                }
                else if (stateDics[_state.layerIndex].ContainsKey(_state.enterState))
                {
                    startTransition = stateDics[_state.layerIndex][_state.enterState].AddTransition(aniState);
                }
            }

            if (startTransition != null)
            {
                startTransition.exitTime = _state.enterExitTime;
                startTransition.duration = 1 - _state.enterExitTime;
                //过渡用百分比的形式
                startTransition.hasFixedDuration = _state.enterHasFixed;
                //是否动画播放完才过渡
                startTransition.hasExitTime         = _state.enterHasExitTime;
                startTransition.canTransitionToSelf = false;
                for (int j = 0, jlen = _state.enterBrigdes.Count; j < jlen; j++)
                {
                    EBAniBrigdes brigde = _state.enterBrigdes [j];
                    startTransition.AddCondition(brigde.getTMode, brigde.getTVal, brigde.ebPars.name);
                }
            }


            AnimatorStateTransition endTransition = null;
            if (!string.IsNullOrEmpty(_state.endState) && stateDics[_state.layerIndex].ContainsKey(_state.endState))
            {
                endTransition = aniState.AddTransition(stateDics[_state.layerIndex][_state.endState]);
            }

            if (endTransition != null)
            {
                endTransition.exitTime = _state.endExitTime;
                endTransition.duration = 1 - _state.endExitTime;
                //过渡用百分比的形式
                endTransition.hasFixedDuration = _state.endHasFixed;
                //是否动画播放完才过渡
                endTransition.hasExitTime         = _state.endHasExitTime;
                endTransition.canTransitionToSelf = false;
                for (int j = 0, jlen = _state.endBrigdes.Count; j < jlen; j++)
                {
                    EBAniBrigdes brigde = _state.endBrigdes [j];
                    endTransition.AddCondition(brigde.getTMode, brigde.getTVal, brigde.ebPars.name);
                }
            }
        }

        // =========== 生成prefab 并绑定 animator controller ============

        string _foldFab = Path.GetDirectoryName(controls.prefabPath);

        if (!Directory.Exists(_foldFab))
        {
            Directory.CreateDirectory(_foldFab);
        }


        UnityEngine.GameObject gobjFab;
        UnityEngine.GameObject gobjFBX = AssetDatabase.LoadAssetAtPath(controls.fbxPath, typeof(UnityEngine.GameObject)) as GameObject;
        if (File.Exists(controls.prefabPath))
        {
//			File.Delete (controls.prefabPath);
            gobjFab = AssetDatabase.LoadAssetAtPath(controls.prefabPath, typeof(UnityEngine.GameObject)) as GameObject;
        }
        else
        {
            gobjFab = GameObject.Instantiate(gobjFBX) as GameObject;
        }

        Animator aniFab = gobjFab.GetComponent <Animator> ();

        aniFab.runtimeAnimatorController = aniController;
        aniFab.applyRootMotion           = false;

        UnityEngine.GameObject gobjParent;
        if (controls.isAddParent)
        {
            gobjParent = new GameObject(gobjFab.name);
            gobjFab.transform.parent = gobjParent.transform;
        }
        else
        {
            gobjParent = gobjFab;
        }

        if (!File.Exists(controls.prefabPath))
        {
            PrefabUtility.CreatePrefab(controls.prefabPath, gobjParent);
            EditorUtility.SetDirty(gobjParent);
            GameObject.DestroyImmediate(gobjParent);
        }
    }