之前对C#的事件理解的不够透彻,总是感觉在实际应用上差一些火候。最近写character类的相关内容,有了一些理解,在这里分享一下。
&感觉大神没必要往下看了
下面开始正式内容:
比如说,角色掉血,要显示掉血的数字,使用技能要播放特效。最直接的方式是这样写:
public class Character { private float hp; public void AddHp(float _deltaHp) { hp += _deltaHp; CharacterEffect effect = new CharacterEffect(); effect.PlayAddHpEffect(); } public void DoSkill() { CharacterEffect effect = new CharacterEffect(); effect.PlaySkillEffect(); } } public class CharacterEffect { public void PlayAddHpEffect() { //Do Effect } public void PlaySkillEffect() { //DO Effect } }
现在用事件来写,是这样的:
public class Character { public delegate void CharacterDelegate<T>(T values); public CharacterDelegate<float> hpChangeEvent; public CharacterDelegate<int> skillEvent; private float hp; public void AddHp(float _deltaHp) { hp += _deltaHp; if (hpChangeEvent != null) { hpChangeEvent(hp); } } public void DoSkill(int _id) { if (skillEvent != null) { skillEvent(_id); } } } public class CharacterEffect { private Character character; public CharacterEffect(Character _target) { character = _target; character.hpChangeEvent += PlayAddHpEffect; character.skillEvent += PlaySkillEffect; } public void PlayAddHpEffect(float _hp) { //Do Effect } public void PlaySkillEffect(int _id) { //DO Effect } }
现在对比一下两种方法:
方法一,最粗暴的方式,不过不利于维护。比如,角色血量变化的效果需要改变,这时候就需要更改你所写的数据类。这样写也让你的类变得不纯粹,类中包含其他的和自己无关的东西。
方法二,用事件来做,好处就是将耦合的地方分离。让我的存储数据的类只做存储数据的事;后期更改效果也不用对我的数据类进行任何改动,利于维护。