Unity中同一次Raycast的hit.point在协程执行中途重置为0,0,0的原因是什么
问题底层原因
- 你代码中用到的
RaycastHit hit是类成员变量,而非handleFishing协程内部的局部变量。 - 执行
yield return StartCoroutine(playerScript.fishingStart())时,当前协程会挂起,直到fishingStart执行完成后才会恢复执行。在协程挂起的这段时间内,项目中其他执行频率更高的逻辑(例如每帧运行的射线检测、其他交互判定逻辑)大概率复用了这个全局的hit成员变量执行了新的射线检测:如果新的射线没有命中任何碰撞体,Unity会自动将hit的所有字段重置为默认值——point变为(0,0,0),transform变为null。 - 即使你是在射线命中的if分支内执行后续逻辑,只要协程挂起期间共享的
hit变量被其他逻辑改写,恢复执行时读取到的自然就是被覆盖后的错误值。
补充说明
你提到的「在if判断刚通过时提前赋值给destination」能解决问题的本质是:值类型的Vector3在赋值时会做值拷贝,协程挂起前存入局部变量的坐标会保存在当前协程的独立栈帧中,不会被其他逻辑修改,自然不会丢失。
优化建议
- 射线检测所用的
RaycastHit变量尽量声明为方法内的局部变量,不要复用类成员变量,避免不同逻辑间互相干扰。 - 所有协程挂起后需要用到的临时结果,都在挂起前提前存入局部变量,不要依赖共享的成员变量存储。
内容的提问来源于stack exchange,提问作者SLG
相关产品推荐
相关产品推荐

