GameObject需同时跟随光标与追踪敌人?脚本故障排查及改写咨询
解决角色跟随光标/敌人位置的脚本问题
嘿,先聊聊你当前脚本大概率跑不起来的几个核心原因:
- 代码片段不完整:你贴的内容连
Input.mousePosition都没写完,语法上直接通不过编译 - 缺少敌人状态检测逻辑:完全没看到判断"enemy"对象是否存在的代码,自然没法触发切换到追敌人的状态
- ScreenToWorldPoint的Z轴疏漏:2D场景里如果不设置Z值,默认的0会让角色跑到相机平面后方,看起来像是完全没移动
- 无状态切换分支:只写了跟随光标的部分,没有添加敌人存在时的移动逻辑分支
下面是完全贴合你需求的改写脚本,注释已经写得很清楚:
using UnityEngine; public class FollowCursor : MonoBehaviour { private GameObject enemy; // 控制角色移动的平滑速度,数值越大移动越快 public float moveSpeed = 8f; void Update() { // 实时查找场景中名为"enemy"的对象(适配敌人动态生成/销毁的场景) enemy = GameObject.Find("enemy"); Vector3 targetPosition; if (enemy != null) { // 敌人存在时,目标位置设为敌人的世界坐标 targetPosition = enemy.transform.position; } else { // 敌人消失后,将鼠标屏幕坐标转换为世界坐标 // 固定Z轴为角色初始Z值,避免角色跑到相机后方 Vector3 mouseWorldPos = Camera.main.ScreenToWorldPoint(Input.mousePosition); mouseWorldPos.z = transform.position.z; targetPosition = mouseWorldPos; } // 平滑移动到目标位置,避免瞬间跳转的生硬感 transform.position = Vector3.MoveTowards(transform.position, targetPosition, moveSpeed * Time.deltaTime); } }
额外给你几个优化小建议:
- 如果敌人是固定对象只是切换激活状态,可以用标签查找(
GameObject.FindGameObjectWithTag),比按名称查找效率更高 - 要是敌人生成/销毁频率高,建议把
GameObject.Find移到Start里,或者用事件监听敌人的状态变化,避免每帧查找浪费性能 - 3D场景下不用固定Z轴,根据你的相机类型调整
ScreenToWorldPoint的参数即可
内容的提问来源于stack exchange,提问作者Scribble Sketches
相关产品推荐
相关产品推荐

