【发布时间】:2016-07-02 13:27:42
【问题描述】:
我有一个名为“RelativeData”的类,用于通过状态机比较值。我正在尝试构建一个以给定间隔拍摄数据快照的类。间隔是:StateBegins、StateMachineBegins,以及我遇到的问题,liveValue。 我面临的挑战是我希望跟踪的 liveValue(s) 在一个单独的类中,我想添加大量值来跟踪我的 RelativeData 对象,所以我的类需要是通用的。
这个类的重点是拍摄数据的快照。
class RelativeData<T>
{
T initialValue;
T stateValue;
T liveValue; //currently not implemented, since i can't store a ref
public void StateMachineActive(T curValue)
{
initialValue = curValue;
}
public void StateUpdated(T curValue)
{
stateValue = curValue;
}
}
ex) 一个名为“能量”的float,属于一个法术。当状态机激活时,它会在我的 relativeData 列表中调用 StateMachineActive,它最好可以使用 liveValue 在内部更新,而不必传递 curValue
当前修复)
我有一个经理将这些值添加到泛型类型的字典中。Dictionary<myKey,relativeData<bool>> relativeBoolDataDictionary<myKey,relativeData<float>> relativeFloatData
& ETC...
但是要调用 StateUpdated,我需要传递当前值,我需要使用 myKey 从大型开关盒中获取该值。可行,但在 C++ 时代,我可以只存储一个 T*。无法打开不安全模式,因为 Unity 似乎不允许这样做。我可以将实际值存储在其中,但是每次我想在整个代码中的任何地方都获取 currentValue (这比获取相对值更频繁地发生)时,它会增加复杂性(更多的 proc 重)。至少我认为。
问题: 1) 我可以存储指向 Icomparable 类型的指针吗?我是否可以让 liveValue 指向其他地方的 valueType/Primitive 数据类型(即 int、long、enum),就像在 C++ 中使用 T* 一样。我知道我可以使用“ref”传递,但我似乎无法存储它。
2)我是否应该只将实际值存储在那里,并通过两层开关盒检索所有内容(首先知道要调用哪个字典,浮点数,布尔值......然后检索值)这不会过多地增加运行时间吗?非相对值:能量、稳定性等,在法术中持续用于内部计算。相对仅用于状态机。 (可能同时激活 2~60 个法术)
3) 这只是一个糟糕的模式吗,有没有更好的模式,我只是没有看到,更好的方法来获取通用数据的快照?
4) 我知道数组是 ref,但这意味着我的原始数据都必须变成数组,对吗?
5) 我应该保持原样吗?它可以工作,只是有点混乱和慢。
它们都是IComparable:整数、浮点数、布尔值、枚举......
【问题讨论】:
标签: c# generics snapshot state-machine ref