c# - 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 的回答是这是一种正常行为,为什么它每次都会增加 x2?
提前致谢!
解决方案
您对属性和使用它的敌人都有 +=。
在属性替换
numSpawnedEnemies += 值;
和
numSpawnedEnemies = 值;
推荐阅读
- laravel - 如何用 pm2 运行 laravel 项目?
- flutter - Flutter:如何使小部件始终在阴影之上
- reactjs - 解析错误:“parserOptions.project”已为@typescript-eslint/parser 设置。该文件与您的项目配置不匹配:.eslintrc.js
- python - 如何修复烧瓶运行与 python run.py 之间的导入
- javascript - 显示纵向图像与横向图像混合的问题
- javascript - 如何使用画布和 useRefs 在反应中显示二进制图像
- haskell - 在haskell中创建具有多个条件的列表
- webpack - 如何加载在处理另一个模块时作为副作用生成的“动态生成”模块?
- html - 需要制作 3 列,我想使用 Divs 来做,但不工作
- .net - 为什么 SqlTransaction 被僵尸化了