我正在尝试为我的游戏创建状态效果,例如那些会影响玩家统计数据的因素。但是我很难记住传递的变量,即应该修改的变量。假设你有一些状态效应会使你的生命值降低10%10秒,就像我这样做一样,通过实例化一个新类传递一些参数以及需要修改的变量,在这种情况下玩家的健康状况,但问题是一旦构造函数消失了,引用就会在那些2之间被打破,从那时起我就编辑了一些永远不会被使用的变量。
以下是我如何实例化状态效果
/// <summary>
/// Creates a status effect which ticks at specified period of time without any condition.
/// </summary>
public StatusEffect(float increase, EffectIncreaseType increaseType, float timeOfStatusEffect, float tickTime)
{
this.increase = increase;
this.endTimeOfStatusEffect = Time.time + timeOfStatusEffect;
this.tickTime = tickTime;
increaseCalculator = increaseType == EffectIncreaseType.Percentage ? increaseCalculator = (a) => (int)(increase / 100f * a) : increaseCalculator = (a) => (int)increase;
}
以下是我现在使用它的方式
public bool TryTrigger(ref int affectedProperty)
{
if (condition.Invoke(affectedProperty))
{
affectedProperty += increaseCalculator.Invoke(affectedProperty);
}
return condition.Invoke(affectedProperty);
}
这不是我想要的首先它需要将一个字段传递给方法TryTrigger
而不是属性其次你不应该知道在你应该通过的所有时间都需要什么变量它在开始时然后尝试触发,类本身在后台使用该变量。那可能吗 ?是否有更好的方法来制作状态效果(DoT,HoT)?此外,我想让这项工作立即改变状态,例如将你的健康状况减少30%,持续1分钟,但我不确定我目前的设置是否有效。
答案 0 :(得分:4)
没有办法将“ref”存储到.NET中的变量中;这是故意的。它消除了C / C ++中常见的一类错误,在这种错误中,你将一个ref存储在变量的生命周期中,并且会发生不好的事情。
执行您想要的操作的方法是,传入一个Action<T>
来设置您想要更改的变量(或属性),然后当您想要更改它时,您可以调用该操作。
那怎么解决问题呢?因为C#确保委托捕获的变量始终是长寿的。