约束类型为Type的属性

时间:2018-07-23 23:31:09

标签: c# unity3d types constraints

我正在使用一个类,该类充当我正在设计的游戏中实体的数据模型。它存储有关实体外观,大小,触发碰撞规则的信息。本质上,有关渲染对象或引发其事件的任何静态信息。

我也想让我的通用定义包括一个可互换的定义,用于定义加载对象时发生的情况以及更新对象时每个滴答发生的情况。

它是我打算在整个游戏中的所有地方实现的体系结构,但是解释我的问题的最佳示例是法术。

在我的游戏中施放咒语时,玩家会包含对我游戏中存储的资产的引用。资产是类SpellData的实例。它包含有关其粒子,大小,外观等的所有字段。我也希望它包含该法术的功能。需要明确的是,我不想在SpellData范围内执行该咒语,该咒语数据旨在完全是静态的。它只是作为一条数据,供其他事物读取以确定该做什么。

当前,我处理此问题的方式是,我有一个名为ISpellEffect的接口,该接口列出了该Spell需要执行的OnStartOnUpdate方法的签名。 / p>

然后,我有了一系列从ISpellEffect继承的类,例如HealSpellEffect,它们实际上包含这些函数的定义。我的SpellData包含一个字段和属性,

private Type SpellEffectRef = SpellEffect;

在实际资产中,将此SpellEffectRef设置为诸如HealSpellEffect的值,然后将其存储起来。

然后施放咒语的过程是

  1. Player请求服务器产生一个新的空Spell对象,并将引用传递给它打算使用的SpellData资产
  2. 服务器会注入资产和施放资产的玩家,以及一些有关咒语的其他信息,例如目标位置和目标轨迹。现在该咒语完全不在玩家范围内
  3. 然后,该咒语读取SpellData以引用对SpellEffect类的引用。它创建SpellEffect类的实例,并注入有关持续时间,损坏值或从先前传入的角色获得的其他此类信息的所有相关信息。
  4. SpellEffect的{​​{1}}被调用,其OnStart()被设置为该法术自身的OnUpdate()调用的协程。

整个设计的唯一问题是,我无法找到一种方法来约束Update()中的SpellEffectRef仅接受从SpellData继承的值。我需要这个,否则每当我尝试与该属性交互或传递该属性时,都会出现构建错误,因为创建该属性的实例不会显式创建一个ISpellEffect,请帮忙。

非常重要的一点是,我的所有功能和数据都必须像这样可插入,以保持关注点分离,低网络流量和高效的模块化代码。

编辑:建议的MCV示例

ISpellEffect

1 个答案:

答案 0 :(得分:0)

此后,我已经解决了该问题,对于任何一个偶然发现此问题的人,解决方案是使用访问器(特别是其set方法)来执行对value is SpellEffect的检查。然后,在所有实施情况下,您都必须在创建实例后简单地对其进行转换。