質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

2183閲覧

unityのAddressablesのコルーチンの使い方

key_FoolyCooly

総合スコア19

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2021/07/03 19:18

前提・実現したいこと

私はunityのAddressablesについて勉強しています。
公式マニュアルを読んでいて不明点があったため、質問したいです。

公式マニュアルには下記のコードサンプルがあります。

C#

1IEnumerator LoadGameObjectAndMaterial() 2{ 3 //Load a GameObject 4 AsyncOperationHandle<GameObject> goHandle = Addressables.LoadAssetAsync<GameObject>("gameObjectKey"); 5 yield return goHandle; 6 if(goHandle.Status == AsyncOperationStatus.Succeeded) 7 { 8 GameObject obj = goHandle.Result; 9 //etc... 10 } 11 12 //Load a Material 13 AsyncOperationHandle<IList<IResourceLocation>> locationHandle = Addressables.LoadResourceLocationsAsync("materialKey"); 14 yield return locationHandle; 15 AsyncOperationHandle<Material> matHandle = Addressables.LoadAssetAsync<Material>(locationHandle.Result[0]); 16 yield return matHandle; 17 if (matHandle.Status == AsyncOperationStatus.Succeeded) 18 { 19 Material mat = matHandle.Result; 20 //etc... 21 } 22 23 //Use this only when the objects are no longer needed 24 Addressables.Release(goHandle); 25 Addressables.Release(matHandle); 26}

これをより具体的な形で使うと、下記のようになるようです。
下記はこのページのコードの引用しです。

void Start() { StartCoroutine(Load()); } IEnumerator Load() { //アセットのロード var handle = Addressables.LoadAssetAsync<GameObject>("TitleImage"); yield return handle; //成功したらインスタンスを配置 if (handle.Status == AsyncOperationStatus.Succeeded) { var instance = Instantiate(handle.Result); } }

ここまでのサンプルを読んで質問です。

<>
これらのサンプルで行っている

C#

1yield return goHandle;

C#

1yield return handle;

が何を意味するのか知りたいです。

というのも、コルーチンの返り値といえば、私は大まかに下記の三つがあると思っています。

C#

1public class Test : MonoBehaviour { 2 void Start () { 3 // コルーチンを実行 4 StartCoroutine ("Sample"); 5 } 6 7 // コルーチン 8 private IEnumerator Sample() { 9 // X秒待つ 10 yield return new WaitForSeconds (Xf); 11 // コルーチンを終了する 12 yield break; 13 // いったん処理を抜ける(ここでの返り値は上記以外なら結果は同じ。「1」でも「あ」でも) 14 yield return null; 15 } 16} 17

公式マニュアルのコードサンプルでは、三つのいずれでもない返り値を持っているため、
何を行っているんだとなっている次第です。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

というのも、コルーチンの返り値といえば、私は大まかに下記の三つがあると思っています。

別にその三つだけではありません。

コルーチンの戻り値としてIEnumerator型のインスタンスを返すと、そちらに処理を譲渡し、そちらの処理が完了すると、自分の処理を再開します。
これを応用すれば、コルーチンの中から別のコルーチンを呼び出すこともできます。

csharp

1 IEnumerator Func1() 2 { 3 Debug.Log("Func1:1"); 4 yield return Func2(); 5 Debug.Log("Func1:2"); 6 yield return null; 7 } 8 9 IEnumerator Func2() 10 { 11 Debug.Log("Func2:1"); 12 yield return null; 13 Debug.Log("Func2:2"); 14 } 15 16 /* 17 Consoleには、以下のように出力される(はず。試してないけど) 18 19 Func1:1 20 Func2:1 21 Func2:2 22 Func1:2 23 */ 24

Addressables.LoadAssetAsyncの戻り値の型のAsyncOperationHandle<TObject>(の継承元であるAsyncOperationHandle)は、マニュアルによればIEnumeratorを継承していますから、yield returnの戻り値として返すことができますし、それにより、AsyncOperationHandleの中でロード処理が完了するまでコルーチンを待機させることができます。

投稿2021/07/04 03:43

katsuko

総合スコア3491

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問