存储值类型变量的引用 C#

Asi*_*imm 0 c# parameters reference value-type unity-game-engine

我正在尝试为我的游戏创建状态效果,例如那些会随着时间的推移影响玩家统计数据的东西。但是,我无法记住传递的变量,即应该修改的变量。假设你有一些状态效果,在 10 秒内减少你的健康 10 %是一旦构造函数消失了,这两个之间的引用就会被破坏,从那时起我只编辑一些从未使用过的变量。

这是我如何实例化状态效果

    /// <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;
    }
Run Code Online (Sandbox Code Playgroud)

这就是我现在如何使用它

    public bool TryTrigger(ref int affectedProperty)
    {
        if (condition.Invoke(affectedProperty))
        {
            affectedProperty += increaseCalculator.Invoke(affectedProperty);
        }
        return condition.Invoke(affectedProperty);
    }
Run Code Online (Sandbox Code Playgroud)

这不是我想要的首先它需要一个字段传递给方法TryTrigger而不是属性第二个你不应该一直知道需要什么变量你应该在开始时传递它然后尝试触发类本身在后台处理该变量。那可能吗 ?有没有更好的方法来制作状态效果(DoT,HoT)?此外,我想让这项工作用于即时状态更改,例如在 1 分钟内将您的健康状况降低 30%,但我不确定我当前的设置是否适合。

Eri*_*ert 5

在 .NET 中无法将“引用”存储到变量;那是故意的。它消除了 C/C++ 中常见的一类错误,在这些错误中,您在变量的生命周期后存储对变量的引用,并且会发生不好的事情。

做你想做的事情的方法是,传入一个Action<T>设置你想要改变的变量(或属性),然后当你想要改变它时,你调用这个动作。

那如何解决问题呢?因为 C# 确保委托捕获的变量始终是长期存在的。