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

Unity中3D拖拽射击(类愤怒的小鸟)机制:球无法升空问题

问题解决:3D高尔夫拖拽发射无法升空的修复

核心错误分析

  1. 鼠标轴映射完全错误:Input.mousePosition的结构是(x:屏幕水平坐标, y:屏幕垂直坐标, z:始终为0),但你代码里把屏幕Y轴的值赋值给了3D向量的Z分量,把屏幕Z(固定0)赋值给了3D向量的Y分量——这直接导致原本应该控制升空的屏幕垂直拖拽,变成了控制前后方向的力,自然没法让球升空。
  2. 屏幕坐标未转世界空间逻辑:直接用屏幕坐标差作为3D力向量,没有对应到游戏世界的坐标系(比如世界Y轴是升空方向)。
  3. 冗余无效代码:Shoot方法里的forceVector变量完全未被使用,还做了无意义的*=-1操作,混淆逻辑。

修正后的完整代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

[RequireComponent(typeof(Rigidbody))]
[RequireComponent(typeof(Collider))]
public class DragNShoot : MonoBehaviour
{
    private bool isShot;
    private Vector3 mouseDownPos;
    private Rigidbody rigbod;
    [SerializeField] private float forceMultiplier = 5f;
    [SerializeField] private float verticalForceScale = 1.2f; // 可选:调整升空力的缩放比例

    void Start()
    {
        rigbod = GetComponent<Rigidbody>();
    }

    void Update()
    {
        if (isShot && rigbod.velocity.magnitude < 0.1f)
        {
            isShot = false;
        }
    }

    private void OnMouseDown()
    {
        // 记录屏幕坐标,只需要x和y(屏幕水平/垂直)
        mouseDownPos = new Vector3(Input.mousePosition.x, Input.mousePosition.y, 0);
    }

    private void OnMouseUp()
    {
        Vector3 mouseUpPos = new Vector3(Input.mousePosition.x, Input.mousePosition.y, 0);
        // 计算屏幕拖拽的偏移量
        Vector3 dragOffset = mouseUpPos - mouseDownPos;
        // 转换为世界空间的力向量:屏幕垂直拖拽对应世界Y轴(升空),水平拖拽对应世界X轴,可根据视角调整
        Vector3 worldForce = new Vector3(dragOffset.x, dragOffset.y * verticalForceScale, dragOffset.x);
        Shoot(worldForce);
    }

    void Shoot(Vector3 force)
    {
        if (isShot) return;

        // 反方向施加冲量(符合瞬间击球的物理效果)
        rigbod.AddForce(-force * forceMultiplier, ForceMode.Impulse);
        isShot = true;
    }
}

关键修改说明

  • 修正鼠标轴映射:直接使用Input.mousePosition的x和y分量,对应屏幕水平/垂直拖拽,不再混淆z和y轴。
  • 屏幕坐标转世界力向量:将屏幕垂直拖拽(y轴)直接映射到世界空间的Y轴(升空方向),添加verticalForceScale参数可单独调整升空力大小,适配高尔夫击球手感。
  • 移除冗余代码:删掉无用的forceVector变量和无效的*=-1操作,逻辑更清晰。
  • 优化物理效果:使用ForceMode.Impulse施加力,更符合瞬间击球的物理逻辑。
  • 命名规范优化:变量名改为符合C#规范的形式,便于后续维护。

额外优化建议

  • 如果是斜视角游戏,可以用Camera.main.ScreenToWorldPoint计算拖拽的世界空间方向,让拖拽更贴合玩家视角感知。
  • 可添加拖拽最大距离限制,防止击球力过大导致球飞出场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 21:05:03