You need to enable JavaScript to run this app. Unity中如何实现玩家角色沿鼠标方向按指定射程弹射
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.21 01:36:10