当班级不是MonoBehaviour时启动协同程序

时间:2017-02-07 13:07:46

标签: c# unity3d instantiation coroutine

编辑:解决这个问题的答案确实在帖子的答案中,副本就是这个。如果您遇到与标题中相同的问题,请参阅其他帖子。

我做了一个简单的装备,随着时间的推移移动东西:

 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上。

2 个答案:

答案 0 :(得分:1)

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

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

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

  

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

如果你想 一个non-MonoBehaviour课程,我担心这是不可能的。

  

请记住:您需要至少一个MonoBehaviour才能启动coroutine

我将调用您想要实现的内容:Coroutine Management功能,我的理解是您希望在non-MonoBehaviour课程中包含该功能。但是由于上面的 Remember 引用,你现在无法做到。

但是将.dll括在一起可能是可能的,因为.dll可以包含许多类。您可以使用Access Modifiers来强制执行规则(internal修饰符是我最喜欢的。)

如果我是你,我会将Coroutine Management视为一个单独的问题,并建立一个.dll来单独处理它们,这样就不会搞砸我的游戏业务。

答案 1 :(得分:0)

您无法从非MonoBehaviour的类启动协同程序,因为方法StartCoroutine()是此的一部分。 只需创建一个新的GameObject,然后将您的课程添加为Component

您可以实例化继承自MonoBehaviour的类(对于此示例MyClass),如下所示:

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

例如,请参阅singleton pattern