0

シーンで数回呼び出されるコルーチンがあります。

IEnumerator Save_assets(string file, int i, string name){

    var filename = Path.GetFileName(file);
    docPath = Application.streamingAssetsPath+"/files/";
    var temp_name = docPath+filename;

    downloaded_asset = false;

    if(!Directory.Exists(docPath)){
        Directory.CreateDirectory(docPath);
    }

    if (!System.IO.File.Exists(temp_name)){
        WWW  www = new WWW(file);
        yield return www;
        //Save the image
        System.IO.File.WriteAllBytes(temp_name, www.bytes);
    }

    /*  I really would like to have a sort of listener here doing something like:
        //pseudocode
        while(global.file != true){ //while not done
            yield return null;
        }

    */
    downloaded_asset = true;
    finished = false;
    tries = 0;

    go = GameObject.Find(name);
    go.gameObject.BroadcastMessage("paint_file", temp_name);

}

paint_file が呼び出されると、まさにそのクラスの Update 関数が常に発生する特定の条件を探します。たとえば、「done = true;」としましょう。

void paint_file(file){
    [...]//code
}

void Update () {
   var done = true;//let's pretend there's no code here, just  done = true
   if(done){
        Debug.Log("Finished: "+paint_file._filename);
    }
}

この var global.file = done を設定する方法がわかりません。どんな助けでも大歓迎です

4

1 に答える 1

1

グローバル (静的またはシングルトン) を使用しないでください。代わりに直接コールバックを使用するか、コンポーネント/オブジェクト参照を使用して接続します。

また、Find、および BroadcastMessage は遅いため、理想的には避けてください :-)

代わりに:

var SomeComponentType myReferenceToThatComponent;

on Awake(){
    if(myReferenceToThatComponent==null){
        myReferenceToThatComponent = GetComponent<SomeComponentType>();
    }
}

コンポーネントへの参照を取得したら、そのコンポーネントのパブリック アイテムにアクセスできます。

myReferenceToThatComponent.done = true;
myReferenceToThatComponent.SomeMethod( true );

利点は、エディターでその参照を設定できることですが、null のまま設定しない場合は、それを見つけようとし、一度しか見つけられないため、それ以上の使用ではキャッシュされた結果が使用されるため、そうする必要はありません。高価な検索を再度使用します。

www は、完了時にガベージ コレクションが行われるようにするための一般的な慣行であるため、「using」で囲む必要があります。

using ( WWW www = new WWW( url, form ) ) {
    yield return www;

}

コンポーネントとオブジェクトを見つけて取得するための無数のアプローチは、この回答の範囲を超えていると思います

Unity はコンポーネント ベースであることが望ましいことを覚えておいてください。これは、C# コーディングの典型的な OOP 継承/インターフェイス スタイルとはまったく異なります。

-

1 つのコルーチンが完了するのを待って次々と実行されるようにコルーチンを構成する方法:

void Start() {
    StartCoroutine( BaseRoutine() );
}

IEnumerator BaseRoutine() {
    for ( int i = 0; i < 10; i++ ) {
        yield return StartCoroutine( ChildRoutine( i ) );
    }       
}

IEnumerator ChildRoutine( int i ) {
    Debug.Log( "ChildRoutine number: " + i );
    yield return new WaitForSeconds( 1 ); // Put your yield return WWW here for example
}
于 2013-08-20T14:47:11.847 に答える