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

Unity实现点击鼠标时玩家角色向光标冲刺/突进功能

Unity向光标位置冲刺并限制最大距离的实现方案

核心思路

你原来的代码是直接传送角色,要改成冲刺效果,关键是平滑移动角色到目标点,同时加上最大冲刺距离的限制——如果光标射线命中的点超出最大距离,就取角色朝向光标方向的最大距离点作为目标。

实现步骤与代码示例

在你的角色脚本里添加以下变量和逻辑:

using UnityEngine;
using System.Collections;

public class PlayerDash : MonoBehaviour
{
    // 最大冲刺距离
    public float maxDashDistance = 5f;
    // 冲刺速度
    public float dashSpeed = 15f;
    // 冲刺时锁定输入,防止连续触发
    private bool isDashing = false;

    // 射线相关变量
    public Camera mainCamera;
    public LayerMask layerMask;

    void Update()
    {
        if (Input.GetMouseButtonDown(1) && !isDashing)
        {
            Ray ray = mainCamera.ScreenPointToRay(Input.mousePosition);
            if (Physics.Raycast(ray, out RaycastHit hit, Mathf.Infinity, layerMask))
            {
                // 保持角色Y轴高度不变,计算初始目标位置
                Vector3 targetPosition = new Vector3(hit.point.x, transform.position.y, hit.point.z);
                
                // 检查距离,超出最大冲刺范围就截断
                float distanceToTarget = Vector3.Distance(transform.position, targetPosition);
                if (distanceToTarget > maxDashDistance)
                {
                    // 取角色朝向目标方向的最大距离点
                    targetPosition = transform.position + (targetPosition - transform.position).normalized * maxDashDistance;
                }

                // 启动冲刺协程
                StartCoroutine(DashToTarget(targetPosition));
            }
        }
    }

    // 协程实现平滑冲刺
    IEnumerator DashToTarget(Vector3 target)
    {
        isDashing = true;

        // 逐步移动到目标点,距离小于0.01时停止
        while (Vector3.Distance(transform.position, target) > 0.01f)
        {
            transform.position = Vector3.MoveTowards(transform.position, target, dashSpeed * Time.deltaTime);
            yield return null;
        }

        // 确保最终位置精准对齐目标
        transform.position = target;
        isDashing = false;
    }
}

关键细节说明

  • 最大距离限制:通过Vector3.Distance判断当前位置到目标点的距离,超出时用normalized获取方向向量,再乘以最大距离得到合法目标点。
  • 平滑冲刺:用Vector3.MoveTowards配合协程,每帧移动一小段距离,实现流畅的冲刺效果,dashSpeed可调整冲刺快慢。
  • 输入锁定:isDashing变量防止冲刺过程中重复触发,避免角色连续冲刺。
  • Y轴保持:和你原来的代码逻辑一致,目标点Y轴沿用角色当前值,避免角色突然上下位移。

额外优化建议

  • 配合动画系统:在协程开始时播放冲刺动画,结束时切回待机/移动动画。
  • 禁用常规移动:冲刺期间暂时关闭角色的普通移动逻辑,避免冲突。
  • 物理兼容:如果角色用Rigidbody控制,可改用rb.MovePosition代替transform.position,物理表现更稳定。

内容的提问来源于stack exchange,提问作者Happy Bell

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 07:00:59