This question already has an answer here:
Use coroutine inside a non MonoBehaviour class
                                
                                    (1个答案)
                                
                        
                                2年前关闭。
            
                    
编辑:解决此问题的答案的确是该重复的帖子的答案。如果您遇到与标题相同的问题,请参阅另一篇文章。

我制作了一个简单的装备,可以随着时间的推移移动东西,如下所示:

 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();
     }
 }


但是,要使其按我的意愿工作,我必须实例化它们,因此它们不能成为MonoBehaviour。注意我对_lead变量所做的操作。我做到了,这样我就可以像其他任何人一样开始coroutines了。如果我的课程不是MonoBehaviour,如何从该课程开始coroutine

还是如果不可能,如何实例化MonoBehaviour类?我注意到了_use AddComponent,但是这些类不是组件。它们由另一个组件使用,不会放在检查器的GameObject上。

最佳答案

Coroutines必须绑定到MonoBehaviour。换句话说,您至少需要一个MonoBehaviour来启动coroutine。遗憾的是,您无法实例化MonoBehaviour

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


我现在可以想到一种解决方法。您照常编写coroutine,然后从另一个继承自MonoBehaviour的类中启动。也就是说,一个函数只需要返回IEnumerator即可作为Coroutine启动。


  如果启动另一个协程,则已启动的协程将停止,并且
  新的叫做


如果您想在non-MonoBehaviour类中执行此操作,恐怕将无法实现。


  切记:您至少需要一个MonoBehaviour来启动coroutine


我将称呼您想要实现的目标:一个Coroutine Management功能,我的理解是您希望将该功能包含在non-MonoBehaviour类中。但是由于上面的Remember引用,您现在无法执行此操作。

但是由于.dll可以包含许多类,因此可能在其内部包含.dll。您可以使用Access Modifiers来执行规则(internal修饰符是我的最爱)。

如果您是我,我会将Coroutine Management视为一个单独的问题,并将构建一个.dll来分别处理它们,以免与我的游戏业务混为一谈。

10-06 07:54