Unity实现射线检测跟随命中移动GameObject的技术问询
解决射线追踪移动GameObject并持续更新FollowTarget的问题
我懂你想要实现的效果:当射线命中标记为Minion的GameObject时,让FollowTarget这个Vector3变量持续跟随该对象的实时位置,而不是只记录一次命中瞬间的坐标。你的当前代码只在射线检测命中的那一帧更新FollowTarget,当Minion移动后,这个值就停在原地不动了,对吧?
下面是调整后的实现方案,核心思路是存储命中的Minion对象,而非单次命中的点,这样就能持续获取它的位置:
第一步:添加成员变量存储要追踪的Minion
先在类里新增一个变量,用来保存当前选中的Minion对象:
private GameObject _followedMinion; // 存储当前要跟随的Minion public Vector3 FollowTarget; // 你的目标追踪向量
第二步:修改逻辑,实现持续追踪
调整你的MoveSelectedToCursorPosition方法,并在Update中添加持续更新逻辑:
private void Update() { // 如果有正在追踪的Minion,每一帧更新FollowTarget为它的实时位置 if (_followedMinion != null) { FollowTarget = _followedMinion.transform.position; // 持续让选中单位移动到追踪目标点 gameController.UnitSelection.MoveSelectionToPosition(FollowTarget); } } private void MoveSelectedToCursorPosition() { RaycastHit raycastHit; Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); if (Physics.Raycast(ray, out raycastHit, 1000.0f)) { if(raycastHit.collider.tag == "Terrain") { // 点击地形时,停止追踪Minion,回到普通点击移动逻辑 _followedMinion = null; gameController.UnitSelection.MoveSelectionToPosition(raycastHit.point); } else if(raycastHit.collider.tag == "Minion") { // 命中Minion时,记录这个对象,后续Update会自动持续追踪 _followedMinion = raycastHit.collider.gameObject; // 立即更新一次目标位置,避免延迟 FollowTarget = _followedMinion.transform.position; gameController.UnitSelection.MoveSelectionToPosition(FollowTarget); } } // 可选:如果射线未命中任何物体,可选择停止追踪 // else { _followedMinion = null; } }
关键逻辑说明
- 用
_followedMinion保存选中的Minion,不需要每一帧都做射线检测,既高效又能稳定追踪移动中的对象 Update方法里持续检查追踪状态,确保FollowTarget始终是Minion的当前位置- 点击地形时清空追踪对象,切换回普通的点击移动模式
- 额外建议:如果Minion可能被销毁,可以在
Update里加个空引用检查,或者在Minion的销毁事件里清空_followedMinion,避免空指针报错
内容的提问来源于stack exchange,提问作者drugsandwich
相关产品推荐
相关产品推荐

