Unity跨脚本修改变量报错CS0120:非静态字段需对象引用
解决Unity中CS0120错误:访问Movement.Score时需要对象引用
问题原因
这个CS0120错误的核心逻辑很直白:你试图直接通过类名访问一个非静态成员,但非静态成员属于具体的对象实例,必须通过对象来调用。
看你的代码,虽然你在Movement里写了public static int Score = 0;,但编译器却判定Score是非静态的,大概率是下面两个小疏忽之一:
- 你实际的
Movement脚本里不小心删掉了static关键字(可能粘贴代码时写错了) Movement脚本的文件名和类名不一致!Unity要求脚本文件名必须和类名完全匹配(比如类叫Movement,文件必须是Movement.cs),否则静态成员也无法通过类名正常访问。
适合新手的两种修复方法
方法1:保持Score为静态变量(单玩家游戏首选)
如果你的游戏是单玩家,静态变量是最简单的选择——它是全局共享的,不需要找对象实例就能访问:
- 先检查
Movement脚本:确保Score的定义是public static int Score = 0;,并且脚本文件名是Movement.cs - 你的
PlatformTrigger代码不需要改动,直接用Movement.Score++;就可以正常运行了。
方法2:把Score改成非静态变量(多玩家场景必备)
如果以后要做多玩家,每个玩家需要独立的分数,就必须用非静态变量:
- 修改
Movement里的Score定义,去掉static:public int Score = 0; // 去掉static,变成每个Player对象专属的分数 - 修改
PlatformTrigger的OnTriggerEnter方法,通过碰撞的Player对象获取它身上的Movement组件,再访问分数:void OnTriggerEnter(Collider col) { Debug.Log("触发器被触发啦!"); if (col.gameObject.name == "Player") { // 从碰撞的Player对象上获取Movement组件 Movement playerMovement = col.GetComponent<Movement>(); // 加个判断,避免找不到组件时报错崩溃 if (playerMovement != null) { playerMovement.Score++; Debug.Log("当前分数:" + playerMovement.Score); } else { Debug.LogWarning("警告:Player对象上没有挂载Movement脚本!"); } } }
新手小提示
- 永远记得Unity脚本的文件名必须和类名完全一致,大小写都不能错,否则会出现各种莫名其妙的错误
- 访问组件时最好加
null判断,就像上面的if (playerMovement != null),这样能避免游戏崩溃 - 多用
Debug.Log输出信息,能帮你快速定位问题(比如看看触发器有没有触发,组件有没有找到)
内容的提问来源于stack exchange,提问作者Brandon Wright
相关产品推荐
相关产品推荐

