Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.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_Coroutine - Fatal编程技术网

C# 如何使一个协同程序在其他协同程序开始之前先完成

C# 如何使一个协同程序在其他协同程序开始之前先完成,c#,unity3d,coroutine,C#,Unity3d,Coroutine,嗨,我是unity和c的新手 我在同一个场景中有两个脚本文件 1在versionchecker.cs文件中协同路由,以从我的web服务器获取版本号数据 public string versionURL = "http://localhost/check.php"; IEnumerator GetVersion() { WWW vs_get = new WWW(versionURL); yield return vs_get; if (vs_get.error

嗨,我是unity和c的新手

我在同一个场景中有两个脚本文件

1在versionchecker.cs文件中协同路由,以从我的web服务器获取版本号数据

public string versionURL = "http://localhost/check.php";

 IEnumerator GetVersion()
 {
     WWW vs_get = new WWW(versionURL);
     yield return vs_get;

     if (vs_get.error != null)
     {
         connection = 1;
     }
     else
     {
         currentVersion = vs_get.text;
         bundleVersion = PlayerSettings.bundleVersion;
         connection = 0;
     }
 }
但是在beginingscreen.cs的另一个文件中,我有一个用于beginingscreen的协同程序

 void Start () {
     if(!isExit)
         StartCoroutine (BeginningAnimation ());
     else
         StartCoroutine (EndAnimation ());
 }

 IEnumerator BeginningAnimation()
 {
     fade.FadeIn (1.5f);
     yield return new WaitForSeconds (2);
     fade.FadeOut (1);
     yield return new WaitForSeconds (0.9f);
     Application.LoadLevel (LevelToLoad);
 }

 IEnumerator EndAnimation()
 {
     yield return new WaitForSeconds (0.5f);
     fade.FadeOut (1);
     yield return new WaitForSeconds (1);
     Application.Quit ();
 }
这个脚本我把它放在我游戏的同一个场景中。。但是,有时开始的协同程序屏幕在获取版本的协同程序之前完成,因为获取版本需要连接到web服务器,有时web服务器滞后


那么,如何使get version coroutine先完成,然后再开始屏幕..

两种不同的方法:

只有在第一个协同程序完成执行后,才能添加组件脚本(beginingscreen.cs)。从而确保其他协同程序不会过早启动

IEnumerator GetVersion()
{
    // ...
    gameObject.AddComponent<BeginingScreen>();
}
IEnumerator GetVersion()
{
// ...
gameObject.AddComponent();
}
您可以在beginingscreen.cs中将Start方法设置为协同程序,然后调用GetVersion并等待其完成(GetVersion需要公开可见):

IEnumerator Start()
{
var getVersion=gameObject.GetComponent();
if(getVersion!=null)
{
产生返回start例程(getVersion.getVersion());
}
if(!isExit)
收益返回起始例程(BeginningAnimation());
其他的
产生返回开始例程(EndAnimation());
}

在这两种解决方案中,您都需要这两个组件(脚本)以某种方式相互交互。或者您可以创建第三个脚本来处理此交互。

使用
yield return waitill(()=>coroutineOver)
在第二个协同路由中,其中
coroutineOver
是一个
bool
,在第一个协同路由结束后设置为true。
IEnumerator Start()
{
    var getVersion = gameObject.GetComponent<VersionChecker>();
    if (getVersion != null)
    {
        yield return StartCoroutine(getVersion.GetVersion());
    }

    if(!isExit)
        yield return StartCoroutine (BeginningAnimation());
    else
        yield return StartCoroutine (EndAnimation());
}