static public EBAniParameters parseByMap(Hashtable map) { EBAniParameters ret = new EBAniParameters(); ret.parse(map); return(ret); }
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]; } } }
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); } }