首页 > 解决方案 > Unity 中的 C# 属性:设置值行为异常

问题描述

我试图更好地理解属性的使用,特别是在 Unity 游戏引擎中。我要做的很简单:有一个名为“Enemy”的类,每次实例化(即产生)时,必须访问 GameSession 类并增加计数器字段“numSpawnedEnemies”的值,但是我想通过属性“NumSpawnedEnemies”访问。

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

    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 类中,在 Start() 方法中执行此操作(即 Unity 为 Enemy 类的每个实例自动提示的方法):

    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 等。

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

如果我只是将 numSpawnedEnemies 设为 public 并从 Enemy 类中增加这个字段,它就可以正常工作。那么问题是:

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

提前致谢!

标签: c#unity3dproperties

解决方案


您对属性和使用它的敌人都有 +=。

在属性替换

numSpawnedEnemies += 值;

numSpawnedEnemies = 值;


推荐阅读