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

Unity 2D火球投射脚本异常:仅生成火球但无法移动

问题分析与修复方案

核心问题

  1. 方向向量错误:2D场景中transform.forward指向Z轴(垂直于游戏平面),给2D刚体施加这个方向的力,火球自然不会在X/Y平面移动。
  2. 未正确计算瞄准方向:没有基于鼠标位置计算火球的飞行方向,不符合《以撒的结合》类游戏的瞄准逻辑。
  3. 冗余状态管理:shootEvent的状态切换容易导致逻辑混乱,没必要拆分setAim和shoot两个方法。

修复后的代码

using UnityEngine;

public class PlayerFire : MonoBehaviour
{
    public GameObject fireball; 
    public int projectileSpeed = 20;
    public Transform fireTrans;

    void Start()
    {
        Cursor.visible = true;
    }

    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            ShootFireball();
        }
    }

    private void ShootFireball()
    {
        // 将鼠标屏幕坐标转换为世界坐标,强制Z轴为0(适配2D相机)
        Vector2 mouseWorldPos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
        mouseWorldPos.z = 0;

        // 计算从发射点到鼠标位置的方向向量并归一化
        Vector2 shootDirection = (mouseWorldPos - (Vector2)fireTrans.position).normalized;

        // 实例化火球
        GameObject newFireball = Instantiate(fireball, fireTrans.position, Quaternion.identity);
        Rigidbody2D rb = newFireball.GetComponent<Rigidbody2D>();

        // 给刚体添加方向力
        if (rb != null)
        {
            rb.AddForce(shootDirection * projectileSpeed, ForceMode2D.Impulse);
        }
    }
}

关键修改说明

  • 修正方向计算:通过(mouseWorldPos - (Vector2)fireTrans.position)计算发射点到鼠标的方向,归一化后保证方向正确且速度一致。
  • 简化逻辑:将实例化和加力合并到一个方法中,去掉冗余的状态变量,避免逻辑错误。
  • 适配2D坐标:强制鼠标世界坐标的Z轴为0,防止因相机Z轴偏移导致的方向计算错误。
  • 空值判断:添加if (rb != null)避免因火球Prefab未挂载Rigidbody2D导致的空引用报错。

额外检查项

  • 确认火球Prefab已挂载Rigidbody2D组件,且Gravity Scale设为0(否则火球会受重力下落)。
  • 确保发射点fireTrans的位置正确,在法杖的前端位置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 20:22:45