EC(ECS)思想技能编辑器

Unity中基于EC思想的技能特效管理
前言:根据不同的需求,在一个技能上添加不同的动画,声音,特效(这里编辑器拓展就不说了,还是主要说EC思想,代码中其他方法不用看)
1.首先还是EC思想,先从E(entity)开始,创建一个人物实体e(以下简称为"e"),e拥有不同的技能(技能1,技能2),每个技能的动画(特效,音效,以下以动画为例)不同,所以对应来添加这些动画,特效,音效.
public class Player : MonoBehaviour
{
    //玩家身上,的技能集合
    //技能名称为key,技能组件集合为value
    public Dictionary<string, List<SkillBase>> skillsList = new Dictionary<string, List<SkillBase>>(); 

    
    //动画部分
    RuntimeAnimatorController controller; //动画控制器

    public AnimatorOverrideController overrideController; //动画覆盖控制器

    //特效部分
    public Transform effectsparent; //特效图节点

    //音效
    AudioSource audioSource;   //音效

    //定义一个技能id
    string m_strSkillId;

    static string m_strPath;

    //Player

    Animator anim;
    public void InitData()
    {
        //动画控制器
        overrideController = new AnimatorOverrideController();
        controller = Resources.Load<RuntimeAnimatorController>("Player"); 
        overrideController.runtimeAnimatorController = controller;
        anim.runtimeAnimatorController = overrideController;

        audioSource = gameObject.AddComponent<AudioSource>(); //音效是添加上的

        effectsparent = transform.Find("effectsparent");  // 特效的父节点
       // gameObject.name = path;
        //加载技能配置表
        LoadAllSkill();
    }

    public void play()
    {
        //根据条件判断播放不同的组件  遍历   skillsList  item.player
        //_Anim.Play();
        //声音的
        //特效的
        //根据技能组件播放一遍。
        Debug.Log("skillsList" + " " + skillsList.Count);


        if(m_strSkillId != null && skillsList.ContainsKey(m_strSkillId))
        {
            foreach(var item in skillsList[m_strSkillId])
            {
                item.Play();
            }
        }

    }

    private Skill_Anim _Anim;
    private Skill_Audio _Aduio;
    private Skill_Effects _Effect;

    //在人物身上配置技能数据
    public void SetData(string skillName)
    {

        m_strSkillId = skillName;
        List<SkillXml> skillList = GameData.Instance.GetSkillsByRoleName("Teddy");
        //Debug.Log(skillList[0]);
        foreach (var item in skillList) //
        {
            if (item.name == skillName) //找到指定的技能配置,把技能配置转换成类对象。
            {
                foreach (var ite in item.skills)
                {
                    foreach (var it in ite.Value)
                    {
                        if (ite.Key.Equals("动画"))
                        {
                            //加载一个动画片段
                            AnimationClip clip = AssetDatabase.LoadAssetAtPath<AnimationClip>("Assets/GameDate/Anim/" + it + ".anim");
                            if (_Anim == null) _Anim = new Skill_Anim(this); //创建一个技能的类对象
                            _Anim.SetAnimClip(clip);
                            //skillsList[item.name].Add(_Anim);
                        }
                        else if (ite.Key.Equals("音效"))
                        {
                            //加载一个音效的资源
                            AudioClip clip = AssetDatabase.LoadAssetAtPath<AudioClip>("Assets/GameDate/Audio/" + it + ".mp3");
                            if (_Aduio == null) _Aduio = new Skill_Audio(this); //创建一个音效的对象。
                            _Aduio.SetAnimClip(clip);
                            //skillsList[item.name].Add(_Anim);
                        }
                        else if (ite.Key.Equals("特效")) //特效
                        {
                            GameObject clip = AssetDatabase.LoadAssetAtPath<GameObject>("Assets/GameDate/Effect/Skill/" + it + ".prefab");
                            if(_Effect == null) _Effect = new Skill_Effects(this);
                            _Effect.SetGameClip(clip); //
                            //skillsList[item.name].Add(_Anim);
                        }
                    }
                }
            }
        }

    }


    public static Player Init(string path)
    {
      
        if (path != null)
        {
            m_strPath = path;
            Debug.Log("Init" + path);
            Debug.Log("strPath" + m_strPath);
            string str = "Assets/aaa/" + path + ".prefab";
            GameObject obj = AssetDatabase.LoadAssetAtPath<GameObject>(str);
            if (obj != null)
            {
                //动画
                Player player = Instantiate(obj).GetComponent<Player>();
                player.overrideController = new AnimatorOverrideController();
                player.controller = Resources.Load<RuntimeAnimatorController>("Player");
                player.overrideController.runtimeAnimatorController = player.controller;
                player.anim.runtimeAnimatorController = player.overrideController;
                //添加音效组件
                player.audioSource = player.gameObject.AddComponent<AudioSource>();
                //特效的父节点
                player.effectsparent = player.transform.Find("effectsparent");
                player.gameObject.name = path;
                //加载技能配置表
                player.LoadAllSkill();
                return pla
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值