Unity 中的 C# 属性:设置值行为异常

C# properties in Unity: set value behaving oddly

我正在尝试更好地理解属性的使用,尤其是在 Unity 游戏引擎中。 我要做的非常简单:有一个名为“Enemy”的 class,每次实例化(即生成)时,都必须访问 class GameSession 并增加计数器的值字段“numSpawnedEnemies”,但是我希望可以通过 属性“NumSpawnedEnemies”访问。

注意:GameSession是一个单例(即只有1个实例存在),但为了简单起见,我省略了相关代码。

    public class GameSession : MonoBehaviour
{
    int numSpawnedEnemies = 0;
    
    
    public int NumSpawnedEnemies
    {
        get
        {
            return numSpawnedEnemies;
        }
        set
        {
            Debug.Log("Value: " + value); // Just for debugging purpose
            numSpawnedEnemies += value;
        }
    }
}

在 Enemy 中 class 然后我在 Start() 方法中执行此操作(即 Unity 为 Enemy class 的每个实例自动提示的方法):

    gameSession = FindObjectOfType<GameSession>();
    // Unity function searching for the instance of GameSession
    gameSession.NumSpawnedEnemies += 1;

然而,结果并不是我所期望的:事实上,计数器“numSpawnedEnemies”每次增加 x2(即 1、2、4、8、16、32、64...),而不是+1。这是因为,正如 debug.console 函数所示,“value”的值实际上是 1、2、4 等

在集合 {} 中将值设置为 0(在将其值分配给 numSpawnedEnemies 之后)不会改变任何东西,但即使它会改变,也无法向我解释这种行为(事实上我希望每次我访问 属性).

时它都会重置

如果我简单地将 numSpawnedEnemies 设置为 public 并从 Enemy class 增加此字段,它工作正常。 接下来的问题是:

  1. 为什么“值”会跟踪以前的值? (每次我从某个点访问 属性 时,它不应该被“重置”吗?)
  2. 如果问题 1 的答案是正常行为,为什么每次都会增加 x2?

提前致谢!

你在 属性 和使用它的敌人身上都有 +=。

在属性替换

numSpawnedEnemies += 值;

numSpawnedEnemies = 值;

像这样的简短解决方案 @Pino De Francesco 说

更改属性中的语句
numSpawnedEnemies += value;

numSpawnedEnemies = value;

说明

您可以将 属性 视为 'Get' 和 'Set' 方法,具体取决于您的实现。 所以你的 NumSpawnedEnemies 就像

void NumSpawnedEnemies(int value){
   numSpawnedEnemies += value;
}

int NumSpawnedEnemies(){ return numSpawnedEnemies;}

那么如果你调用 NumSpawnedEnemies += 1 它等于你传递 numberSpanwedEnemies + 1 作为值 至 NumSpawnedEnemies(整数值)

那么你的陈述的最终等式是

numberSpawnedEnemies = numberSpawnedEnemies + value
numberSpawnedEnemies = numberSpawnedEnemies + (numberSpawnedEnemies + 1)

这就是为什么你每次调用的结果都是双倍的原因