前言:根据不同的需求,在一个技能上添加不同的动画,声音,特效(这里编辑器拓展就不说了,还是主要说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