This question already has an answer here:
Use coroutine inside a non MonoBehaviour class
(1个答案)
2年前关闭。
编辑:解决此问题的答案的确是该重复的帖子的答案。如果您遇到与标题相同的问题,请参阅另一篇文章。
我制作了一个简单的装备,可以随着时间的推移移动东西,如下所示:
但是,要使其按我的意愿工作,我必须实例化它们,因此它们不能成为
还是如果不可能,如何实例化
我现在可以想到一种解决方法。您照常编写
如果启动另一个协程,则已启动的协程将停止,并且
新的叫做
如果您想在
切记:您至少需要一个
我将称呼您想要实现的目标:一个
但是由于
如果您是我,我会将
(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