我想发送,接收和转换SkillEvent类的子类,并能够根据其类型在内部抓取自定义参数。
可能有许多具有不同参数的不同子类。
有没有一种方法可以避免为每种技能编写不同的方法?
class SkillEvent { float timestamp, EventType type }
class GrenadeSkillEvent : SkillEvent { Vector3 target_point}
[ClientRpc]
RpcSendSkillEvent(SkillEvent event){
eventManager.ExecuteEvent(event);
}
ExecuteEvent(SkillEvent event){
switch(event.type){
case GrenadeSkillEvent :
GrenadeSkillEvent grenadeEvent = (GrenadeSkillEvent) event;
float grenadeParam = event.grenadeParam;
break;
case OtherSkillEvent :
OtherSkillEvent otherEvent = (OtherSkillEvent ) event;
string stringParam = event.stringParam;
break;
}
}
我认为可以这样做,但显然不行。
有没有一种方法可以避免为每种技能编写不同的方法?
编辑 :
GrenadeSkillEvent和OtherSkillEvent是SkillEvent的子级。
它们都有一个时间戳和一种类型,我认为我可能需要帮助将事件变量转换为正确的SkillEvent子类。
我的问题是,它们具有相同的方法(可以说是execute),但是每种子类都需要不同类型的参数。
例如,一个GrenadeEvent可能需要一个目标点,爆炸的大小和伤害。
一个BonusEvent可能有些HP添加到播放器。
一个TerrainEvent可以激活一个重要的目标靠近播放器等一些自定义动画
这些技能背后的所有逻辑都是相同的。
它们都有两种方法:
Simulate(SkillEvent Event) and Render(SkillEvent Event)
但是例如在GrenadeSkill中,我需要它
Simulate(GrenadeSkillEvent Event) and Render(GrenadeSkillEvent Event)
编辑2:
networkedPlayer.RpcOnSkillEvent(
new SkillEvent[] {
new GrenadeSkillEvent() {
timestamp = state.timestamp,
id = 0,
point = target
}
}
);
编辑3:
var dictionary = new Dictionary<Type, Action<SkillEvent>> {
{
typeof(GrenadeSkillEvent), (SkillEvent e) => {
Debug.Log("GrenadeSkill OnConfirm point"+ ((GrenadeSkillEvent)e).point);
}
}
};
public override void OnConfirm(SkillEvent skillEvent) {
if (skillEvent == null) return;
Debug.Log(skillEvent.GetType());
dictionary[skillEvent.GetType()](skillEvent);
}
慕田峪4524236
相关分类