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

求助:2D平台游戏中基于物理的布娃娃角色鼠标瞄准功能开发

鼠标控制前臂瞄准实现
  • 先把鼠标的屏幕坐标转换成2D世界坐标,注意将z轴设为0,避免深度偏差。
  • 计算前臂位置到鼠标位置的方向向量,用Mathf.Atan2算出旋转角度后转成度数。
  • 若角色有左右翻转逻辑(比如通过x轴缩放判断朝向),要同步翻转手臂的缩放并调整角度,防止瞄准方向反向。
  • 因为角色是物理驱动的ragdoll,别直接修改前臂的Transform旋转,用刚体的MoveRotation方法让物理系统平滑处理:
public Transform forearm;
public Camera mainCam;
private Rigidbody2D forearmRb;

void Awake()
{
    forearmRb = forearm.GetComponent<Rigidbody2D>();
}

void Update()
{
    // 转换鼠标坐标到世界空间
    Vector2 mouseWorldPos = mainCam.ScreenToWorldPoint(Input.mousePosition);
    mouseWorldPos.z = 0;

    // 计算瞄准方向与角度
    Vector2 aimDir = mouseWorldPos - (Vector2)forearm.position;
    float aimAngle = Mathf.Atan2(aimDir.y, aimDir.x) * Mathf.Rad2Deg;

    // 适配角色翻转时的手臂朝向
    if (transform.localScale.x < 0)
    {
        forearm.localScale = new Vector3(-Mathf.Abs(forearm.localScale.x), forearm.localScale.y, forearm.localScale.z);
        aimAngle = 180 - aimAngle;
    }
    else
    {
        forearm.localScale = new Vector3(Mathf.Abs(forearm.localScale.x), forearm.localScale.y, forearm.localScale.z);
    }

    // 用物理方式旋转手臂
    forearmRb.MoveRotation(aimAngle);
}
子弹朝瞄准方向发射
  • 借助你已创建的发射点空对象(firePoint),它的旋转和手臂同步,直接取其右方向作为发射方向即可。
  • 实例化子弹后,给子弹的Rigidbody2D设置速度或施加冲量,保证子弹沿瞄准方向飞行:
public GameObject projectilePrefab;
public Transform firePoint;
public float bulletSpeed = 25f;

void FireBullet()
{
    GameObject bullet = Instantiate(projectilePrefab, firePoint.position, firePoint.rotation);
    Rigidbody2D bulletRb = bullet.GetComponent<Rigidbody2D>();

    if (bulletRb != null)
    {
        // 发射方向与手臂瞄准方向一致
        bulletRb.velocity = firePoint.right * bulletSpeed;
    }
}

// 绑定鼠标左键触发发射
void Update()
{
    if (Input.GetMouseButtonDown(0))
    {
        FireBullet();
        ApplyRecoil(); // 同步触发后坐力
    }
}
武器后坐力击飞效果
  • 给角色的主刚体(比如ragdoll的根骨骼刚体)施加反向冲量力,模拟后坐力的击飞效果,用ForceMode2D.Impulse模式适配瞬间爆发的力:
public Rigidbody2D characterRootRb;
public float recoilForce = 6f;

void ApplyRecoil()
{
    if (characterRootRb != null)
    {
        // 后坐力为发射方向的反方向
        Vector2 recoilDir = -firePoint.right;
        characterRootRb.AddForce(recoilDir * recoilForce, ForceMode2D.Impulse);
    }
}

额外注意

  • 给前臂的Rigidbody2D设置合适的约束(比如锁定z轴旋转),避免出现3D方向的偏移。
  • 调整ragdoll手臂的碰撞层,防止和角色自身其他部位发生不必要的碰撞。
  • 可根据武器类型修改recoilForce和bulletSpeed参数,优化操作手感。

内容的提问来源于stack exchange,提问作者1neWrld

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 15:47:47