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

Unity运行时修改移动物体速度不生效如何解决?

问题根源分析

核心问题是DronesManager中用来更新速度的无人机列表被清空了:
你写的MoveDrone()协程第一行就重新对全局drones字段赋值,后续while循环中每次发射一个无人机就执行drones.RemoveAt(index),所有无人机发射完成后drones列表为空,Update里的速度更新逻辑遍历空列表,自然不会生效。
其次还有浮点数直接判等的精度问题,也可能导致速度更新逻辑不触发。

修复方案

1. 拆分列表避免全局列表被清空

不要共用同一个列表存储所有无人机和待发射无人机,修改DronesManager的字段定义:

private List<GameObject> allDrones = new List<GameObject>(); // 存储所有无人机,专门用来更新速度
private List<GameObject> pendingLaunchDrones = new List<GameObject>(); // 存储待发射的无人机,供协程操作

2. 修改初始化逻辑

void Start()
{
    target = GameObject.Find("Base");
    // 所有无人机存入全局全量列表
    allDrones = GameObject.FindGameObjectsWithTag("Drone").ToList();
    // 复制一份到待发射列表,供协程删除操作
    pendingLaunchDrones = new List<GameObject>(allDrones);
    StartCoroutine(MoveDrone());
}

3. 修改协程逻辑,仅操作待发射列表

private IEnumerator MoveDrone()
{
    foreach(var drone in allDrones)
    {
        drone.GetComponent<DroneControl>().target = target.transform;
    }

    while (pendingLaunchDrones.Count > 0)
    {
        int index = Random.Range(0, pendingLaunchDrones.Count);
        var drone = pendingLaunchDrones[index];
        pendingLaunchDrones.RemoveAt(index);

        // 加空判断避免销毁的无人机报错
        if (drone == null) continue;

        var droneControl = drone.GetComponent<DroneControl>();
        if (!droneControl.go)
        {
            droneControl.movingSpeed = movementSpeed;
            droneControl.go = true;
            drone.transform.parent = dronesUnchild;
        }
        yield return new WaitForSeconds(launchTime);
    }
}

4. 优化Update速度更新逻辑

浮点数不要直接判等,避免精度问题导致判断失效,同时遍历全量无人机列表:

void Update()
{
    // 增加误差范围,适配浮点数精度特性
    if(Mathf.Abs(currentDroneSpeed - movementSpeed) > 0.001f)
    {
        foreach(var drone in allDrones)
        {
            if (drone == null) continue;
            var droneControl = drone.GetComponent<DroneControl>();
            droneControl.movingSpeed = movementSpeed;
        }
        currentDroneSpeed = movementSpeed;
    }
}
额外验证建议

如果修改后还是不生效,可以在速度更新逻辑里加Debug.Log("当前更新速度为:" + movementSpeed),运行时修改管理器的movementSpeed参数,看控制台是否有日志输出,就能快速判断是逻辑没走到还是Drone端的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 13:06:04