Unity运行报错CS0117:'Score'无'score'定义,VSCode无报错如何解决?
报错原因及对应解决方案
error CS0117: 'Score' does not contain a definition for 'score' 本质是运行时AddScore类访问的Score类不是你写的带score静态字段的Score类,按以下优先级排查:
- 检查
Score脚本的文件名是否和类名完全一致
Unity要求继承MonoBehaviour的类,类名必须和脚本文件名完全匹配,大小写也需要对应。比如你类名是Score,脚本文件名必须是Score.cs,只要有一个字符不符就会导致类无法被正常识别。 - 检查是否存在重名的
Score类
如果你项目里其他脚本/导入的插件里也有叫Score的类,AddScore访问时会优先匹配到其他没有score字段的Score类。排查方式:- 鼠标在VSCode里选中AddScore里的
Score类名,按F12跳转,看跳转到的是不是你写的Score脚本 - 如果跳转错了,可以把你的Score类改个唯一的名字比如
GameScore,对应修改访问代码为GameScore.score++即可,也可以用全局命名空间限定写法:global::Score.score++
- 鼠标在VSCode里选中AddScore里的
- 检查两个脚本的命名空间和存放路径
- 确认你的两个脚本都没有被自定义
namespace包裹,如果其中一个加了命名空间,另一个脚本需要先using对应命名空间才能访问 - 确认Score脚本没有存放在
Editor文件夹下,Editor文件夹下的代码仅在Unity编辑模式下编译,运行模式的游戏代码无法访问该文件夹内的类,把Score脚本移到普通的游戏代码目录(比如自建的Scripts文件夹)即可
- 确认你的两个脚本都没有被自定义
- 额外验证方案
可以临时在AddScore的OnTriggerEnter2D方法里加一行调试代码,确认访问的类是否正确:
如果输出为0就说明你访问的不是自己写的Score类,按上面的步骤排查重名/文件名/路径问题即可。private void OnTriggerEnter2D (Collider2D collision) { // 输出找到的Score类的所有公共静态字段数量,正常应该输出1(对应你定义的score字段) Debug.Log(typeof(Score).GetFields(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Static).Length); // Score.score++; }
内容的提问来源于stack exchange,提问作者Slow_Understanding
相关产品推荐
相关产品推荐

