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
相关产品推荐
相关产品推荐

