我想发送、接收和转换 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 子类。
我的问题是它们具有相同的方法,比如说执行,但是每种子类都需要不同类型的参数。
例如,手榴弹事件可能需要一个目标点、爆炸的大小和伤害。
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);
}