¡¡£±¡¥IEnumerator ·¿¤ÎÊÑ¿ô¤òºîÀ®¤·¤Æ¥³¥ë¡¼¥Á¥ó¤È¤·¤Æ¼Â¹Ô¤¹¤ë¡£ ¡¡£²¡¥yield retrun ¤Ç¼Â¹Ô¤·¤Æ¤¤¤ë¥³¥ë¡¼¥Á¥ó½èÍý¤Ç¤Ê¤±¤ì¤Ð¼èÆÀ¤Ç¤¤Ê¤¤¡£ ¡¡£³¡¥¥³¥ë¡¼¥Á¥ó¥á¥½¥Ã¥ÉÆâÉô¤Ç yield return ¤Î½èÍý¤ò½ñ¤¡¢Ìá¤êÃͤÎÃͤòÍÑ°Õ¤¹¤ë
¡¡£±¡¥IEnumerator·¿¤ÎÊÑ¿ô¤òÀë¸À¤·¡¢yield return ÉÕ¤¤Î StartCoroutine ¤Î°ú¿ô¤È¤·¤Æ¼Â¹Ô¤·¤Þ¤¹¡£ ¡¡£²¡¥¥³¥ë¡¼¥Á¥ó¥á¥½¥Ã¥ÉÆâ¤Çyield return¤ò»È¤Ã¤ÆÃͤòÊÖ¤·¤Þ¤¹¡£ ¡¡£³¡¥¥³¥ë¡¼¥Á¥ó¤¬´°Î»¤·¤¿¸å¡¢¤½¤Î IEnumerator·¿¤ÎÊÑ¿ô¤«¤éÃͤò¼èÆÀ¤·¤Þ¤¹¡£
private IEnumerator Start() { ¡¡¡¡// IEnumerator ·¿¤Î coroutine ÊÑ¿ô¤òÀë¸À¤·¡¢¼Â¹Ô¤·¤¿¤¤¥³¥ë¡¼¥Á¥ó¥á¥½¥Ã¥É¤òÂåÆþ¤¹¤ë ¡¡¡¡IEnumerator coroutine = MyCoroutine(); ¡¡¡¡// Start ¥á¥½¥Ã¥É¤ò¥³¥ë¡¼¥Á¥ó¥á¥½¥Ã¥É¤ËÊѹ¹¤·¤Æ¤¤¤ë¤Î¤Ç¡¢¡¡¦¢¤Î¤É¤Á¤é¤ÎÊýË¡¤Ç¤â¼Â¹Ô²Äǽ ¡¡¡¡// ¥³¥ë¡¼¥Á¥ó¥á¥½¥Ã¥É¤ò¼Â¹Ô¡ yield return StartCoroutine(coroutine); ¡¡¡¡// ¥³¥ë¡¼¥Á¥ó¥á¥½¥Ã¥É¤ò¼Â¹Ô¢ yield return coroutine; ¡¡¡¡// ¥³¥ë¡¼¥Á¥ó¥á¥½¥Ã¥ÉÆ⤫¤éÌá¤êÃͤò Current ¤È¤·¤Æ¼èÆÀ¤¹¤ë ¡¡¡¡int result = (int)coroutine.Current; Debug.Log("¥³¥ë¡¼¥Á¥ó¤«¤é¤ÎÌá¤êÃÍ: " + result); } private IEnumerator MyCoroutine() { yield return new WaitForSeconds(2f); // 2ÉÃÂÔ¤Ä yield return 42; // 42¤òÊÖ¤¹ }
private IEnumerator Start() { ¡¡¡¡// IEnumerator ·¿¤Î coroutine ÊÑ¿ô¤òÀë¸À¤·¡¢¼Â¹Ô¤·¤¿¤¤¥³¥ë¡¼¥Á¥ó¥á¥½¥Ã¥É¤òÂåÆþ¤¹¤ë ¡¡¡¡IEnumerator coroutine = MyCoroutine(); ¡¡¡¡// ¥³¥ë¡¼¥Á¥ó¥á¥½¥Ã¥É¤ò¼Â¹Ô StartCoroutine(coroutine); ¡¡¡¡int result = (int)coroutine.Current; Debug.Log("¥³¥ë¡¼¥Á¥ó¤«¤é¤ÎÌá¤êÃÍ: " + result); }
¥Ï¥ë¥·¥ª¥ó¥·¥¹¥Æ¥à ÍÍ
¡Ú¥Ï¥ë¥·¥ª¥ó¥Ö¥í¥°¡ÛUnity¤Î¥³¥ë¡¼¥Á¥ó¤ÇÃͤòÊÖ¤¹ÊýË¡¡£¤¤¤¯¤Ä¤«ÊýË¡¤¢¤ë¤Ý¤¤¤±¤É¡¢¤½¤Î°ì¤Ä¤ò¾Ò²ð¡£
using System; using System.Collections; using UnityEngine; public class CoroutineReturnValue : MonoBehaviour { private IEnumerator Start() { int value = 0; yield return StartCoroutine(MyCoroutine(x => value = x)); Debug.Log("¥³¥ë¡¼¥Á¥ó¤«¤é¤ÎÌá¤êÃͤηë²Ì: " + value); } private IEnumerator MyCoroutine(Action<int> callback) { yield return new WaitForSeconds(2f); // 2ÉÃÂÔ¤Ä int result = 42; // 42¤òÊÖ¤¹ callback(result); // Ìá¤êÃͤò¥³¡¼¥ë¥Ð¥Ã¥¯¤Ç³°Éô¤ËÄÌÃÎ } }
private IEnumerator MyCoroutine(Action<int> callback) { yield return new WaitForSeconds(2f); // 2ÉÃÂÔ¤Ä int result = 42; // 42¤òÊÖ¤¹ if (callback != null) { callback(result); // Ìá¤êÃͤò¥³¡¼¥ë¥Ð¥Ã¥¯¤Ç³°Éô¤ËÄÌÃÎ } }
private IEnumerator MyCoroutine(Action<int> callback) { yield return new WaitForSeconds(2f); // 2ÉÃÂÔ¤Ä int result = 42; // 42¤òÊÖ¤¹ callback?.Invoke(result);// Ìá¤êÃͤò¥³¡¼¥ë¥Ð¥Ã¥¯¤Ç³°Éô¤ËÄÌÃÎ }
¿¹¤Á¤ã¤ó¤ÎUnity³«È¯Ï¿
¡ÚUnity¡ÛÈóƱ´ü½èÍý¡¢IEnumerator¤ÇÊÖ¤êÃÍ(Ìá¤êÃÍ)¤ò¼ÂÁõ¤¹¤ë
using System; using Cysharp.Threading.Tasks; using UnityEngine; public class UniTaskExample : MonoBehaviour { private async void Start() { int result = await MyUniTask(); Debug.Log("UniTask¤«¤é¤ÎÌá¤êÃÍ: " + result); } private async UniTask<int> MyUniTask() { await UniTask.Delay(TimeSpan.FromSeconds(2)); // 2ÉÃÂÔ¤Ä return 42; } }
using System; using Cysharp.Threading.Tasks; using UnityEngine; public class UniTaskMultipleValuesExample : MonoBehaviour { private async void Start() { (int, string) result = await MyUniTaskWithMultipleValues(); Debug.Log("UniTask¤«¤é¤ÎÌá¤êÃÍ: " + result.Item1 + ", " + result.Item2); } private async UniTask<(int, string)> MyUniTaskWithMultipleValues() { await UniTask.Delay(TimeSpan.FromSeconds(2)); // 2ÉÃÂÔ¤Ä return (42, "Hello, World!"); } }