#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. Например, вы можете изменить список «дроны» на «Стационарные дроны» и удалить дрона, как вы сделали в сопрограмме после его активации. Но также добавьте еще один список «Все троны» и обновите скорость перемещения дронов из этого списка в Обновлении().