Как я могу изменить скорость перемещения объектов во время выполнения?

#c# #unity3d

Вопрос:

Сценарий менеджера

 using System.Collections; using System.Collections.Generic; using System.Linq; using UnityEngine;  public class DronesManager : MonoBehaviour {  public GameObject target;  public float movementSpeed;  public float launchTime;   public Transform dronesUnchild;   private Listlt;GameObjectgt; drones = new Listlt;GameObjectgt;();  private float currentDroneSpeed;   private void Awake()  {  currentDroneSpeed = movementSpeed;  }   // Start is called before the first frame update  void Start()  {  target = GameObject.Find("Base");   drones = GameObject.FindGameObjectsWithTag("Drone").ToList();   StartCoroutine(MoveDrone());  }   // Update is called once per frame  void Update()  {  if(currentDroneSpeed != movementSpeed)  {  for(int i = 0; i lt; drones.Count; i  )  {  var droneControl = drones[i].GetComponentlt;DroneControlgt;();   droneControl.movingSpeed = movementSpeed;  }   currentDroneSpeed = movementSpeed;  }  }   private IEnumerator MoveDrone()  {  // same as you did:  drones = GameObject.FindGameObjectsWithTag("Drone").ToList();   foreach(var drone in drones)  {  drone.GetComponentlt;DroneControlgt;().target = target.transform;  }   while (drones.Count gt; 0)  {  // pick one at random, get it  int index = Random.Range(0, drones.Count);  var drone = drones[index];   // remove it from list  drones.RemoveAt(index);   // TODO: might want to check/guard if drone == null ... this guards against it  // being Destroy()ed and yet still lying around in our list marked as "dead"   // simplified your get-component-and-go-if-not-already-going code here  var droneControl = drone.GetComponentlt;DroneControlgt;();  if (droneControl.go == false)  {  droneControl.movingSpeed = movementSpeed;  droneControl.go = true;  drone.transform.parent = dronesUnchild;  }   // wait  yield return new WaitForSeconds(launchTime);  }  } }  

Я попытался добавить эту часть в обновление

 void Update()  {  if(currentDroneSpeed != movementSpeed)  {  for(int i = 0; i lt; drones.Count; i  )  {  var droneControl = drones[i].GetComponentlt;DroneControlgt;();   droneControl.movingSpeed = movementSpeed;  }   currentDroneSpeed = movementSpeed;  }  }  

и этот скрипт прикреплен к каждому движущемуся объекту

 using System.Collections; using System.Collections.Generic; using UnityEngine;  public class DroneControl : MonoBehaviour {  public Transform target;  public float turnSpeed = .01f;   Quaternion rotGoal;  Vector3 direction;  public float movingSpeed;  public bool go = false;   private bool waitBeforeRotate = false;  private bool startRotating = false;   #region AddedCode  public float targetRange = 1.0f;   private bool IsTargetReached(Vector3 dronePos, Vector3 targetPos)  {  var distance = Vector3.Distance(dronePos, targetPos);  return distance lt; targetRange;  }  #endregion AddedCode   // Update is called once per frame  void Update()  {  // next line is modified to incorporate the range check  if (go amp;amp; !IsTargetReached(transform.position, target.position))  {  transform.position  = transform.forward * movingSpeed * Time.deltaTime;   if (waitBeforeRotate == false)  {  StartCoroutine(StartRotating());   waitBeforeRotate = true;  }   if (startRotating)  {  direction = (target.position - transform.position).normalized;  rotGoal = Quaternion.LookRotation(direction);  transform.rotation = Quaternion.Slerp(transform.rotation, rotGoal, turnSpeed);  }  }  }   IEnumerator StartRotating()  {  yield return new WaitForSeconds(3f);   startRotating = true;  } }  

но это никогда не изменит скорость движущихся объектов.

если скорость каждого движущегося объекта в начале редактора, например, равна 5, а в сценарии диспетчера я изменяю скорость на 100, скорость каждого объекта по-прежнему равна 5.

Ответ №1:

Может быть, это происходит потому, что после выбора случайного дрона в IEnumerator вы мгновенно удаляете его из списка?

Поэтому в Update() вы устанавливаете скорость для всех дронов, кроме тех, которые уже движутся.

Комментарии:

1. Я отметил, чтобы не использовать строку, которая удаляет их из списка. //дроны. RemoveAt(индекс); так что теперь изменение скорости работает, мне просто интересно, почему я удалил его из списка в первую очередь ? в чем была логика ? Я имею в виду, нормально ли держать их в списке ?

2. Я предполагаю, что первоначальное намерение состояло в том, чтобы выбрать один беспилотный летательный аппарат со сцены и «активировать» его, затем после задержки (время запуска) «активировать» другой беспилотный летательный аппарат и так далее, и так далее, пока все беспилотные летательные аппараты из списка не будут «активированы».

3. Например, вы можете изменить список «дроны» на «Стационарные дроны» и удалить дрона, как вы сделали в сопрограмме после его активации. Но также добавьте еще один список «Все троны» и обновите скорость перемещения дронов из этого списка в Обновлении().