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

Unity中实例化的GameObject无法更新transform.position问题求助

问题诊断与解决方案

核心问题:变量作用域错误

你的子弹无法移动的根本原因是在Start()方法中重新声明了局部变量,覆盖了类的成员变量。类顶部声明的travelDirection和positionChanger从未被赋值,始终保持默认的Vector2.zero和Vector3.zero,导致Update()中的位置更新操作等同于无效(加0)。

错误代码片段:

private void Start() {
    // ... 其他代码 ...
    // 此处声明的是局部变量,而非类成员变量
    Vector2 travelDirection = new Vector2(Mathf.Cos(rotationDirection), Mathf.Sin(rotationDirection));
    // 同样是局部变量,未对类成员positionChanger赋值
    Vector3 positionChanger = new Vector3(travelDirection.x, travelDirection.y, 0f);
}

修复后的子弹脚本

去掉局部变量声明,直接赋值给类成员变量:

using UnityEngine;

public class MachineGunBulletScript : MonoBehaviour
{
    private Vector3 positionChanger;

    [SerializeField] private float moveSpeed = 10f;

    private void Start() {
        // 简化版方向计算:直接利用transform组件的方向向量,避免角度转换错误
        positionChanger = transform.up;

        // 若需保留原角度计算逻辑,修正变量赋值即可:
        /*
        float rotationDirection = transform.eulerAngles.z + 90f;
        if (rotationDirection >= 360) rotationDirection -= 360;
        rotationDirection *= Mathf.Deg2Rad; // 用Unity内置常量替代手动计算
        Vector2 travelDirection = new Vector2(Mathf.Cos(rotationDirection), Mathf.Sin(rotationDirection)).normalized;
        positionChanger = new Vector3(travelDirection.x, travelDirection.y, 0f);
        */
    }

    private void Update() {
        transform.position += moveSpeed * Time.deltaTime * positionChanger;
    }
}

额外优化建议

1. 简化方向计算逻辑

无需手动处理角度转弧度,Unity的Transform组件直接提供方向向量:

  • 如果枪管旋转后,子弹沿枪管指向移动,直接用transform.right(默认枪管指向右)或transform.up(根据你的旋转逻辑调整),避免角度计算出错。

2. 正确使用Rigidbody2D实现移动

若想用物理引擎控制子弹,按以下步骤操作:

  • 给子弹预制体添加Rigidbody2D组件,设置Gravity Scale = 0,无需碰撞响应可勾选Is Kinematic
  • 修改子弹脚本:
using UnityEngine;

public class MachineGunBulletScript : MonoBehaviour
{
    [SerializeField] private float moveSpeed = 10f;

    private void Start() {
        Rigidbody2D rb = GetComponent<Rigidbody2D>();
        rb.velocity = transform.up * moveSpeed; // 或transform.right,根据枪管方向调整
    }
}

3. 机枪脚本的小优化

当前Input.GetKey(KeyCode.Z)会在按住Z键时持续触发射击(受冷却限制),若需要点射效果,改为Input.GetKeyDown(KeyCode.Z):

if (reloaded && Input.GetKeyDown(KeyCode.Z)) {
    ShootingMachineGun();
}

冷却逻辑也可简化:

private void Update() {
    if (!reloaded) {
        timer += Time.deltaTime;
        if (timer >= floatCooldown) {
            reloaded = true;
            timer = 0f;
            Debug.Log("Reloaded");
        }
    }

    if (reloaded && Input.GetKeyDown(KeyCode.Z)) {
        ShootingMachineGun();
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 06:03:20