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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:18:17