我正在努力更好地理解属性的使用,尤其是在Unity游戏引擎中。我要做的很简单:有一个类叫做"敌人"每次它被初始化(即派生(时,必须访问类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函数所示;值";实际上是1、2、4等
将集合{}中的值设置为0(在将其值分配给numSpawnedEnemies之后(不会更改任何内容,但即使会更改,也无法向我解释这种行为(事实上,我希望每次访问该属性时都会重置它(。
如果我简单地将numSpawnedEnemies设置为public,并从Enemy类中增加这个字段,它就可以很好地工作。问题是:
- 那是怎么回事"值";是否跟踪以前的值?(不是每次我从某个点访问该属性时都应该"重置"吗?(
- 如果问题1的答案是这是一种正常行为,为什么它每次都会增加x2
提前感谢!
您在属性和使用它的敌人上都有+=。
在属性中替换
numSpawnedEnemies+=值;
带
numSpawnedEnemies=值;
类似@皮诺·德·弗朗西斯科说
中的属性更改声明
numSpawnedEnemies += value;
至
numSpawnedEnemies = value;
解释
您可以将属性视为"Get"one_answers"Set"方法,具体取决于您的implement。所以你的NumSpawnedEnemies就像一样
void NumSpawnedEnemies(int value){
numSpawnedEnemies += value;
}
int NumSpawnedEnemies(){ return numSpawnedEnemies;}
那么如果你调用NumSpawnedEnemies+=1等于您通过numberSpanwedEnemies+1作为值至繁殖的敌人数量(int值(
那么你陈述的最后一个方程式就是
numberSpawnedEnemies = numberSpawnedEnemies + value
numberSpawnedEnemies = numberSpawnedEnemies + (numberSpawnedEnemies + 1)
这就是为什么你每次打的结果都是双倍的原因