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
相关产品推荐
相关产品推荐

