You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 07:45:05