//保存 void Save() { if (m_currentObj == null) { return; } try { Transform t = m_currentObj.transform.GetChild(0); if (t != null) { GameObject modelObj = t.gameObject; Animation parentAnim = m_currentObj.GetComponent <Animation>(); Animation modelAnim = modelObj.GetComponent <Animation>(); if (modelAnim != null) { foreach (var item in m_skillAnimList) { Info.AnimInfo info = null; m_currentInfo.m_animMap.TryGetValue(item, out info); AnimationClip modelClip = modelAnim.GetClip(item); AnimationClip parentClip = parentAnim.GetClip(item); if (parentClip != null) { parentAnim.RemoveClip(parentClip); } //添加新的 parentClip = new AnimationClip(); parentClip.wrapMode = modelClip.wrapMode; parentClip.frameRate = modelClip.frameRate; AnimationClipCurveData[] array = AnimationUtility.GetAllCurves(modelClip); foreach (var data in array) { if (!m_typeList.Contains(data.type.BaseType)) { continue; } string path = ""; if (string.IsNullOrEmpty(data.path)) { path = "body"; } else { path = "body/" + data.path; } parentClip.SetCurve(path, data.type, data.propertyName, data.curve); } AnimationUtility.SetAnimationEvents(parentClip, AnimationUtility.GetAnimationEvents(modelClip)); string dir = "/resources/skillanim/"; string filename = m_currentInfo.m_modelType.ToString() + "-" + m_currentInfo.m_weaponType.ToString() + "-" + info.m_skillID.ToString() + "-" + ((int)info.m_skillStepType).ToString() + "-" + info.m_animName + ".anim"; if (!System.IO.Directory.Exists(Application.dataPath + dir)) { System.IO.Directory.CreateDirectory(Application.dataPath + dir); } AssetDatabase.CreateAsset(parentClip, "assets" + dir + filename); parentAnim.AddClip(parentClip, item); } } } } catch (MissingReferenceException e) { Debug.Log("SaveSkillAnimation exception, msg:" + e.Message); } }
//打开 void Open(bool isTest = false, int testID = 0, Info.ENTabelType testType = Info.ENTabelType.enNone) { Delete(); Info.ENTabelType type = Info.ENTabelType.enNone; int modelID = 0, weaponID = 0; List <int> allSkillIDList = new List <int>(); int id = 0; if (isTest) {//测试用 id = testID; if (testType == Info.ENTabelType.enHero) { type = Info.ENTabelType.enHero; HeroInfo heroInfo = m_heroTabel.Lookup(id); modelID = heroInfo.ModelId; weaponID = heroInfo.WeaponId; allSkillIDList = heroInfo.GetAllSkillIDList(); } else { type = Info.ENTabelType.enNPC; NPCInfo npcInfo = m_npcTabel.Lookup(id); modelID = npcInfo.ModelId; weaponID = npcInfo.WeaponID; allSkillIDList.AddRange(npcInfo.SkillList); allSkillIDList.Add(npcInfo.StaminaSkillID); } } else { id = m_idList[m_index]; if (m_tableIndex == 0) { type = Info.ENTabelType.enHero; HeroInfo heroInfo = m_heroTabel.Lookup(id); modelID = heroInfo.ModelId; weaponID = heroInfo.WeaponId; allSkillIDList = heroInfo.GetAllSkillIDList(); } else { type = Info.ENTabelType.enNPC; NPCInfo npcInfo = m_npcTabel.Lookup(id); modelID = npcInfo.ModelId; weaponID = npcInfo.WeaponID; allSkillIDList.AddRange(npcInfo.SkillList); allSkillIDList.Add(npcInfo.StaminaSkillID); } } ModelInfo modelInfo = m_modelTable.Lookup(modelID); if (modelInfo == null) { Debug.LogError("model error,modelID:" + modelID + ",card id:" + id + ",type:" + type.ToString()); return; } WeaponInfo weaponInfo = m_weaponTable.Lookup(weaponID); if (weaponInfo == null) { Debug.LogError("weapon error,weaponID:" + weaponID + ",card id:" + id + ",type:" + type.ToString()); return; } m_currentInfo.m_tabelType = type; m_currentInfo.m_tabelID = id; m_currentInfo.m_modelType = modelInfo.modelType; m_currentInfo.m_weaponType = (int)weaponInfo.WeaponType; List <int> skillIDList = new List <int>(); foreach (var item in allSkillIDList) {//删除相同的技能id if (!skillIDList.Contains(item)) { skillIDList.Add(item); } } GetAnimationList(skillIDList); //加载模型,并给模型加一个父 GameObject parentObj = new GameObject(); m_currentObj = parentObj; parentObj.transform.parent = ObjPanel.transform; GameObject modelObj = GameObject.Instantiate(GameData.LoadPrefab <GameObject>(modelInfo.ModelFile)) as GameObject; modelObj.name = "body"; ObjEffect.GetComponent <EDSkillEventTrigger>().MainObj = modelObj; parentObj.name = modelObj.name + "_parent"; modelObj.transform.parent = parentObj.transform; parentObj.AddComponent <AnimationCameraCallback>(); parentObj.AddComponent <AnimationEffectCallback>(); parentObj.AddComponent <AnimationEndCallback>(); parentObj.AddComponent <AnimationShaderParamCallback>(); parentObj.AddComponent <AnimationSoundCallback>(); parentObj.AddComponent <BreakPointCallback>(); parentObj.AddComponent <AttackActionCallback>(); #region//加载模型的父的animation Animation parentAnim = parentObj.AddComponent <Animation>(); string path = "Assets/Resources/SkillAnim/"; foreach (var item in m_skillAnimList) { Info.AnimInfo info = null; m_currentInfo.m_animMap.TryGetValue(item, out info); string filename = m_currentInfo.m_modelType.ToString() + "-" + m_currentInfo.m_weaponType.ToString() + "-" + info.m_skillID.ToString() + "-" + ((int)info.m_skillStepType).ToString() + "-" + info.m_animName + ".anim"; string assetPath = path + filename; AnimationClip clip = AssetDatabase.LoadMainAssetAtPath(assetPath) as AnimationClip; if (clip != null) { parentAnim.AddClip(clip, item); } else { Debug.Log("load clip failed, path:" + assetPath); } } #endregion #region//加载模型的脚本和animation if (modelObj.GetComponent <AnimationCameraCallback>() == null) { modelObj.AddComponent <AnimationCameraCallback>(); } if (modelObj.GetComponent <AnimationEffectCallback>() == null) { modelObj.AddComponent <AnimationEffectCallback>(); } if (modelObj.GetComponent <AnimationEndCallback>() == null) { modelObj.AddComponent <AnimationEndCallback>(); } if (modelObj.GetComponent <AnimationShaderParamCallback>() == null) { modelObj.AddComponent <AnimationShaderParamCallback>(); } if (modelObj.GetComponent <AnimationSoundCallback>() == null) { modelObj.AddComponent <AnimationSoundCallback>(); } if (modelObj.GetComponent <BreakPointCallback>() == null) { modelObj.AddComponent <BreakPointCallback>(); } if (modelObj.GetComponent <AttackActionCallback>() == null) { modelObj.AddComponent <AttackActionCallback>(); } if (LoadAnimationClip(modelObj, modelInfo.modelType, (int)weaponInfo.WeaponType)) { Animation modelAnim = modelObj.GetComponent <Animation>(); //加载模型的事件 foreach (var item in m_skillAnimList) { Info.AnimInfo info = null; m_currentInfo.m_animMap.TryGetValue(item, out info); AnimationClip copyClip = modelAnim.GetClip(GetFullAnimName(info.m_animName, m_currentInfo.m_modelType, m_currentInfo.m_weaponType)); if (copyClip == null) { Debug.LogError("body get animation failed, anim:" + info.m_animName); } modelAnim.AddClip(copyClip, item); AnimationClip modelClip = modelAnim.GetClip(item); AnimationClip parentClip = parentAnim.GetClip(item); if (parentClip != null) {//从parentObj中获取事件信息 AnimationClipCurveData[] array = AnimationUtility.GetAllCurves(parentClip); foreach (var data in array) { if (!m_typeList.Contains(data.type.BaseType)) { continue; } string dataPath = ""; if (data.path.Contains("body")) { dataPath = data.path.Substring(4); } else if (data.path.Contains("body/")) { dataPath = data.path.Substring(5); } modelClip.SetCurve(dataPath, data.type, data.propertyName, data.curve); } AnimationUtility.SetAnimationEvents(modelClip, AnimationUtility.GetAnimationEvents(parentClip)); } else {//获取原来的事件信息,存储在resources/skillanim目录下 string dir = "assets/resources/skillanim/"; string animName = "a-" + m_currentInfo.m_modelType.ToString() + "-w" + m_currentInfo.m_weaponType.ToString() + "-" + info.m_animName + ".anim"; UnityEngine.Object tempObj = AssetDatabase.LoadMainAssetAtPath(dir + animName); if (tempObj == null) { //Debug.LogWarning("animation name:" + animName); //resources/skillanim目录下不存在 //从原动作中获取 AnimationClip bodyClip = modelAnim.GetClip(info.m_animName); if (bodyClip == null) { Debug.LogError("animation is null, name:" + info.m_animName); } else { AnimationClipCurveData[] array = AnimationUtility.GetAllCurves(bodyClip); foreach (var data in array) { if (!m_typeList.Contains(data.type.BaseType)) { continue; } //if (!string.IsNullOrEmpty(data.path)) //{//不是body下的 // continue; //} modelClip.SetCurve(data.path, data.type, data.propertyName, data.curve); } AnimationUtility.SetAnimationEvents(modelClip, AnimationUtility.GetAnimationEvents(bodyClip)); } } else { AnimationClip clip = GameObject.Instantiate(tempObj) as AnimationClip; AnimationClipCurveData[] array = AnimationUtility.GetAllCurves(clip); foreach (var data in array) { if (!m_typeList.Contains(data.type.BaseType)) { continue; } //if (!string.IsNullOrEmpty(data.path)) //{//不是body下的 // continue; //} modelClip.SetCurve(data.path, data.type, data.propertyName, data.curve); } AnimationUtility.SetAnimationEvents(modelClip, AnimationUtility.GetAnimationEvents(clip)); GameObject.DestroyImmediate(clip); } } } } else { Debug.LogError("LoadAnimationClip failed"); } #endregion #region//加载武器 if (weaponInfo.LeftModelID != 0) { Transform leftArmParentTrans = Actor.S_LookupBone2(modelObj.transform, weaponInfo.LeftPoint); ArmLoad(leftArmParentTrans, weaponInfo.LeftModelID, weaponInfo.IsHideLeftModel); } if (weaponInfo.RightModelID != 0) { Transform rightArmParentTrans = Actor.S_LookupBone2(modelObj.transform, weaponInfo.RightPoint); ArmLoad(rightArmParentTrans, weaponInfo.RightModelID, weaponInfo.IsHideRightModel); } #endregion #region//刷新动画列表 Animation AniList = modelObj.GetComponent <Animation>(); m_loadedAnimationList.Clear(); foreach (AnimationState state in AniList) { m_loadedAnimationList.Add(state.name); } m_loadedAnimationList.AddRange(m_skillAnimList); m_playingAniIndex = m_loadedAnimationList.Count - 1; ED_SimActorManager.Instance.Clear(); ED_SimActorManager.Instance.AddActor(m_currentObj); #endregion Selection.activeObject = modelObj; }