Unity中如何实现玩家角色沿鼠标方向按指定射程弹射
问题修复方案
原有代码存在以下核心问题:
- 输入检测逻辑位置错误:
Input.GetMouseButtonDown属于帧级检测接口,放在FixedUpdate中会因为物理帧和渲染帧帧率不一致导致触发丢失,需要放到Update中执行 - 条件判断缺少大括号:原有
if (Input.GetMouseButtonDown(0))后没有加大括号,仅第一行日志属于判断分支,后续朝向计算、位移逻辑每帧都会无条件执行 - 方向向量未归一化:
lookDir是鼠标和玩家的坐标差,长度随鼠标距离变化,直接乘射程会导致实际移动距离不固定,必须先归一化为单位向量 - 位移方式不符合弹射需求:
MovePosition是瞬移接口,若需要模拟弹射的物理运动效果,应该给刚体施加冲量力 - 鼠标坐标转换参数缺失:
Input.mousePosition的z轴值默认为0,转换世界坐标时建议赋值为相机到2D平面的距离,避免不同相机设置下坐标计算错误
场景1:点击鼠标后瞬间移动到鼠标方向对应射程位置(瞬移类弹射)
public class PlayerShoot : MonoBehaviour { public float shootRange = 5f; public Rigidbody2D rb; public Camera cam; private Vector2 mousePos; // 输入检测放Update里 private void Update() { // 鼠标坐标转换时补充z轴参数 mousePos = cam.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, cam.nearClipPlane)); if (Input.GetMouseButtonDown(0)) { // 计算方向并归一化 Vector2 lookDir = (mousePos - rb.position).normalized; // 计算目标位置 Vector2 targetPos = rb.position + lookDir * shootRange; rb.MovePosition(targetPos); } } }
场景2:点击鼠标后给刚体施加冲量,模拟物理弹射的运动效果
public class PlayerShoot : MonoBehaviour { public float shootForce = 10f; // 调整数值可控制弹射距离 public Rigidbody2D rb; public Camera cam; private Vector2 mousePos; private void Update() { mousePos = cam.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, cam.nearClipPlane)); if (Input.GetMouseButtonDown(0)) { Vector2 lookDir = (mousePos - rb.position).normalized; // 施加冲量力,模拟弹射效果 rb.AddForce(lookDir * shootForce, ForceMode2D.Impulse); } } }
内容的提问来源于stack exchange,提问作者Evan Tuite
相关产品推荐
相关产品推荐

