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

Unity平台游戏中如何实现鼠标按键触发抛射物发射?

Unity平台游戏抛射物鼠标触发发射修复

问题根源

你的脚本在Update里持续调用Fire函数,抛射物一生成就开始移动;自己添加if语句后只执行一次Fire,导致抛射物仅更新一帧位置就停止——因为没有持续驱动位置更新直到抵达目标。另外原脚本还漏掉了将计算好的位置赋值给transform.position的核心步骤,这也是抛射物无法正常飞行的关键原因。

修改后的完整脚本

public class Projectile : MonoBehaviour
{
    public GameObject player;
    public GameObject target;

    private float playerX;
    private float targetX;
    private float dist;
    private float nextX;
    private float baseY;
    private float height;

    public float speed = 10f;
    // 控制抛射物是否处于飞行状态
    private bool isFiring = false;
    // 存储发射瞬间的目标位置,避免敌人移动干扰轨迹
    private Vector3 targetPosition;

    void Start()
    {
        player = GameObject.FindGameObjectWithTag("Player");
        target = GameObject.FindGameObjectWithTag("Enemy");
        // 初始禁用脚本,直到鼠标触发发射
        enabled = false;
    }

    void Update()
    {
        // 检测鼠标左键按下,触发发射逻辑
        if (Input.GetMouseButtonDown(0))
        {
            enabled = true;
            isFiring = true;
            // 锁定发射时的目标位置
            targetPosition = target.transform.position;
            // 将抛射物放到玩家位置作为发射起点
            transform.position = player.transform.position;
        }

        // 仅在发射状态下执行飞行逻辑
        if (isFiring)
        {
            Fire();
        }
    }

    public static Quaternion LookAtTarget(Vector2 rotation)
    {
        return Quaternion.Euler(0, 0, Mathf.Atan2(rotation.y, rotation.x) * Mathf.Rad2Deg);
    }

    private void Fire()
    {
        playerX = player.transform.position.x;
        targetX = targetPosition.x;

        dist = targetX - playerX;
        // 持续更新X轴位置,直到到达目标点
        nextX = Mathf.MoveTowards(transform.position.x, targetX, speed * Time.deltaTime);
        baseY = Mathf.Lerp(player.transform.position.y, targetPosition.y, (nextX - playerX) / dist);
        height = 2 * (nextX - playerX) * (nextX - targetX) / (-0.25f * dist * dist);

        Vector3 movePosition = new Vector3(nextX, baseY + height, transform.position.z);
        // 核心:将计算好的位置赋值给抛射物,实现移动
        transform.position = movePosition;
        transform.rotation = LookAtTarget(movePosition - transform.position);

        // 用距离判断是否到达目标,避免浮点数精度误差
        if (Vector3.Distance(transform.position, targetPosition) < 0.1f)
        {
            Destroy(gameObject);
        }
    }
}

关键修改说明

  • 新增isFiring状态变量:只有鼠标触发后才启动飞行逻辑,避免抛射物一生成就移动
  • 锁定targetPosition:发射瞬间记录目标位置,防止敌人移动导致抛射物轨迹偏移
  • 补全位置赋值:添加transform.position = movePosition,让抛射物真正按照计算轨迹移动
  • 替换位置判断逻辑:用Vector3.Distance替代直接==,解决浮点数精度问题导致的销毁逻辑失效
  • 初始禁用脚本:抛射物生成后不立即运行,直到玩家点击鼠标触发

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 19:02:38