统一中的C#属性:集值行为异常

统一中的C#属性:集值行为异常,c#,unity3d,properties,C#,Unity3d,Properties,我试图更好地理解属性的使用,特别是在Unity游戏引擎中。 我必须做的很简单:有一个叫做“敌人”的类,每次实例化(即繁殖)它时,必须访问该类GameSession并增加计数器字段“NumSpawnedEquaries”的值,但我希望通过属性“NumSpawnedEquaries”访问该类 注意:GameSession是一个单例(即仅存在一个实例),但为了简单起见,我省略了相关代码 public class GameSession : MonoBehaviour { int num

我试图更好地理解属性的使用,特别是在Unity游戏引擎中。 我必须做的很简单:有一个叫做“敌人”的类,每次实例化(即繁殖)它时,必须访问该类GameSession并增加计数器字段“NumSpawnedEquaries”的值,但我希望通过属性“NumSpawnedEquaries”访问该类

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

gameSession=FindObjectOfType();
//Unity函数搜索GameSession实例
gameSession.numsPawnedFeeds+=1;
然而,结果并不是我所期望的:事实上,每次x2(即1、2、4、8、16、32、64…)而不是+1时,计数器“numspawnedEquires”都会增加。这是因为,如debug.console函数所示,“value”的值实际上是1、2、4等等

将集合{}中的值设置为0(在将其值指定给numspawnedDefauries之后)不会改变任何东西,但即使它会改变,也不会向我解释这种行为(事实上,我希望每次访问属性时都会重置它)

如果我简单地将numspawnedDeburies设置为public,并从敌方类中增加这个字段,那么效果很好。 问题是:

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

  • 提前谢谢

    你的财产和使用它的敌人都有+=

    在属性中替换

    numsPawnedFeeds+=值

    nums pawnedfeeds=值

    短解类 @弗朗西斯科皮诺说

    属性中的更改语句

    numSpawnedEnemies += value;
    

    解释

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

    void NumSpawnedEnemies(int value){
       numSpawnedEnemies += value;
    }
    
    int NumSpawnedEnemies(){ return numSpawnedEnemies;}
    
    那么,如果你调用numspawnedDegrees+=1 它等于您将数值PanwedEquires+1作为值传递 到numspawnedTokens(int值)

    那么你们陈述的最后一个等式是

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

    这就是为什么每次打电话时,您的成绩都是原来的两倍

    非常感谢!我想这是一个很小的初学者的错误。也谢谢你的详细解释!
    void NumSpawnedEnemies(int value){
       numSpawnedEnemies += value;
    }
    
    int NumSpawnedEnemies(){ return numSpawnedEnemies;}
    
    numberSpawnedEnemies = numberSpawnedEnemies + value
    numberSpawnedEnemies = numberSpawnedEnemies + (numberSpawnedEnemies + 1)