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 的答案是正常行为,为什么每次都会增加 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)
这就是为什么你每次调用的结果都是双倍的原因
我正在尝试更好地理解属性的使用,尤其是在 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 的答案是正常行为,为什么每次都会增加 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)
这就是为什么你每次调用的结果都是双倍的原因