Пример #1
0
    //保存
    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);
        }
    }
Пример #2
0
    //打开
    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;
    }