Unity中使用Vector3.MoveTowards实现角色跟随鼠标与追踪敌人
嘿,我来帮你搞定这个需求!咱们一步步实现你要的飞行角色逻辑:平时跟鼠标走,有敌人时就飞到敌人上方保持高度,敌人销毁后立刻切回跟随鼠标,全程用Vector3.MoveTowards做平滑移动。
实现思路与代码方案
核心逻辑就是给角色做双状态切换:「跟随鼠标」和「追踪敌人」,用一个变量控制当前状态,再处理敌人销毁后的状态回退。
第一步:定义核心变量
在你的FollowCursor类里添加这些变量,方便在Inspector面板调参,同时控制状态:
public class FollowCursor : MonoBehaviour { // 角色移动速度,直接在面板拖数值调整即可 public float moveSpeed = 6f; // 要保持在敌人上方的高度(单位:英尺,比如设3) public float heightAboveEnemy = 3f; // 当前要追踪的敌人,为null时自动切回跟随鼠标状态 private Transform currentTargetEnemy; // 主相机,用来将鼠标屏幕坐标转换为世界坐标 private Camera mainCamera;
第二步:初始化相机
在Start方法里提前获取主相机,避免每次Update重复查找:
void Start () { mainCamera = Camera.main; }
第三步:核心移动逻辑(写在Update里)
这里分两种情况判断:有敌人就追踪敌人上方的目标点,没敌人就跟随鼠标,全程用Vector3.MoveTowards实现平滑移动:
void Update () { // 先检查是否有需要追踪的敌人 if (currentTargetEnemy != null) { // 计算敌人上方的目标位置:敌人坐标 + Y轴高度偏移 Vector3 targetPos = currentTargetEnemy.position + new Vector3(0, heightAboveEnemy, 0); // 用MoveTowards做平滑移动,乘Time.deltaTime保证帧率无关的移动速度 transform.position = Vector3.MoveTowards(transform.position, targetPos, moveSpeed * Time.deltaTime); } else { // 将鼠标的屏幕坐标转换为世界坐标 Vector3 mouseWorldPos = mainCamera.ScreenToWorldPoint(Input.mousePosition); // 重点:2D项目要把Z轴设为和角色一致,防止角色因Z轴偏差飞远;3D项目按需调整Z值 mouseWorldPos.z = transform.position.z; // 同样用MoveTowards实现鼠标跟随 transform.position = Vector3.MoveTowards(transform.position, mouseWorldPos, moveSpeed * Time.deltaTime); } }
第四步:处理敌人追踪与销毁回调
首先需要一个外部可调用的方法,用来告诉角色“现在要追踪这个敌人”,比如敌人生成时调用:
// 外部调用此方法,传入敌人的Transform即可切换追踪状态 public void SetTargetEnemy(Transform enemyTransform) { currentTargetEnemy = enemyTransform; }
然后给敌人的脚本(比如命名为Enemy)添加销毁回调,让角色感知敌人消失,自动切回跟随鼠标:
private FollowCursor playerFollow; void Start() { // 找到玩家的FollowCursor组件,你也可以用标签/对象池等方式更精准地获取 playerFollow = FindObjectOfType<FollowCursor>(); } void OnDestroy() { // 敌人销毁时,将玩家的追踪目标设为null,触发回退到跟随鼠标状态 if (playerFollow != null) { playerFollow.SetTargetEnemy(null); } }
额外优化小技巧
- 如果是3D项目,鼠标坐标的Z轴可以根据相机远近调整,比如
mouseWorldPos.z = mainCamera.nearClipPlane - 可以给
heightAboveEnemy加随机范围,比如heightAboveEnemy = Random.Range(2.5f, 3.5f),让角色位置更自然 - 如果有多个敌人,可扩展逻辑选择最近的敌人作为追踪目标,当前代码默认支持单个敌人的场景
这样就完全实现你想要的功能啦!
内容的提问来源于stack exchange,提问作者Scribble Sketches
相关产品推荐
相关产品推荐

