Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 当类不是单行为时启动协同程序_C#_Unity3d_Instantiation_Coroutine - Fatal编程技术网

C# 当类不是单行为时启动协同程序

C# 当类不是单行为时启动协同程序,c#,unity3d,instantiation,coroutine,C#,Unity3d,Instantiation,Coroutine,编辑:解决这个问题的答案确实在这篇重复文章的答案中。如果你有与标题中相同的问题,请参阅其他帖子 我制作了一个简单的钻机,可以随时间移动物体,如下所示: Transform from; Transform to; float overTime; IUIAnimationEvent chain; public delegate void UIchain(); public event UIchain NEXT_FUNCTION; public MoveAction(Transform

编辑:解决这个问题的答案确实在这篇重复文章的答案中。如果你有与标题中相同的问题,请参阅其他帖子

我制作了一个简单的钻机,可以随时间移动物体,如下所示:

 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();
     }
 }
GameObject baseObject = new GameObject();
baseObject.AddComponent<MyClass>();
转换自;
转化为;
浮动加班;
Iuianimation事件链;
公共委托无效UIchain();
公共事件UIU链下一个功能;
public MoveAction(转换自、转换至、浮动超时、Iuianimation事件链)
{
this.from=from;
这个;
这个。加班=加班;
这个链子=链子;
}
公开作废动议()
{
单一行为_lead=新的单一行为();
if(moveRoutine!=null)
{
_领导、停止合作计划(moveRoutine);
}
moveRoutine=_移动(从、到、加班);
_领导.启动例行程序(移动例行程序);
}
IEnumerator_移动(从变换、变换到、浮动超时)
{
矢量2原始=起始位置;
浮动定时器=0.0f;
同时(计时器<超时)
{
浮动步长=矢量2.距离(原始,到位置)*(Time.deltaTime/超时);
from.position=Vector2.向(from.position,to.position,step)移动;
timer+=Time.deltaTime;
收益返回空;
}
if(下一个函数!=null)
{
下一个函数();
}
}
然而,为了让它像我希望的那样工作,我必须实例化它们,这样它们就不能是
单一行为。注意我对
\u lead
变量所做的操作。我这样做是为了能像其他人一样开始
合作项目。如果我的类不是一个
monobhavior
,那么如何从中启动
协同程序


或者,如果不可能,如何实例化
单行为的类
?我注意到_使用
AddComponent
,但是类是而不是组件。它们由另一个组件使用,不会从inspector放在
游戏对象上。

您不能从非
单一行为的类启动协同路由,因为方法
start例程()
是该类的一部分。 只需创建一个新的
游戏对象
,然后将您的类添加为
组件

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

 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();
     }
 }
GameObject baseObject = new GameObject();
baseObject.AddComponent<MyClass>();
GameObject baseObject=new GameObject();
baseObject.AddComponent();

参见示例

协同程序
必须绑定到
单一行为
。或者换句话说,您至少需要一个
monobhavior
来启动
协同程序。遗憾的是,您无法实例化一个
单一行为

var mono = new MonoBehaviour(); // will not work
我现在可以想到一个解决办法。像往常一样编写
coroutine
,然后从继承自
monobhavior
的另一个类开始编写。也就是说,函数只需返回
IEnumerator
,即可作为
Coroutine
启动

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

如果你想在一个
非单一行为
类中做这件事,恐怕是不可能的

记住:您需要至少一个
monobhavior
来启动
协同程序

我将称之为您想要实现的:一个
Coroutine管理
特性,我的理解是您希望在
非单一行为
类中包含该特性。但是多亏了我上面的
记住
这句话,你现在不能这么做

但是将它包含在
.dll
中可能是可行的,因为
.dll
可以包含许多类。您可以使用来强制执行规则(我最喜欢
内部
修饰符)


如果我是你,我会将
协同程序管理
视为一个单独的问题,并会构建一个
.dll
来分别处理它们,这样就不会打乱我的游戏业务。

你可以。我一直在努力解释这一点。您不得从
monobhavior
驾驶您的票据。您需要从任何游戏对象获得它的引用。@agiro所以cù-Đức-hiế美国的解决方案应该有效fine@agiro我的回答是卢多维奇,不是你。对卢多维奇来说,是的,你可以。您需要传入场景中任何单一行为的引用。然后可以使用该引用启动和停止协同路由。如果你仍然没有得到答案,请看一看重复的答案。哈哈,不是每一篇文章。一些团结问题。快乐编码@所以我们将再次见面:)快乐编码;)谢谢你的意见。一般来说,这是可行的,但我明确地为协同程序实现了
void Move()
,这样一次只有一个
Move()
可以影响一个UI组件。如果启动了另一个,则停止已启动的协同程序,并调用一个新的。@agiro“如果启动了另一个,则停止已启动的协同程序,并调用一个新的协同程序,请将此作为新问题提问。@程序员我已经补充说,现在只有一个可以影响一个对象,正如我所希望的,这不是问题,因为它,我不能从另一门课开始。@agiro好的。知道了。很高兴你的问题解决了。我已经更新了我的答案。希望它能对你的问题有所帮助。