2017-02-07 30 views
2

EDIT: Ответ, решающий эту проблему, действительно находится в ответе сообщения, дубликат которого этот. Если у вас есть та же проблема, что и в заголовке, обратитесь к другому сообщению.Начать сопрограммы, когда класс не является MonoBehaviour

Я сделал простой буровой установки, которая перемещает материал с течением времени, как это:

Transform from; 
Transform to; 
float overTime; 
IUIAnimationEvent chain; 
public delegate void UIchain(); 
public event UIchain NEXT_FUNCTION; 
public MoveAction(Transform from, Transform to, float overTime, IUIAnimationEvent chain) 
{ 
    this.from = from; 
    this.to = to; 
    this.overTime = overTime; 
    this.chain = chain; 
} 
public void Move() 
{ 
    MonoBehaviour _lead = new MonoBehaviour(); 
    if (moveRoutine != null) 
    { 
     _lead.StopCoroutine(moveRoutine); 
    } 
    moveRoutine = _Move(from, to, overTime); 
    _lead.StartCoroutine(moveRoutine); 
} 
IEnumerator _Move(Transform from, Transform to, float overTime) 
{ 
    Vector2 original = from.position; 
    float timer = 0.0f; 
    while (timer < overTime) 
    { 
     float step = Vector2.Distance(original, to.position) * (Time.deltaTime/overTime); 
     from.position = Vector2.MoveTowards(from.position, to.position, step); 
     timer += Time.deltaTime; 
     yield return null; 
    } 
    if(NEXT_FUNCTION != null) 
    { 
     NEXT_FUNCTION(); 
    } 
} 

Однако, чтобы сделать его работу, как я хочу, я должен Instantiate них, поэтому они не могут быть MonoBehaviour , Обратите внимание, что я сделал с переменной _lead. Я сделал это, чтобы начать coroutines, как и любой другой. Если мой класс NOT a MonoBehaviour, как начать с него coroutine?

Или, если это не представляется возможным, как экземпляр классов, которые AREMonoBehaviour? Вместо этого я заметил _use AddComponent, но классы не компонентов. Они используются другим компонентом и не будут помещаться на контролера GameObject.

ответ

1

Coroutines должен быть привязан к MonoBehaviour. Или, другими словами, вам понадобится хотя бы один MonoBehaviour, чтобы начать coroutine. И, к сожалению, вы не можете создать экземпляр MonoBehaviour:

var mono = new MonoBehaviour(); // will not work 

Там обходной путь, что я могу думать прямо сейчас. Вы пишете свой coroutine, как обычно, а затем запускаете его из другого класса, который наследуется от MonoBehaviour. То есть, функция должна возвращать IEnumerator для запуска в качестве Coroutine.

Если другой запускаются, уже начали сопрограммный останавливаются и нового один называется

Если вы хотите сделать это внутри в non-MonoBehaviour классе, я боюсь, что не будет возможное.

Помните: Вам нужно будет по крайней мере один MonoBehaviour начать coroutine.

Я буду называть то, что вы хотите достичь: в Coroutine Management особенности и я понимаю, что вы хотите включить эту функцию внутри вашего non-MonoBehaviour класса. Но благодаря моей цитате выше вы не можете сделать это прямо сейчас.

Возможно включение в него .dll, поскольку .dll может содержать много классов. И вы можете использовать Access Modifiers, чтобы обеспечить соблюдение ваших правил (модификатор internal - мой любимый).

Если бы я был вами, я бы рассматривал Coroutine Management как отдельную проблему и создавал бы .dll, чтобы обрабатывать их отдельно, чтобы это не испортило мой игровой процесс.

+0

Спасибо за ввод. Как правило, это сработает, но я внедрил 'void Move()' для сопрограммы явно, так что _одно ** один ** 'Move()' может влиять на один компонент пользовательского интерфейса за раз. Если запускается другой, уже запущенная сопрограмма прекращена и вызывается новый ._ – agiro

+0

@agiro «Если запускается другой, уже запущенная сопрограмма остановлена, а новая называется« Пожалуйста, задайте это как новый вопрос. – Programmer

+0

@Programmer Я уже добавил, что теперь только один может воздействовать на один объект, как я и хотел, это был не вопрос, из-за этого я не могу начать с другого класса. – agiro

0

Вы не можете начинать сопрограммы из класса, который не является MonoBehaviour как метод StartCoroutine() является частью этого класса. Просто создайте новый GameObject, а затем добавить свой класс как Component на нем

Вы можете создать экземпляр класса, который наследует от MonoBehaviour (для этого примера MyClass), как это:

GameObject baseObject = new GameObject(); 
baseObject.AddComponent<MyClass>(); 

См singleton pattern, например

+0

Я планирую скомпилировать мои функции, такие как 'Move()' или 'RotateToGiven()' .dll-s, и иметь «скрипт» на каждом из моих «элементов пользовательского интерфейса», которые должны быть анимированы, и просто получить это от моего главного менеджера Ui, и все должно быть хорошо. Выполнимо? Я интересуюсь .dll – agiro

+1

Вы можете. Я все время пытаюсь объяснить это. Вы должны ** не ** вести свой скрипт от «MonoBehaviour». Вам нужна ссылка на него из любого GameObject. – Programmer

+1

@agiro Итак, решение cù-Đức-hiếu должно работать нормально –