Использовать сопрограмму внутри classа non MonoBehaviour

Как вы можете передать Monobehaviour внутри экземпляра classа non Monobehaviour? Я нашел эту ссылку, где TonyLi упоминает, что вы можете передать Monobehaviour для запуска и остановки сопрограмм внутри экземпляра classа, но он не показывает, как вы можете это сделать. Он делает это theEvent.StartEvent (myMonoBehaviour); но он не показывает, откуда он получает myMonobehaviour. Я огляделся по интернету, но я не могу найти, как это сделать.

  • редактировать

Вот что я пытаюсь сделать. Я хочу запустить сопрограмму внутри экземпляра classа. Я также хочу, чтобы остановить сопрограмму внутри экземпляра classа. Я хочу сделать это так, чтобы у меня не было объектов на моей сцене с большими менеджерами, а также чтобы я мог повторно использовать код для любого объекта, который я хочу использовать для pingpong таким образом. Код перемещает объект Gameobject в одном направлении, затем выполняет перерыв и перемещает его в другом направлении и снова выполняет перерыв и т. Д. Но я не могу запустить сопрограмму вне classа.

using UnityEngine; using System.Collections; using UnityEngine.UI; [RequireComponent (typeof(Image))] public class SpecialBar : MonoBehaviour { public float rangeX; public float breakTime; public float step; float startProgress = 0.5f; PingPongGameObject pingPonger; Color[] teamColors = new Color[]{new Color(255,136,0),new Color(0,170,255)}; void Start() { for(int i = 0; i < teamColors.Length; ++i) { teamColors[i] = StaticFunctions.NormalizeColor (teamColors[i]); } pingPonger = new PingPongGameObject (gameObject.transform.position, new Vector3(rangeX,0.0f,0.0f), gameObject, startProgress, breakTime, step ); } } 

Второй class – это где моя сопрограмма.

 public class PingPongGameObject { float step; Vector3 center; Vector3 range; GameObject ball; float progress; float breakTime; Vector3 endPos; Vector3 oppositePosition; public PingPongGameObject(Vector3 _center, Vector3 _range, GameObject _ball, float _startProgress, float _breakTime, float _step) { center = _center; range = _range; ball = _ball; progress = _startProgress; breakTime = _breakTime; step = _step; endPos = center - range; oppositePosition = center + range; // This is where I want to start the coroutine } public IEnumerator PingPong() { while (progress < 1) { progress += Time.deltaTime * step; Vector3 newPos = Vector3.Lerp (oppositePosition, endPos, progress); ball.transform.position = newPos; yield return null; } Vector3 temp = endPos; endPos = oppositePosition; oppositePosition = temp; progress = 0; yield return new WaitForSeconds (breakTime); yield return null; } public float Step { set{step = value;} } public void StopCoroutine() { // This is where I want to stop the coroutine } } 

TonyLi упоминает, что вы можете передать Monobehaviour для запуска и остановки сопрограмм внутри экземпляра classа, но он не показывает, как вы можете это сделать. Он делает это

Вы можете сделать это с помощью this ключевого слова. Это ключевое слово получит текущий экземпляр MonoBehaviour .

В этом примере есть дерево, которое имеет компонент MonoScript :

введите описание изображения здесь

Этот конкретный экземпляр MonoScript может, если он хочет (поскольку это программа ac #), создает экземпляр общего classа c #, NonMonoScript :

Класс для передачи MonoBehaviour :

 public class MonoScript : MonoBehaviour { void Start() { NonMonoScript nonMonoScript = new NonMonoScript(); //Pass MonoBehaviour to non MonoBehaviour class nonMonoScript.monoParser(this); } } 

Класс, который получает экземпляр MonoBehaviour :

 public class NonMonoScript { public void monoParser(MonoBehaviour mono) { //We can now use StartCoroutine from MonoBehaviour in a non MonoBehaviour script mono.StartCoroutine(testFunction()); //And also use StopCoroutine function mono.StopCoroutine(testFunction()); } IEnumerator testFunction() { yield return new WaitForSeconds(3f); Debug.Log("Test!"); } } 

Вы также можете сохранить mono ссылку из функции monoParser в локальной переменной для повторного использования.

  • Используйте функцию динамического ключевого слова / .NET 4.6 в Unity
  • Доступ к переменным / функциям из другого сценария
  • Unity3D UI, вычисление позиции перетаскивания элемента?
  • Unity игровой менеджер. Скрипт работает только один раз
  • Чтение и запись файла на streamingAssetsPath
  • Поворот GameObject с течением времени
  • Лучший способ сохранить большое количество данных локально в single3D android?
  • Не удалось указать целевые платформы. Проверьте правильность пути sdk android.
  • Затухание в / из GameObject
  • Каким образом исходный шаблон StartCoroutine / yield действительно работает в Unity?
  • Как добавить проект распознавания речи в Unity?
  • Давайте будем гением компьютера.