编辑:解决这个问题的答案确实在帖子的答案中,副本就是这个。如果您遇到与标题中相同的问题,请参阅其他帖子。
我做了一个简单的装备,随着时间的推移移动东西:
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
上。
答案 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