ºÇ½ª¹¹¿·¡§ orika_ex_miyako 2023ǯ09·î12Æü(²Ð) 14:47:14ÍúÎò
¡¡£±¡¥IEnumerator ·¿¤ÎÊÑ¿ô¤òºîÀ®¤·¤Æ¥³¥ë¡¼¥Á¥ó¤È¤·¤Æ¼Â¹Ô¤¹¤ë¡£ ¡¡£²¡¥yield retrun ¤Ç¼Â¹Ô¤·¤Æ¤¤¤ë¥³¥ë¡¼¥Á¥ó½èÍý¤Ç¤Ê¤±¤ì¤Ð¼èÆÀ¤Ç¤¤Ê¤¤¡£ ¡¡£³¡¥¥³¥ë¡¼¥Á¥ó¥á¥½¥Ã¥ÉÆâÉô¤Ç yield return ¤Î½èÍý¤ò½ñ¤¡¢Ìá¤êÃͤÎÃͤòÍÑ°Õ¤¹¤ë
¡¡ÈóƱ´ü½èÍý¤Î¤¿¤á¡¢½èÍý¤¬½ªÎ»¤¹¤ë¥¿¥¤¥ß¥ó¥°¤Þ¤ÇÂÔ¤¿¤Ê¤¤¤È½èÍý·ë²Ì¤Ï¼èÆÀ½ÐÍè¤Þ¤»¤ó¡£
¤Þ¤¿¡¢IEnumerator ·¿¤ÎÊÑ¿ôÆâÉô¤Ë¥¢¥¯¥»¥¹¤¹¤ë¤³¤È¤Ç yield return ¤ÇÍÑ°Õ¤µ¤ì¤Æ¤¤¤ëÌá¤êÃͤ¬¼èÆÀ¤Ç¤¤ë¤¿¤á¡¢
ÊÑ¿ô¤ËÂåÆþ¤·¤Æ¼Â¹Ô¤·¤Ê¤¤¤È¼èÆÀ½ÐÍè¤Þ¤»¤ó¡£
¡¡¥³¥ë¡¼¥Á¥ó¤«¤éÌá¤êÃͤò¼èÆÀ¤¹¤ë¤Ë¤Ï¡¢¥³¥ë¡¼¥Á¥óÆâ¤Ç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¤òÊÖ¤¹ }
¡¡¥³¥ë¡¼¥Á¥ó¥á¥½¥Ã¥É¤ÎÂåÆþ¤µ¤ì¤Æ¤¤¤ëÊÑ¿ô¤ËÂФ·¤Æ¡¢Current ¥×¥í¥Ñ¥Æ¥£¤ò¼Â¹Ô¤¹¤ë¤³¤È¤Ç
yield return ¤µ¤ì¤Æ¤¤¤ëÃͤòÌá¤êÃͤȤ·¤Æ¼èÆÀ½ÐÍè¤Þ¤¹¡£
¡¡¤³¤ì¤Ï object ·¿¤Ë¤Ê¤ë¤¿¤á¡¢ÌÀ¼¨Åª¤ÊÊÑ´¹(¥¥ã¥¹¥È)½èÍý¤¬É¬Íפˤʤê¤Þ¤¹¡£
¡¡Ä̾ï¤Î Start ¥á¥½¥Ã¥É¤Ç¤ÏÀµ¾ï¤ËÆ°ºî¤·¤Þ¤»¤ó¡£
private IEnumerator Start() { ¡¡¡¡// IEnumerator ·¿¤Î coroutine ÊÑ¿ô¤òÀë¸À¤·¡¢¼Â¹Ô¤·¤¿¤¤¥³¥ë¡¼¥Á¥ó¥á¥½¥Ã¥É¤òÂåÆþ¤¹¤ë ¡¡¡¡IEnumerator coroutine = MyCoroutine(); ¡¡¡¡// ¥³¥ë¡¼¥Á¥ó¥á¥½¥Ã¥É¤ò¼Â¹Ô StartCoroutine(coroutine); ¡¡¡¡int result = (int)coroutine.Current; Debug.Log("¥³¥ë¡¼¥Á¥ó¤«¤é¤ÎÌá¤êÃÍ: " + result); }
¡¡¤³¤Î¤è¤¦¤Ê·Á¤Ç½ñ¤¯¤³¤È¤Ë¤Ê¤ë¤¿¤á¡¢¥³¥ë¡¼¥Á¥ó¥á¥½¥Ã¥É¤Î½èÍý·ë²Ì¤òÂÔ¤¿¤º¤Ë²¼¤Î½èÍý¤¬¼Â¹Ô¤µ¤ì¤Þ¤¹¡£
¤½¤Î¤¿¤á¡¢¥³¥ë¡¼¥Á¥ó¥á¥½¥Ã¥ÉÆâ¤ÎÌá¤êÃͤϼèÆÀ½ÐÍè¤Þ¤»¤ó¡£(null ¤Ë¤Ê¤ê¤Þ¤¹)
»²¹Í¥µ¥¤¥È
¥Ï¥ë¥·¥ª¥ó¥·¥¹¥Æ¥à ÍÍ
¡Ú¥Ï¥ë¥·¥ª¥ó¥Ö¥í¥°¡ÛUnity¤Î¥³¥ë¡¼¥Á¥ó¤ÇÃͤòÊÖ¤¹ÊýË¡¡£¤¤¤¯¤Ä¤«ÊýË¡¤¢¤ë¤Ý¤¤¤±¤É¡¢¤½¤Î°ì¤Ä¤ò¾Ò²ð¡£
¡¡¥³¥ë¡¼¥Á¥ó¥á¥½¥Ã¥É¤Ë Action ·¿¤Ç¡¢»öÁ°¤ËÌá¤êÃͤò¼õ¤±¼è¤ë¤¿¤á¤ËÍÑ°Õ¤·¤¿ÊÑ¿ô¤ò°ú¿ô¤òÅϤ·¤Æ¼Â¹Ô¤¹¤ëÊýË¡¤Ç¤¹¡£
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); // Ìá¤êÃͤò¥³¡¼¥ë¥Ð¥Ã¥¯¤Ç³°Éô¤ËÄÌÃÎ } }
¡¡¥³¥ë¡¼¥Á¥ó¥á¥½¥Ã¥ÉÆâ¤Î callback(result) ¤ÎÉôʬ¤Ë¤Ä¤¤¤Æ¤Ï¡¢null ¥Á¥§¥Ã¥¯¤ò¹Ô¤Ã¤¿Êý¤¬¤è¤¤¤Ç¤·¤ç¤¦¡£
°Ê²¼¤Î£²¤Ä¤ÎÊýË¡¤ò¥µ¥ó¥×¥ë¤È¤·¤ÆÄ󼨤·¤Þ¤¹¡£
¡ã¡¡¡if ʸ¤ò»ÈÍѤ¹¤ëÊýË¡¡ä
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);// Ìá¤êÃͤò¥³¡¼¥ë¥Ð¥Ã¥¯¤Ç³°Éô¤ËÄÌÃÎ }
¡¡null ¥Á¥§¥Ã¥¯¤¹¤ë¤³¤È¤Ç°ÂÁ´¤Ë¼Â¹Ô¤Ç¤¤Þ¤¹¡£
¿¹¤Á¤ã¤ó¤ÎUnity³«È¯Ï¿
¡ÚUnity¡ÛÈóƱ´ü½èÍý¡¢IEnumerator¤ÇÊÖ¤êÃÍ(Ìá¤êÃÍ)¤ò¼ÂÁõ¤¹¤ë
¡¡¥³¥ë¡¼¥Á¥ó¥á¥½¥Ã¥É¤«¤éÌá¤êÃͤò¼èÆÀ¤¹¤ë¤Ë¤Ï¼ê´Ö¤¬¤«¤«¤ê¤Þ¤¹¤Î¤Ç¡¢UniTask ¤Ë¤è¤ëÈóƱ´ü½èÍý¤ò³èÍѤ·¤Þ¤·¤ç¤¦¡£
¡¡¥×¥í¥¸¥§¥¯¥È¤ËUniTask¤Î°Í¸´Ø·¸¤òÄɲä·¡¢UniTask¤ò»ÈÍѤǤ¤ë¤è¤¦¤Ë¤¹¤ë¤³¤È¤ò˺¤ì¤Ê¤¤¤Ç¤¯¤À¤µ¤¤¡£
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; } }
¡¡¤³¤ÎÎã¤Ç¤Ï¡¢UniTask¤ÎUniTask.Delay¥á¥½¥Ã¥É¤ò»ÈÍѤ·¤ÆÈóƱ´ü½èÍý¤ò¹Ô¤¤¡¢await¥¡¼¥ï¡¼¥É¤ò»ÈÍѤ·¤ÆÈóƱ´üÁàºî¤¬´°Î»¤¹¤ë¤Î¤òÂԤäƤ¤¤Þ¤¹¡£
¤½¤Î¸å¡¢UniTask¤«¤é¤ÎÌá¤êÃͤò¼èÆÀ¤·¤Æ¤¤¤Þ¤¹¡£
¡¡UniTask ¤ÎÌá¤êÃÍ¤Ï T(¥¸¥§¥Í¥ê¥Ã¥¯)·¿¤Ç¤¹¤Î¤Ç¡¢Ç¤°Õ¤Î·¿¤ò»ØÄê¤Ç¤¤Þ¤¹¡£¤Þ¤¿¡¢Ìá¤êÃͤʤ·¤Ç¤âÀßÄê¤Ç¤¤Þ¤¹¡£
¡¡UniTask ¤Ë¤è¤ëÈóƱ´ü½èÍý¤Ï¡¢ÂÔµ¡Á°Äó¤Ç¼ÂÁõ²Äǽ¤Ê½ñ¼°¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£
¥³¥ë¡¼¥Á¥ó¤Ë¤è¤ëÈóƱ´ü½èÍý¤Ï¡¢ÂÔµ¡¤·¤Ê¤¤Á°Äó¤Ç¤Î½ñ¼°¤Ç¤¹¡£
ÂÔµ¡¤µ¤»¤ë¤Ë¤Ï¥³¥ë¡¼¥Á¥ó¥á¥½¥Ã¥ÉÆâÉô¤Ç¡¢yield return ¤ò¤Ä¤±¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£
¡¡¤³¤ÎÉôʬ¤ËÂ礤ʰ㤤¤¬¤¢¤ê¤Þ¤¹¤Î¤Ç¡¢UniTask ¤ÏÌá¤êÃͤò¼õ¤±¼è¤ë¤³¤È¤¬Á°Äó¤ÎÀ߷פˤʤäƤ¤¤Þ¤¹¡£
¡¡UniTask¤Ï¡¢ÈóƱ´ü¥á¥½¥Ã¥É¤«¤éÊ£¿ô¤ÎÃͤòÌ᤹¤¿¤á¤Ë¥¿¥×¥ë¤ä¥«¥¹¥¿¥à¥¯¥é¥¹¤Ê¤É¤ÎÊýË¡¤òÄ󶡤·¤Þ¤¹¡£
¤³¤ì¤Ë¤è¤ê¡¢Ê£¿ô¤Î°Û¤Ê¤ë¥Ç¡¼¥¿¤ò°ìÅ٤˼èÆÀ¤Ç¤¡¢¥³¡¼¥É¤ò¤è¤ê¸úΨŪ¤Ëµ½Ò¤Ç¤¤Þ¤¹¡£
¤³¤ÎÍøÅÀ¤Ï¡¢Ê£»¨¤ÊÈóƱ´üÁàºî¤ä¥Ç¡¼¥¿¤ÎʹԽèÍý¤¬É¬Íפʾì¹ç¤ËÆäËÌòΩ¤Á¤Þ¤¹¡£
¡¡°Ê²¼¤Ë¡¢Ê£¿ô¤ÎÃͤòÌ᤹UniTask¤Î¥µ¥ó¥×¥ë¥³¡¼¥É¤ò¼¨¤·¤Þ¤¹¡£
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!"); } }
¡¡¤³¤ÎÎã¤Ç¤Ï¡¢MyUniTaskWithMultipleValues¥á¥½¥Ã¥É¤¬UniTask¤ò»ÈÍѤ·¤Æ2¤Ä¤Î°Û¤Ê¤ëÃÍ¡ÊÀ°¿ô¤Èʸ»úÎó¡Ë¤òÊÖ¤·¤Þ¤¹¡£
¥³¡¼¥ÉÆâ¤Ç¥¿¥×¥ë (int, string) ¤ò»ÈÍѤ·¤Æ¤³¤ì¤é¤ÎÃͤò¼èÆÀ¤·¡¢¤½¤ì¤¾¤ì result.Item1 ¤È result.Item2 ¤Ç¥¢¥¯¥»¥¹¤·¤Æ¤¤¤Þ¤¹¡£
¡¡UniTask¤ò»ÈÍѤ¹¤ë¤³¤È¤Ç¡¢ÈóƱ´ü½èÍý¤«¤éÊ£¿ô¤ÎÌá¤êÃͤò¼èÆÀ¤¹¤ë¤³¤È¤¬¤Ç¤¡¢¥³¡¼¥É¤ò¤è¤ê´Ê·é¤«¤Ä¸úΨŪ¤Ëµ½Ò¤Ç¤¤ë¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£
- ¥«¥Æ¥´¥ê¡§
- ¿Ê³Ø/¥¹¥¯¡¼¥ë
- ¥×¥í¥°¥é¥ß¥ó¥°
¥³¥á¥ó¥È¤ò¤«¤¯