Unity中ScoreManager的set访问器不可访问问题求助
问题分析与解决方案
嘿,这个错误我太熟悉了!咱们先搞清楚问题出在哪:
你在ScoreManager里把Score属性的set访问器设成了private:
public static int Score { get; private set; }
这就意味着只有ScoreManager内部的代码能修改这个值,外部脚本(比如你的UpgradeMenu)没法直接执行ScoreManager.Score -= upgradeCost这种修改操作——这就是你看到那个错误的原因。
正确的解决思路:用封装方法处理积分扣减
最佳实践是不要直接暴露属性的修改权限,而是在ScoreManager里添加一个专门的方法来处理积分扣减,这样既能控制修改逻辑,还能避免意外的错误。
第一步:给ScoreManager添加扣减积分的方法
在ScoreManager类里新增一个静态方法(因为Score是静态的,这样调用更方便):
public static bool SubtractScore(int amount) { // 先校验积分是否足够扣减,同时确保扣减金额有效 if (Score >= amount && amount > 0) { Score -= amount; // 别忘了触发积分更新事件,保证UI或其他依赖组件能同步更新 ScoreUpdated(Score); return true; // 返回true表示扣减成功 } // 积分不足或者扣减金额无效时,返回false并给出提示 Debug.LogWarning("Not enough score to subtract, or invalid amount!"); return false; }
第二步:在UpgradeMenu里调用这个方法
把你注释掉的ScoreManager.Score -= upgradeCost替换成调用上面的方法,还能加上积分不足的判断逻辑:
public void UpgradeArmor () { // 先尝试扣减积分,成功再执行升级逻辑 if (ScoreManager.SubtractScore(upgradeCost)) { Health.maxHealth += 2; UpdateValues(); } else { // 这里可以扩展UI提示,比如弹出“积分不足,无法升级!”的弹窗 Debug.Log("You don't have enough score to upgrade armor!"); } } public void UpgradeSouls () { if (ScoreManager.SubtractScore(upgradeCost)) { EnemySlime.ScoreOnDeath += 1; EnemySkeleton.ScoreOnDeath += 1; UpdateValues(); } else { Debug.Log("You don't have enough score to upgrade souls!"); } } public void UpgradeDamage () { if (ScoreManager.SubtractScore(upgradeCost)) { Projectile.DamageOnHit += 1; UpdateValues(); } else { Debug.Log("You don't have enough score to upgrade damage!"); } }
为什么不直接把set改成public?
虽然把Score的set改成public能快速解决错误,但这是不推荐的——直接暴露属性的修改权限会破坏封装性,其他脚本可能会不小心修改积分(比如改成负数),而且没法统一处理积分变化时的逻辑(比如触发ScoreUpdated事件)。用专门的方法来处理,能让你的代码更健壮、更容易维护。
内容的提问来源于stack exchange,提问作者mafiaf
相关产品推荐
相关产品推荐

