【问题标题】:Store reference of a value type variable C#存储值类型变量 C# 的引用
【发布时间】:2016-08-20 18:49:04
【问题描述】:

我正在尝试为我的游戏创建状态效果,例如,这些效果会随着时间的推移影响玩家的统计数据。但是,我无法记住传递的变量,即应该修改的变量。假设您有一些状态效果,可以在 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;
    }

这就是我现在使用它的方式

    public bool TryTrigger(ref int affectedProperty)
    {
        if (condition.Invoke(affectedProperty))
        {
            affectedProperty += increaseCalculator.Invoke(affectedProperty);
        }
        return condition.Invoke(affectedProperty);
    }

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

【问题讨论】:

  • 这在 Unity 环境中是完全错误的,Asimm。对于 procs 只需使用这个 ... stackoverflow.com/a/36249404/294884
  • 对于 Unity 中的琐碎计时器,您只需使用 InvokeInvokeRepeating

标签: c# unity3d parameters reference value-type


【解决方案1】:

没有办法将“ref”存储到 .NET 中的变量;这是故意的。它消除了 C / C++ 中常见的一类错误,在这些错误中,您将 ref 存储到变量的生命周期之后,就会发生坏事。

做你想做的事情的方法是,传入一个Action&lt;T&gt;,它设置你想要更改的变量(或属性),然后当你想要更改它时,调用该操作。

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

【讨论】:

  • 目前的方式(我并不是说它按我想要的方式工作或问题已解决)是我不断调用 TryTrigger 函数传递适当的变量,但我只是在测试它和我确切地知道稍后我需要哪个变量,当不同的类将一些变量传递给它时,它会变得混乱,我当前的设置将无法正常工作。
  • 但是埃里克,这意味着我必须计算这个类之外的所有东西,这样我才能把它传递给这个对吗?
  • @Asimm :你仍然可以在你的课堂上计算你所有的东西,并且只需传递两个代表;除了获取或设置对象的属性之外什么都不做的 setter 和 getter。例如:Action&lt;int&gt; setter = (newValue) =&gt; { a.Weight = newValue; };
猜你喜欢
  • 2013-10-05
  • 1970-01-01
  • 1970-01-01
  • 2021-05-01
  • 2011-01-16
  • 2021-12-08
  • 2014-09-04
  • 1970-01-01
  • 2019-06-29
相关资源
最近更新 更多