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

