Unity编写查找最近GameObject方法触发20余处报错如何解决
Unity C# FindClosestPoint方法大面积编译报错修复
问题复现代码
编写用于查找最近带Swing标签对象的FindClosestPoint方法时出现大面积编译报错,原始代码如下:
void FindClosestPoint() { public float DistanceToClosestPoint = Mathf.Infinity; public GameObject closestPoint = null; GameObject[] points = GameObject.FindGameObjectsWithTag("Swing"); foreach (GameObject point in points) { float DistanceToPoint = (point.transform.position - this.transform.position).sqrMagnitude; if(DistanceToPoint < DistanceToClosestPoint) { DistanceToClosestPoint = DistanceToPoint; closestPoint = point; } } }
报错表现
代码累计触发20余处报错:
foreach、in、if关键字及if下方的大括号提示「无效标记(Invalid Token)」in关键字处额外提示「元组必须包含两个元素」- 编译器提示
point变量不存在于当前上下文、this关键字在当前上下文不可用 if语句块内的赋值运算符=、语句结束符;均被判定为无效标记
多次尝试修复未成功,甚至整个脚本文件解析异常,同文件内的Start、Update生命周期函数也无法正常工作。
错误根因
核心问题是访问修饰符使用位置非法:C#语法规定public/private/protected等访问修饰符只能用于修饰类/结构体级别的成员(字段、属性、方法、嵌套类型等),不能在方法体内部修饰局部变量。
编译器在方法内部解析到不符合语法规则的public关键字后,整段代码的语法树解析直接错乱,才会导致后续所有关键字、运算符、变量都被误判为无效标记,连锁影响同文件其他代码的正常解析。
修复方案
根据变量的使用范围二选一调整即可:
- 如果两个变量仅在
FindClosestPoint方法内部使用,直接删除局部变量前的public修饰符:void FindClosestPoint() { float DistanceToClosestPoint = Mathf.Infinity; GameObject closestPoint = null; GameObject[] points = GameObject.FindGameObjectsWithTag("Swing"); foreach (GameObject point in points) { float DistanceToPoint = (point.transform.position - transform.position).sqrMagnitude; if(DistanceToPoint < DistanceToClosestPoint) { DistanceToClosestPoint = DistanceToPoint; closestPoint = point; } } } - 如果两个变量需要被类内其他方法访问,把带
public修饰的变量声明移到类层级(所有方法外部),方法内不要重复声明,仅做赋值即可:// 类内部、所有方法外部声明公共字段 public float DistanceToClosestPoint = Mathf.Infinity; public GameObject closestPoint = null; void FindClosestPoint() { // 每次查找前重置初始值 DistanceToClosestPoint = Mathf.Infinity; closestPoint = null; GameObject[] points = GameObject.FindGameObjectsWithTag("Swing"); foreach (GameObject point in points) { float DistanceToPoint = (point.transform.position - transform.position).sqrMagnitude; if(DistanceToPoint < DistanceToClosestPoint) { DistanceToClosestPoint = DistanceToPoint; closestPoint = point; } } }
调整后所有编译报错会直接消失,脚本的生命周期函数也会恢复正常解析。
内容的提问来源于stack exchange,提问作者Jonathan
相关产品推荐
相关产品推荐

