ºÇ½ª¹¹¿·¡§
orika_ex_miyako 2024ǯ12·î30Æü(·î) 16:28:35ÍúÎò
¡¡ÈóƱ´ü½èÍý¤Ï¡¢¥×¥í¥°¥é¥à¤¬Ê£¿ô¤Î¥¿¥¹¥¯¤òÊÂÎó¤Ë½èÍý¤¹¤ë¼êË¡¤Î°ì¤Ä¤Ç¤¹¡£
Î㤨¤Ð¡¢½Å¤¤½èÍý¤ò¹Ô¤¦¥¿¥¹¥¯¤òÊ̤Υ¹¥ì¥Ã¥É¤Ç¼Â¹Ô¤·¡¢¥á¥¤¥ó¥¹¥ì¥Ã¥É¤Ï¥æ¡¼¥¶¡¼¥¤¥ó¥¿¡¼¥Õ¥§¡¼¥¹¤Î¹¹¿·¤Ê¤É¤ËÀìÇ°¤¹¤ë¤È¤¤¤Ã¤¿»È¤¤Êý¤¬¤¢¤ê¤Þ¤¹¡£
¤³¤ì¤Ë¤è¤ê¡¢¥×¥í¥°¥é¥à¤Î±þÅúÀ¤òÊݤÁ¤Ä¤Ä¡¢¸úΨŪ¤ËÊ£¿ô¤Î¥¿¥¹¥¯¤ò¿Ê¹Ô¤µ¤»¤ë¤³¤È¤¬¤Ç¤¤Þ¤¹¡£
¡¡Unity¤Ç¤Ï¡¢ÈóƱ´ü½èÍý¤Î°ì¤Ä¤È¤·¤Æ¥³¥ë¡¼¥Á¥ó¤¬¤¢¤ê¤Þ¤¹¡£
¡¡¥³¥ë¡¼¥Á¥ó¤Ï¡¢ÆÃÄê¤Î»þ´Ö¤À¤±½èÍý¤òÃæÃǤ·¤¿¤ê¡¢ÆÃÄê¤Î¾ò·ï¤¬Ëþ¤¿¤µ¤ì¤ë¤Þ¤ÇÂÔµ¡¤·¤¿¤ê¤¹¤ë¤³¤È¤¬¤Ç¤¤Þ¤¹¡£
¡¡¼¡¤Î¥µ¥ó¥×¥ë¤Ï¡¢¥³¥ë¡¼¥Á¥ó¤òÍѤ¤¤Æ1ÉÃÂÔµ¡¤¹¤ë½èÍý¤Ç¤¹¡£
using System.Collections; using UnityEngine; public class CoroutineExample : MonoBehaviour { private void Start() { StartCoroutine(WaitAndPrint()); } private IEnumerator WaitAndPrint() { yield return new WaitForSeconds(1); Debug.Log("Hello after 1 second!"); } }
¡¡UniTask¤Ï¡¢Unity¸þ¤±¤ÎÈóƱ´ü½èÍý¥é¥¤¥Ö¥é¥ê¤Ç¡¢Unity¤Î¥³¥ë¡¼¥Á¥ó¤ò¤è¤ê¸úΨŪ¤«¤ÄÊØÍø¤Ë»È¤¦¤³¤È¤¬¤Ç¤¤Þ¤¹¡£
Æäˡ¢async/await¥Ñ¥¿¡¼¥ó¤ò³èÍѤ¹¤ë¤³¤È¤Ç¡¢ÈóƱ´ü¤Î¥í¥¸¥Ã¥¯¤òľ´¶Åª¤Ëµ½Ò¤¹¤ë¤³¤È¤¬¤Ç¤¤Þ¤¹¡£
¡¡°Ê²¼¤Ï¡¢UniTask¤ò»È¤Ã¤¿´ðËÜŪ¤ÊÈóƱ´ü½èÍý¤ÎÎã¤Ç¤¹¡£
¡¡¤¿¤À¤·¡¢¤¤¤¤Ê¤ê UniTask ¤È¸À¤ï¤ì¤Æ¤âº®Í𤷤ޤ¹¤Î¤Ç¡¢¤Þ¤º¤Ï¥³¥ë¡¼¥Á¥ó¤Î½èÍý¤òºîÀ®¤·¡¢
¤½¤Á¤é¤ÈƱ¤¸½èÍý¤Ë¤Ê¤ë·Á¤Ç UniTask ¤ËÃÖ¤´¹¤¨¤ë¤è¤¦¤Ë¤·¤Þ¤¹¡£
¡ã¥³¥ë¡¼¥Á¥ó¤Î¾ì¹ç¡ä
using System.Collections; using UnityEngine; public class CoroutineExample : MonoBehaviour { private void Start() { StartCoroutine(Process1()); } private IEnumerator Process1() { yield return new WaitForSeconds(1f); Debug.Log("Process1 finished!"); StartCoroutine(Process2()); } private IEnumerator Process2() { yield return new WaitUntil(() => Input.GetButtonDown("Fire1")); Debug.Log("Process2 finished!"); StartCoroutine(Process3()); } private IEnumerator Process3() { yield return new WaitForSeconds(1f); Debug.Log("Process3 finished!"); } }
¡¡¤³¤Î¥³¡¼¥É¤Ç¤Ï¡¢Start¥á¥½¥Ã¥É¤ÇProcess1¥³¥ë¡¼¥Á¥ó¤ò³«»Ï¤·¤Þ¤¹¡£
¤½¤Î¥³¥ë¡¼¥Á¥ó¤¬´°Î»¤·¤¿¤éProcess2¥³¥ë¡¼¥Á¥ó¤ò³«»Ï¤·¡¢¤µ¤é¤Ë¤½¤Î´°Î»¸å¤ËProcess3¥³¥ë¡¼¥Á¥ó¤ò³«»Ï¤·¤Þ¤¹¡£
¡ãUniTask ¤Î¾ì¹ç¡ä
¡¡¾åµ¤Î¥³¥ë¡¼¥Á¥ó¤Î½èÍý¤òƱ¤¸ÆâÍÆ¤Ç UniTask ¤ÇÃÖ¤´¹¤¨¤¿¾ì¹ç¤Î¥µ¥ó¥×¥ë¥³¡¼¥É¤Ç¤¹¡£
using Cysharp.Threading.Tasks; using UnityEngine; public class UniTaskExample : MonoBehaviour { private async void Start() { await Process1(); await Process2(); await Process3(); } private async UniTask Process1() { await UniTask.Delay(1000); Debug.Log("Process1 finished!"); } private async UniTask Process2() { await UniTask.WaitUntil(() => Input.GetButtonDown("Fire1")); Debug.Log("Process2 finished!"); } private async UniTask Process3() { await UniTask.DelayFrame(60); Debug.Log("Process3 finished!"); } }
¡¡¤³¤Î¥³¡¼¥É¤Ç¤Ï¡¢Process1(), Process2(), Process3()¤Î3¤Ä¤ÎÈóƱ´ü¥¿¥¹¥¯¤¬½çÈ֤˼¹Ԥµ¤ì¤Þ¤¹¡£
¤½¤ì¤¾¤ì¤Î¥¿¥¹¥¯¤ÏUniTask¤òÊÖ¤·¡¢await¥¡¼¥ï¡¼¥É¤ò»È¤Ã¤Æ¤½¤Î¥¿¥¹¥¯¤¬´°Î»¤¹¤ë¤Þ¤ÇÂԤĤ³¤È¤¬¤Ç¤¤Þ¤¹¡£
¡¡UniTask¤Ë¤ÏUniTask.WaitUntil()¥á¥½¥Ã¥É¤¬ÍÑ°Õ¤µ¤ì¤Æ¤ª¤ê¡¢¥³¥ë¡¼¥Á¥ó¤ÇÍøÍѤ·¤Æ¤¤¤ë yield return new WaitUntil() ¤ÈƱÍͤε¡Ç½¤òÄ󶡤·¤Þ¤¹¡£
¡¡¤½¤ì¤¾¤ì¤ÎÆÃħ¤ò¸µ¤ËÈæ³Ó¤·¤Æ¤ß¤Þ¤·¤ç¤¦¡£
ÆÃħ | ¥³¥ë¡¼¥Á¥ó | UniTask |
½ÀÆðÀ | MonoBehaviour ¤Ë°Í¸¤¹¤ë(·Ñ¾µ¤·¤Æ¤¤¤Ê¤¤¤È»È¤¨¤Ê¤¤) | MonoBehaviour °Í¸¤Ê¤· (¥¯¥é¥¹Ã±ÂΤǤâÍøÍѲÄǽ) |
ÇË´þ | ¥²¡¼¥à¥ª¥Ö¥¸¥§¥¯¥È¤ÎÇ˲õ¡¦Èó¥¢¥¯¥Æ¥£¥Ö¾õÂÖ¤ÇÄä»ß¤¹¤ë | ¥²¡¼¥à¥ª¥Ö¥¸¥§¥¯¥È¤ÎÇ˲õ¡¦Èó¥¢¥¯¥Æ¥£¥Ö¾õÂ֤ǤâÄä»ß¤·¤Ê¤¤ |
¥¥ã¥ó¥»¥ë | StopCoroutine ¤Ë¤è¤ëÀ©¸æ | CancellationToken ¤Ë¤è¤ëÀ©¸æ |
¥Ñ¥Õ¥©¡¼¥Þ¥ó¥¹ | ¾õ¶·¤Ë±þ¤¸¤Æ GC(¥¬¥Ù¡¼¥¸¥³¥ì¥¯¥·¥ç¥ó) ȯÀ¸ | GC ºï¸º¡¢¸úΨŪ |
Îã³°½èÍý | try-catch ¤¬Æñ¤·¤¤ | ɸ½àŪ¤Ê try-catch ¤¬ÍøÍѲÄǽ |
¥Ç¥Ð¥Ã¥°¤Î¤·¤ä¤¹¤µ | ¸ÂÄêŪ (¥¹¥¿¥Ã¥¯¥È¥ì¡¼¥¹¼èÆÀº¤Æñ) | ¥¹¥¿¥Ã¥¯¥È¥ì¡¼¥¹¤ä¥¨¥é¡¼¥í¥°¤¬¼èÆÀ¤·¤ä¤¹¤¤ |
¥¢¥É¥ì¥¹»ØÄêÂбþ | Addressables ÈóÂбþ | Addressables Âбþ (ÈóƱ´ü¥¤¥ó¥¹¥¿¥ó¥¹´ÉÍý) |
¡¡UniTask ¤Ï MonoBehaviour ¥¯¥é¥¹¤ò·Ñ¾µ¤·¤Æ¤¤¤Ê¤¤¥¯¥é¥¹¤Ç¤âÍøÍѤ¬²Äǽ¤Ç¤¢¤ê¡¢Addressables ¤Ë¤âÂбþ¤·¤Æ¤¤¤Þ¤¹¡£
¤¿¤À¤·¡¢¥²¡¼¥à¥ª¥Ö¥¸¥§¥¯¥È¤¬ÇË´þ¤µ¤ì¤Æ¤â½èÍý¤¬»ß¤Þ¤é¤Ê¤¤¤¿¤á¡¢¥¥ã¥ó¥»¥ë½èÍý¤ò¸¡Æ¤¤·¤ÆÍÑ°Õ¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£
¡¡Æä˴ְ㤨¤ä¤¹¤¤ÅÀ¤È¤·¤Æ¡¢¥³¥ë¡¼¥Á¥ó¤Ï½èÍý¤òÂÔµ¡¤µ¤»¤º¤Ë¼¡¤Î½èÍý¤Ø°Ü¹Ô¤¹¤ëÈóƱ´ü½èÍý¤Ç¤¢¤ë¤Î¤ËÂФ·¡¢
UniTask ¤òÍøÍѤ·¤¿ async/await ¤ÎÈóƱ´ü½èÍý¤Ï¡¢ÂÔµ¡¤òÁ°Äó¤È¤·¤¿ÈóƱ´ü½èÍý¤Ç¤¢¤ëÉôʬ¤Ç¤¹¡£
¡¡¥³¥ë¡¼¥Á¥ó¥á¥½¥Ã¥É¤òÂÔµ¡¤µ¤»¤ë¤Ë¤Ï¡¢²¼µ¤Î¤è¤¦¤Ëµ½Ò¤·¤Þ¤¹¡£
¡¡yield return StartCorouine(¥³¥ë¡¼¥Á¥ó¥á¥½¥Ã¥É());
¡¡UniTask ¤Î¾ì¹ç¡¢¾åµ¤Î½èÍý¤¬´ðËܤÎÈóƱ´ü½èÍý¤È¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£
¡¡ÉáÃʤΥ³¥ë¡¼¥Á¥ó¥á¥½¥Ã¥É¤Ï¡¢yield return ¤ò¤Ä¤±¤Ê¤¤¤Ç½ñ¤¯¤³¤È¤â¤¢¤ë¤È»×¤¤¤Þ¤¹¤Î¤Ç¡¢
¥³¥ë¡¼¥Á¥ó¤ÈƱ¤¸´¶³Ð¤Ç UniTask ¤Î½èÍý¤ò½ñ¤¤¤Æ¤·¤Þ¤¦¤È¡¢º£¤Þ¤Ç¤È¤ÏµÕ¤Î½èÍý¤Î±¿ÍѤȤʤê¤Þ¤¹¡£
¡¡CancellationToken(¥¥ã¥ó¥»¥ì¡¼¥·¥ç¥ó¡¦¥È¡¼¥¯¥ó)¤Ï¡¢ÈóƱ´ü¥¿¥¹¥¯¤Î¥¥ã¥ó¥»¥ë¤ò¹Ô¤¦¤¿¤á¤Î»ÅÁȤߤǤ¹¡£
°ìÅÙ¥¥ã¥ó¥»¥ë¤µ¤ì¤¿CancellationToken¤ÏºÆÍøÍѤǤ¤Ê¤¤¤¿¤á¡¢¿·¤¿¤ÊÈóƱ´ü¥¿¥¹¥¯¤ò³«»Ï¤¹¤ë¤¿¤Ó¤Ë¿·¤·¤¤CancellationToken¤òºîÀ®¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£
¡¡°Ê²¼¤Ë¡¢CancellationToken¤òÍøÍѤ·¤¿UniTask¤ÎÎã¤ò¼¨¤·¤Þ¤¹¡§
using Cysharp.Threading.Tasks; using UnityEngine; using System.Threading; public class UniTaskCancellationTokenExample : MonoBehaviour { public GameObject button; public GameObject cancelButton; private CancellationTokenSource cancellationTokenSource; private async void Start() { using (cancellationTokenSource = new CancellationTokenSource()) { await WaitUntilButtonPressed(); } } private async UniTask WaitUntilButtonPressed() { try { await UniTask.WaitUntil(() => button.GetComponent<Button>().IsPressed(), cancellationToken: cancellationTokenSource.Token); Debug.Log("Button pressed!"); } catch (OperationCanceledException) { Debug.Log("Waiting for button press cancelled!"); } } public void OnCancelButtonPressed() { cancellationTokenSource.Cancel(); } }
¡¡¤³¤Î¥³¡¼¥É¤Ç¤Ï¡¢WaitUntilButtonPressed¥á¥½¥Ã¥É¤¬¥Ü¥¿¥ó¤¬²¡¤µ¤ì¤ë¤Î¤òÂÔ¤ÄÈóƱ´ü¥¿¥¹¥¯¤òºîÀ®¤·¤Þ¤¹¡£
¤½¤·¤Æ¡¢¤½¤Î¥¿¥¹¥¯¤¬´°Î»¤¹¤ë¤Þ¤Çawait¥¡¼¥ï¡¼¥É¤ò»È¤Ã¤ÆÂÔ¤Á¤Þ¤¹¡£¥Ü¥¿¥ó¤¬²¡¤µ¤ì¤¿¤é¡¢¥á¥Ã¥»¡¼¥¸¤¬¥í¥°¤Ë½ÐÎϤµ¤ì¤Þ¤¹¡£
¡¡¤Þ¤¿¡¢¥¥ã¥ó¥»¥ë¥Ü¥¿¥ó¤¬²¡¤µ¤ì¤¿¤é¡¢OnCancelButtonPressed¥á¥½¥Ã¥É¤¬¸Æ¤Ð¤ì¡¢CancellationTokenSource¤ÎCancel¥á¥½¥Ã¥É¤¬¸Æ¤Ó½Ð¤µ¤ì¤Þ¤¹¡£
¤³¤ì¤Ë¤è¤ê¡¢WaitUntilButtonPressed¥á¥½¥Ã¥É¤ÎÈóƱ´ü¥¿¥¹¥¯¤¬¥¥ã¥ó¥»¥ë¤µ¤ì¡¢¥¥ã¥ó¥»¥ë¤¬È¯À¸¤·¤¿¤³¤È¤¬¥í¥°¤Ë½ÐÎϤµ¤ì¤Þ¤¹¡£
¡¡¤½¤ì¤Ç¤Ï¡¢Àè¤Û¤ÉÄ󼨤·¤¿¥³¥ë¡¼¥Á¥ó¤Î½èÍý¤ò UniTask ¤ËÃÖ¤´¹¤¨¤¿¥µ¥ó¥×¥ë¥³¡¼¥É¤Ë¤â CancellationToken ¤òŬÍѤ·¤Æ¤ß¤Þ¤·¤ç¤¦¡£
UniTask ¤ÇÍÑ°Õ¤µ¤ì¤Æ¤¤¤ë¥á¥½¥Ã¥É¤Ë¤Ï¡¢CancellationToken ¤ò»ØÄꤹ¤ë¤³¤È¤¬½ÐÍè¤ë¤è¤¦¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹(¥Ç¥Õ¥©¥ë¥È°ú¿ô¤Ï null ¤Ç¤¹)¡£
using Cysharp.Threading.Tasks; using UnityEngine; public class UniTaskExample : MonoBehaviour { private CancellationTokenSource cancellationTokenSource = new CancellationTokenSource(); private async void Start() { await Process1(); await Process2(); await Process3(); } private async UniTask Process1() { await UniTask.Delay(1000, cancellationToken: cancellationTokenSource.Token); Debug.Log("Process1 finished!"); } private async UniTask Process2() { await UniTask.WaitUntil(() => Input.GetButtonDown("Fire1"), cancellationToken: cancellationTokenSource.Token); Debug.Log("Process2 finished!"); } private async UniTask Process3() { await UniTask.DelayFrame(60, cancellationToken: cancellationTokenSource.Token); Debug.Log("Process3 finished!"); } public void CancelAllProcesses() { cancellationTokenSource.Cancel(); } }
¡¡¤³¤Î¥³¡¼¥É¤Ç¤Ï¡¢³ÆÈóƱ´ü½èÍý¤ËCancellationToken¤òŬÍѤ·¤Æ¤¤¤Þ¤¹¡£
¤½¤·¤Æ¡¢CancelAllProcesses¥á¥½¥Ã¥É¤¬¸Æ¤Ð¤ì¤ë¤È¡¢¤¹¤Ù¤Æ¤ÎÈóƱ´ü½èÍý¤¬¥¥ã¥ó¥»¥ë¤µ¤ì¤Þ¤¹¡£
¡¡ÈóƱ´ü½èÍý¤Ç¤Ï¡¢Îã³°¤¬È¯À¸¤¹¤ë²ÄǽÀ¤¬¾ï¤Ë¸ºß¤·¤Þ¤¹¡£
¤³¤Î¾ì¹ç¡¢¤¤¤¯¤Ä¤«¤ÎÊýË¡¤òÍøÍѤ·¤Æ¡¢Îã³°¤òŬÀڤ˥ϥó¥É¥ê¥ó¥°¤¹¤ë¤³¤È¤¬½ÅÍפǤ¹¡£
ÆÃ¤Ë CancellationToken¤¬¥¥ã¥ó¥»¥ë¤µ¤ì¤¿¤È¤¤ÏOperationCanceledException¤¬¥¹¥í¡¼¤µ¤ì¤Þ¤¹¤Î¤Ç¡¢¥Ï¥ó¥É¥ê¥ó¥°¤·¤Æ¤¤¤Ê¤¤¤È¥¨¥é¡¼¤È¤·¤ÆÄä»ß¤·¤Æ¤·¤Þ¤¤¤Þ¤¹¡£
¡¡°Ê²¼¤Ë¡¢ÈóƱ´ü½èÍý¤Î¥¨¥é¡¼¥Ï¥ó¥É¥ê¥ó¥°¤ÎÎã¤ò¼¨¤·¤Þ¤¹
¡¡ºÇ¤â°ìÈÌŪ¤ÊÊýË¡¤Ç¤¹¡£
try/catch(ɬÍפ˱þ¤¸¤Æ finally)¥Ö¥í¥Ã¥¯¤ò»ÈÍѤ·¤Æ¡¢Îã³°¤Î¥Ï¥ó¥É¥ê¥ó¥°¤ò¹Ô¤¤¤Þ¤¹¡£
using Cysharp.Threading.Tasks; using UnityEngine; public class UniTaskErrorHandlingExample : MonoBehaviour { private async void Start() { try { await Process(); } catch (System.Exception e) { Debug.Log("An error occurred: " + e.Message); } } private async UniTask Process() { // Here, something might throw an exception... } }
¡¡¤³¤Î¥³¡¼¥É¤Ç¤Ï¡¢Process()¥á¥½¥Ã¥É¤¬²¿¤é¤«¤ÎÎã³°¤ò¥¹¥í¡¼¤¹¤ë²ÄǽÀ¤¬¤¢¤ê¤Þ¤¹¡£
¤½¤Î¤¿¤á¡¢Process()¥á¥½¥Ã¥É¤Î¸Æ¤Ó½Ð¤·¤Ïtry¥Ö¥í¥Ã¥¯Æâ¤ËÃÖ¤«¤ì¤Æ¤¤¤Þ¤¹¡£
¤â¤·Process()¥á¥½¥Ã¥É¤¬Îã³°¤ò¥¹¥í¡¼¤·¤¿¤é¡¢¤½¤ì¤Ïcatch¥Ö¥í¥Ã¥¯¤ÇÊ᪤µ¤ì¡¢¥¨¥é¡¼¥á¥Ã¥»¡¼¥¸¤¬¥í¥°¤Ë½ÐÎϤµ¤ì¤Þ¤¹¡£
¡¡¤½¤ì¤Ç¤Ï¡¢Àè¤Û¤ÉÄ󼨤·¤¿¥³¥ë¡¼¥Á¥ó¤Î½èÍý¤ò UniTask ¤ËÃÖ¤´¹¤¨¤¿¥µ¥ó¥×¥ë¥³¡¼¥É¤Ë¤â¥¨¥é¡¼¥Ï¥ó¥É¥ê¥ó¥°¤òŬÍѤ·¤Æ¤ß¤Þ¤·¤ç¤¦¡£
using Cysharp.Threading.Tasks; using UnityEngine; public class UniTaskExample : MonoBehaviour { private CancellationTokenSource cancellationTokenSource = new CancellationTokenSource(); private async void Start() { try { await Process1(); await Process2(); await Process3(); } catch (OperationCanceledException) { Debug.Log("Task was cancelled!"); } } private async UniTask Process1() { await UniTask.Delay(1000, cancellationToken: cancellationTokenSource.Token); Debug.Log("Process1 finished!"); } private async UniTask Process2() { await UniTask.WaitUntil(() => Input.GetButtonDown("Fire1"), cancellationToken: cancellationTokenSource.Token); Debug.Log("Process2 finished!"); } private async UniTask Process3() { await UniTask.DelayFrame(60, cancellationToken: cancellationTokenSource.Token); Debug.Log("Process3 finished!"); } public void CancelAllProcesses() { cancellationTokenSource.Cancel(); } }¡¡
¡¡¤³¤Î¥³¡¼¥É¤Ç¤Ï¡¢³ÆÈóƱ´ü½èÍý¤ËCancellationToken¤òŬÍѤ·¤Æ¤¤¤Þ¤¹¡£
¤½¤·¤Æ¡¢CancelAllProcesses¥á¥½¥Ã¥É¤¬¸Æ¤Ð¤ì¤ë¤È¡¢¤¹¤Ù¤Æ¤ÎÈóƱ´ü½èÍý¤¬¥¥ã¥ó¥»¥ë¤µ¤ì¤Þ¤¹¡£
¡¡¤½¤³¤Ç¡¢Start¥á¥½¥Ã¥É¤ÇÈóƱ´ü½èÍý¤òawait¤¹¤ëºÝ¤Ï¡¢¥¥ã¥ó¥»¥ë¤¬È¯À¸¤·¤¿¾ì¹ç¤ËÈ÷¤¨¤Ætry/catch¥Ö¥í¥Ã¥¯¤Ç°Ï¤ó¤Ç¤¤¤Þ¤¹¡£
¤³¤ì¤Ë¤è¤ê¡¢ÈóƱ´ü½èÍý¤¬¥¥ã¥ó¥»¥ë¤µ¤ì¤¿¾ì¹ç¤Ç¤âŬÀڤ˽èÍý¤Ç¤¤Þ¤¹¡£
¡¡Àè¤Û¤É¤Î³Æ¥×¥í¥»¥¹¤Î¸Æ¤Ó½Ð¤·¤Ë .SuppressCancellationThrow() ¤òÄɲä·¤Þ¤·¤¿¡£
¡¡¤³¤ì¤Ë¤è¤ê¡¢¥¥ã¥ó¥»¥ë¤µ¤ì¤¿¾ì¹ç¤Ç¤âÎã³°¤¬¥¹¥í¡¼¤µ¤ì¤º¡¢½èÍý¤¬Àµ¾ï½ªÎ»¤·¤¿¤«¤Î¤è¤¦¤Ë°·¤ï¤ì¤Þ¤¹¡£
¤è¤Ã¤Æ catch¥Ö¥í¥Ã¥¯¤ÏÉÔÍ× ¤Ë¤Ê¤ê¤Þ¤¹¤Î¤Ç¡¢¥¥ã¥ó¥»¥ëÎã³°¤òÍÞÀ©¤¹¤ë¤³¤È¤ÇÎã³°¤¬È¯À¸¤·¤Ê¤¤¤¿¤á¡¢try-catch ¤Ïºï½ü¤·¤Þ¤·¤¿¡£
¡¡³Æ¥×¥í¥»¥¹¤¬¥¥ã¥ó¥»¥ë¤µ¤ì¤¿¾ì¹ç¡¢¥í¥°½ÐÎϤϹԤï¤ì¤Þ¤»¤ó¤¬¡¢ºÇ¸å¤Ë¡ÖAll processes completed or cancelled.¡×¤È¤¤¤¦¥á¥Ã¥»¡¼¥¸¤ò½ÐÎϤ·¤Þ¤¹¡£
using Cysharp.Threading.Tasks; using UnityEngine; public class UniTaskExample : MonoBehaviour { private CancellationTokenSource cancellationTokenSource = new CancellationTokenSource(); private async void Start() { // SuppressCancellationThrow ¤ò»ÈÍѤ·¤Æ¥¥ã¥ó¥»¥ëÎã³°¤òÍÞÀ© await Process1().SuppressCancellationThrow(); await Process2().SuppressCancellationThrow(); await Process3().SuppressCancellationThrow(); Debug.Log("All processes completed or cancelled."); } private async UniTask Process1() { await UniTask.Delay(1000, cancellationToken: cancellationTokenSource.Token); Debug.Log("Process1 finished!"); } private async UniTask Process2() { await UniTask.WaitUntil(() => Input.GetButtonDown("Fire1"), cancellationToken: cancellationTokenSource.Token); Debug.Log("Process2 finished!"); } private async UniTask Process3() { await UniTask.DelayFrame(60, cancellationToken: cancellationTokenSource.Token); Debug.Log("Process3 finished!"); } public void CancelAllProcesses() { cancellationTokenSource.Cancel(); } }
¡¡¤¿¤À¤·¡¢SuppressCancellationThrow() ¤ò»È¤¦¤ÈÎã³°¤¬Ìµ»ë¤µ¤ì¤ë¤¿¤á¡¢¥¥ã¥ó¥»¥ë½èÍý¤òÆÃÊ̤˶èÊ̤¹¤ëɬÍפ¬¤¢¤ë¾ì¹ç¤ÏÊÌÅӥե饰´ÉÍý¤Ê¤É¤¬É¬ÍפǤ¹¡£
¡¡¤½¤Á¤é¤â¤Þ¤È¤á¤Æ¤ª¤¤Þ¤¹¡£
¡¡SuppressCancellationThrow() ¤ò»È¤Ã¤Æ await ¤È¤È¤â¤Ë¸Æ¤Ó½Ð¤¹¾ì¹ç¡¢
UniTask ¤òÊÖ¤¹¥á¥½¥Ã¥É¤ËÂФ·¤Æ¥¥ã¥ó¥»¥ë¤Î¾õÂÖ¤ò¥Á¥§¥Ã¥¯¤¹¤ë¤¿¤á¤Ë¥Õ¥é¥°¡ÊÎ㤨¤Ð isCancelled¡Ë¤ò´ÉÍý¤¹¤ë¤³¤È¤¬¤Ç¤¤Þ¤¹¡£
¡¡¤³¤Î¥±¡¼¥¹¤Ë¤ª¤¤¤Æ¡¢UniTask.Delay ¤ò»ÈÍѤ¹¤ë½èÍý¤Ë SuppressCancellationThrow() ¤òÄɲ乤ë·Á¤Ë¤¹¤ë¤È¡¢
¥¥ã¥ó¥»¥ë¤µ¤ì¤¿¤«¤É¤¦¤«¤òÄÉÀפ¹¤ëÊýË¡¤ò°Ê²¼¤Î¤è¤¦¤Ë¼¨¤¹¤³¤È¤¬¤Ç¤¤Þ¤¹¡£
using Cysharp.Threading.Tasks; using UnityEngine; public class UniTaskExample : MonoBehaviour { private CancellationTokenSource cancellationTokenSource = new CancellationTokenSource(); private async void Start() { // Process1¤ò¸Æ¤Ó½Ð¤·¤Æ¥¥ã¥ó¥»¥ë¾õÂÖ¤ò³Îǧ var isCancelled = await Process1(cancellationTokenSource.Token); if (isCancelled) { Debug.Log("Process1 was cancelled."); } else { Debug.Log("Process1 finished."); } // ¾¤Î¥×¥í¥»¥¹¤âƱÍͤ˽èÍý var isCancelled2 = await Process2(cancellationTokenSource.Token); if (isCancelled2) { Debug.Log("Process2 was cancelled."); } else { Debug.Log("Process2 finished."); } var isCancelled3 = await Process3(cancellationTokenSource.Token); if (isCancelled3) { Debug.Log("Process3 was cancelled."); } else { Debug.Log("Process3 finished."); } } private async UniTask<bool> Process1(CancellationToken token) { await UniTask.Delay(1000, cancellationToken: token).SuppressCancellationThrow(); return token.IsCancellationRequested; // ¥¥ã¥ó¥»¥ë¤µ¤ì¤¿¾ì¹ç¤Ïtrue¤òÊÖ¤¹ } private async UniTask<bool> Process2(CancellationToken token) { await UniTask.WaitUntil(() => Input.GetButtonDown("Fire1"), cancellationToken: token).SuppressCancellationThrow(); return token.IsCancellationRequested; // ¥¥ã¥ó¥»¥ë¤µ¤ì¤¿¾ì¹ç¤Ïtrue¤òÊÖ¤¹ } private async UniTask<bool> Process3(CancellationToken token) { await UniTask.DelayFrame(60, cancellationToken: token).SuppressCancellationThrow(); return token.IsCancellationRequested; // ¥¥ã¥ó¥»¥ë¤µ¤ì¤¿¾ì¹ç¤Ïtrue¤òÊÖ¤¹ } public void CancelAllProcesses() { cancellationTokenSource.Cancel(); } }
¡¡Process1, Process2, Process3 ¥á¥½¥Ã¥É¤¬ UniTask<bool> ¤òÊÖ¤¹¤è¤¦¤ËÊѹ¹¤µ¤ì¡¢¥¥ã¥ó¥»¥ë¾õÂÖ¡Êtrue ¤Þ¤¿¤Ï false¡Ë¤òÊÖ¤¹¤è¤¦¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£
SuppressCancellationThrow() ¤ò»ÈÍѤ·¤Æ¥¥ã¥ó¥»¥ë¤µ¤ì¤¿¾ì¹ç¤Ç¤âÎã³°¤ò¥¹¥í¡¼¤»¤º¤Ë¿Ê¹Ô¤·¤Þ¤¹¡£
³Æ¥×¥í¥»¥¹¤¬½ªÎ»¤·¤¿¸å¡¢token.IsCancellationRequested ¤ò¥Á¥§¥Ã¥¯¤·¤Æ¥¥ã¥ó¥»¥ë¤µ¤ì¤¿¤«¤É¤¦¤«¤ò³Îǧ¤·¡¢¤½¤Î¾õÂ֤˴ð¤Å¤¤¤Æ¥á¥Ã¥»¡¼¥¸¤ò½ÐÎϤ·¤Æ¤¤¤Þ¤¹¡£
¡¡°Ê¾å¤Î¤³¤È¤«¤é¡¢SuppressCancellationThrow() ¤ò»È¤¦¤³¤È¤Ç¥¥ã¥ó¥»¥ëÎã³°¤òÍÞÀ©¤·¡¢token.IsCancellationRequested ¤òÍøÍѤ·¤Æ¥¥ã¥ó¥»¥ë¤Î¾õÂÖ¤òÄÉÀפǤ¤Þ¤¹¡£
¤³¤ì¤Ë¤è¤ê¡¢¥¥ã¥ó¥»¥ë¤µ¤ì¤¿¤«¤É¤¦¤«¤ò¥á¥½¥Ã¥ÉÆâ¤Ç³Îǧ¤·¡¢¸Æ¤Ó½Ð¤·¸µ¤ÇŬÀڤ˽èÍý¤ò¹Ô¤¦¤³¤È¤¬¤Ç¤¤Þ¤¹¡£
¡¡try / catch ½èÍý¤È SuppressCancellationThrow() ¥á¥½¥Ã¥É¤ÎξÊý¤òÍøÍѤ¹¤ë¤³¤È¤Ç¡¢¥¥ã¥ó¥»¥ëȯÀ¸»þ¤Î¥Ï¥ó¥É¥ê¥ó¥°¤È
¥¨¥é¡¼¤Ë¤è¤ëÎã³°½èÍý¤Î¥Ï¥ó¥É¥ê¥ó¥°¤ÎξÊý¤òʬ¤±¤ÆȽÃǤ¹¤ë¤³¤È¤¬²Äǽ¤Ç¤¹¡£
using Cysharp.Threading.Tasks; using UnityEngine; public class UniTaskExample : MonoBehaviour { private CancellationTokenSource cancellationTokenSource = new CancellationTokenSource(); private async void Start() { try { // Process1 ¤ò¸Æ¤Ó½Ð¤·¡¢¥¥ã¥ó¥»¥ë¾õÂ֤ǥ¨¥é¡¼¥Ï¥ó¥É¥ê¥ó¥° await Process1(cancellationTokenSource.Token); Debug.Log("Process1 finished."); // ¾¤Î¥×¥í¥»¥¹¤â¸Æ¤Ó½Ð¤· await Process2(cancellationTokenSource.Token); Debug.Log("Process2 finished."); await Process3(cancellationTokenSource.Token); Debug.Log("Process3 finished."); } catch (OperationCanceledException) { Debug.Log("One of the processes was cancelled."); } } private async UniTask Process1(CancellationToken token) { await UniTask.Delay(1000, cancellationToken: token).SuppressCancellationThrow(); } private async UniTask Process2(CancellationToken token) { await UniTask.WaitUntil(() => Input.GetButtonDown("Fire1"), cancellationToken: token).SuppressCancellationThrow(); } private async UniTask Process3(CancellationToken token) { await UniTask.DelayFrame(60, cancellationToken: token).SuppressCancellationThrow(); } public void CancelAllProcesses() { cancellationTokenSource.Cancel(); } }
¡¡SuppressCancellationThrow() ¤ò»È¤¦¤³¤È¤ÇÎã³°¤¬È¯À¸¤·¤Ê¤¤¤¿¤á¡¢catch (OperationCanceledException) ¤Ç°ìÅÙ¤À¤±¥¥ã¥ó¥»¥ë¤µ¤ì¤¿¾ì¹ç¤Î¥¨¥é¡¼¥Ï¥ó¥É¥ê¥ó¥°¤ò¹Ô¤Ã¤Æ¤¤¤Þ¤¹¡£
¡¡³Æ Process ¥á¥½¥Ã¥É¤ÏÎã³°¤ò¥¹¥í¡¼¤»¤º¡¢¥¥ã¥ó¥»¥ë¤µ¤ì¤¿¾ì¹ç¤Ç¤â½èÍý¤¬Â³¤¤Þ¤¹¡£
SuppressCancellationThrow() ¤¬¥¥ã¥ó¥»¥ë¤ò̵»ë¤·¤ÆÎã³°¤òÅꤲ¤Ê¤¤¤è¤¦¤Ë¤·¤Þ¤¹¤¬¡¢try-catch ¤Ç¤½¤Î¾õÂÖ¤òŬÀÚ¤ËÊ᪤·¤Þ¤¹¡£
¤è¤Ã¤Æ¾éĹ¤Ê¥¥ã¥ó¥»¥ë¾õÂÖ¥Á¥§¥Ã¥¯¤ò¹Ô¤ï¤º¡¢¥¨¥é¡¼¡Ê¥¥ã¥ó¥»¥ë¡Ë¤Î¤ß¤òÊ᪤·¤Æ¥í¥°¤òɽ¼¨¤¹¤ë¤³¤È¤Ç¡¢¥¨¥é¡¼¥Ï¥ó¥É¥ê¥ó¥°¤Î´ÊÁDz½¤ò¹Ô¤Ã¤Æ¤¤¤Þ¤¹¡£
¡¡try-catch ¤Ë¤è¤Ã¤Æ¡¢¥¥ã¥ó¥»¥ë¤¬È¯À¸¤·¤¿¾ì¹ç¤Î¤ßŬÀڤ˥ϥó¥É¥ê¥ó¥°¤µ¤ì¡¢¤½¤Î¾¤Î¥¨¥é¡¼¤Ï¤½¤Î¤Þ¤Þ½èÍý¤¬¿Ê¤ß¤Þ¤¹¡£
SuppressCancellationThrow() ¤ò»È¤¦¤³¤È¤Ç¡¢¥¥ã¥ó¥»¥ëÎã³°¤¬¥¹¥í¡¼¤µ¤ì¤Ê¤¤¤¿¤á¡¢try-catch ¤Ç¥¥ã¥ó¥»¥ë¤ò½èÍý¤¹¤ë·Á¤Ë¤·¤Æ¡¢¥³¡¼¥É¤ò¥·¥ó¥×¥ë¤ËÊݤäƤ¤¤Þ¤¹¡£
¤³¤ÎÊýË¡¤Ç¡¢¾éĹÀ¤òÇÓ½ü¤·¡¢¥¨¥é¡¼¥Ï¥ó¥É¥ê¥ó¥°¤ò¸úΨ²½¤Ç¤¤Þ¤¹¡£
¡¡UniTask¤ÏDOTween¤È¤âÏ¢·È¤¬²Äǽ¤Ç¡¢ÈóƱ´ü¤ËTween¤òÂԤĤ³¤È¤¬¤Ç¤¤Þ¤¹¡£
¤Þ¤¿ CancellationToken ¤â»ØÄꤷ¡¢¥¨¥é¡¼¥Ï¥ó¥É¥ê¥ó¥°¤¹¤ë¤³¤È¤¬½ÐÍè¤Þ¤¹¡£
¡¡°Ê²¼¤Ë¤½¤ÎÎã¤ò¼¨¤·¤Þ¤¹¡£
using Cysharp.Threading.Tasks; using UnityEngine; using DG.Tweening; public class UniTaskDOTweenExample : MonoBehaviour { public GameObject target; private async void Start() { var token = this.GetCancellationTokenOnDestroy(); try { await target.transform.DOMove(new Vector3(10, 0, 0), 1).ToUniTask(cancellationToken: token); Debug.Log("Move completed!"); } catch (OperationCanceledException) { Debug.Log("Move cancelled!"); } } }
¡¡¤³¤Î¥³¡¼¥É¤Ç¤Ï¡¢ÂоݤΥª¥Ö¥¸¥§¥¯¥È¤ò¿·¤·¤¤°ÌÃ֤˰ÜÆ°¤µ¤»¤ëTween¤òºîÀ®¤·¡¢¤½¤ÎTween¤¬´°Î»¤¹¤ë¤Þ¤ÇÈóƱ´ü¤ËÂԤĤ³¤È¤¬¤Ç¤¤Þ¤¹¡£
GetCancellationTokenOnDestroy¥á¥½¥Ã¥É¤ò»È¤Ã¤Æ¡¢¤³¤Î¥²¡¼¥à¥ª¥Ö¥¸¥§¥¯¥È¤¬ÇË´þ¤µ¤ì¤¿¤È¤¤Ë¼«Æ°Åª¤ËÈóƱ´ü¥¿¥¹¥¯¤¬¥¥ã¥ó¥»¥ë¤µ¤ì¤ë¤è¤¦¤Ë¤·¤Æ¤¤¤Þ¤¹¡£
¡¡DOTween ¤Î¤è¤¦¤Ë¥²¡¼¥à¥ª¥Ö¥¸¥§¥¯¥È¤ÎµóÆ°¤Ëɳ¤Å¤¤¤Æ¤¤¤ë½èÍý¤Ë¤Ä¤¤¤Æ¤Ï¡¢
¥²¡¼¥à¥ª¥Ö¥¸¥§¥¯¥È¤ÎÇË´þ¤Î¥¿¥¤¥ß¥ó¥°¤ÇÈóƱ´ü½èÍý¤¬¥¥ã¥ó¥»¥ë¤µ¤ì¤ë GetCancellationTokenOnDestroy¥á¥½¥Ã¥É¤ò CancellationToken ¤ËŬÍѤ¹¤ë¤ÈÊØÍø¤Ç¤¹¡£
¡¡¤Þ¤¿ Unity 2022.2 °Ê¹ß¤Ç¤¢¤ì¤Ð¡¢destroyCancellationToken ÊÑ¿ô¤òÍøÍѤ·¤Æ¤âƱ¤¸¤è¤¦¤Ë¥¥ã¥ó¥»¥ë²Äǽ¤Ç¤¹¡£
Unity ¸ø¼°¥¹¥¯¥ê¥×¥È¥ê¥Õ¥¡¥ì¥ó¥¹
MonoBehaviour.destroyCancellationToken
https://docs.unity3d.com/ja/current/ScriptReferenc...
¡¡
¡¡º£²óÄ󼨤·¤Æ¤¤¤ë DOTween ¤ÎÂÔµ¡½èÍý¤Ç¤¹¤¬
¡¡await target.transform.DOMove(new Vector3(10, 0, 0), 1).ToUniTask(cancellationToken: token);
¡¡°Ê²¼¤Î½ñ¼°¤Ç¤âƱ¤¸½èÍý¤ò¼ÂÁõ½ÐÍè¤Þ¤¹¡£
¡ãÊ̥ѥ¿¡¼¥ó¡¡ä
¡¡await target.DOMove(new Vector3(10, 0, 0), 1).AsyncWaitForCompletion(cancellationToken: token);
¡ãÊ̥ѥ¿¡¼¥ó¢¡ä
Tween tween = target.DOMove(new Vector3(10, 0, 0), 1); await tween.ToUniTask(cancellationToken: token);
¡¡Ê£¿ô¤Î½ñ¼°¤¬¤¢¤ë¾ì¹ç¡¢µ½Ò¤Ë°ì´ÓÀ¤ò»ý¤¿¤»¤ë¤³¤È¤¬¤Ç¤¤ì¤Ð¤É¤Î½èÍý¤òÍøÍѤ·¤Æ¤âÌäÂꤢ¤ê¤Þ¤»¤ó¡£
¡¡DOTween ¤ÎÂоÝ(target ÊÑ¿ô¤ÎÃÍ)¤¬°ÂÁ´À¤¬Êݾڤµ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢try / catch ¤ÎÂå¤ï¤ê¤Ë SuppressCancellationThrow ¥á¥½¥Ã¥É¤òÍøÍѤ·¤Æ¥¥ã¥ó¥»¥ëÂбþ¤¬²Äǽ¤Ç¤¹¡£
using Cysharp.Threading.Tasks; using UnityEngine; using DG.Tweening; public class UniTaskDOTweenExample : MonoBehaviour { public GameObject target; private async void Start() { var token = this.GetCancellationTokenOnDestroy(); // SuppressCancellationThrow ¤òÍøÍѤ·¤Æ¥¨¥é¡¼¥Ï¥ó¥É¥ê¥ó¥°¤ò¥·¥ó¥×¥ë¤Ë bool isCanceled = await target.transform.DOMove(new Vector3(10, 0, 0), 1) .ToUniTask(cancellationToken: token) .SuppressCancellationThrow(); // ¥¥ã¥ó¥»¥ë¤¬È¯À¸¤·¤¿¾ì¹ç if (isCanceled) { Debug.Log("Move cancelled!"); // TODO ¥¥ã¥ó¥»¥ë»þ¤ÎÎã³°½èÍý¤ò½ñ¤¡¢É¬Íפ˱þ¤¸¤Æ return ¤Ê¤É¤ò¹Ö¤¸¤ë } } }
¡¡Ëü¤¬°ì¥¥ã¥ó¥»¥ë¤¬È¯À¸¤·¤Æ¤âÎã³°½èÍý¤ÏȯÀ¸¤·¤Þ¤»¤ó¤Î¤Ç¡¢catch ¤ÏÉÔÍפǤ¹¡£
¡¡¤â¤·¤â DOTween ¤ÎÂоÝ(target ÊÑ¿ô¤ÎÃÍ)¤Î°ÂÁ´À¤ÎôÊݤ¬Æñ¤·¤¤¾ì¹ç¤Ë¤Ï¡¢
try / catch ¤È SuppressCancellationThrow ¥á¥½¥Ã¥É¤ò¹ç¤ï¤»¤Æµ½Ò¤¹¤ë¤³¤È¤Ç
¥¥ã¥ó¥»¥ëȯÀ¸»þ¡¢¤ª¤è¤Ó¥¨¥é¡¼È¯À¸»þ¤ÎÎã³°½èÍý¤Î¥Ï¥ó¥É¥ê¥ó¥°¤¬¹Ô¤¨¤Þ¤¹¡£
using Cysharp.Threading.Tasks; using UnityEngine; using DG.Tweening; public class UniTaskDOTweenExample : MonoBehaviour { public GameObject target; private async void Start() { var token = this.GetCancellationTokenOnDestroy(); try { // ¥¥ã¥ó¥»¥ëÎã³°ÍÞÀ© + ¥¥ã¥ó¥»¥ë¾õÂÖ¤òľÀÜȽÄê var isCanceled = await target.transform.DOMove(new Vector3(10, 0, 0), 1) .ToUniTask(cancellationToken: token) .SuppressCancellationThrow(); // ¥¥ã¥ó¥»¥ë¾õÂÖ¤ÎȽÄê if (isCanceled) { Debug.Log("Move cancelled!"); } else { Debug.Log("Move completed!"); } } catch (Exception ex) { // Ä̾ï¤Î¥¨¥é¡¼½èÍý Debug.LogError($"An error occurred: {ex.Message}"); } } }
¥¥ã¥ó¥»¥ë¤Ï SuppressCancellationThrow ¥á¥½¥Ã¥É¤ÎÌá¤êÃͤÇȽÄꤷ¡¢Îã³°¤ÏÄ̾ï¤Î try-catch ¤Ç½èÍý¤·¤Þ¤¹¡£¤³¤ì¤Ë¤è¤ê¡¢¥¥ã¥ó¥»¥ë¤È¥¨¥é¡¼¤òÌÀ³Î¤Ëʬ¤±¤Æ´ÉÍý¤Ç¤¤Þ¤¹¡£
¡¡¥³¥ë¡¼¥Á¥ó¤Î½èÍý¤È¤Ï½èÍý¹½Â¤Åª¤Ë°Û¤Ê¤ë¤¿¤á¡¢Æ±¤¸¤è¤¦¤Ëµ½Ò¤·¤Æ¤â¡¢ÁÛÄꤷ¤Æ¤¤¤ëÄ̤ê¤ËÆ°¤«¤Ê¤¤¥±¡¼¥¹¤¬¤¢¤ê¤Þ¤¹¡£
await = yield return StartCoroutine ¤ÎÃÖ¤´¹¤¨¤òǰƬ¤Ë¤ª¤¡¢yield return ¤Ê¤·¤Î StartCoroutine ¤Î¾ì¹ç¤Ë¤Ï await ¤ò»È¤ï¤º¤Ë Forget ¥á¥½¥Ã¥É¤òŬÍѤ¹¤ë¤è¤¦¤Ë¤·¤ÆÂбþ¤·¤Æ¤¯¤À¤µ¤¤¡£
¡¡UniTask ¤Î¥¨¥é¡¼¥Ï¥ó¥É¥ê¥ó¥°¤Ë¤Ï¡¢Î㳰ȯÀ¸»þ¤Î¥¹¥¿¥Ã¥¯¥È¥ì¡¼¥¹¤òµ½Ò¤·¤Æ¤¯¤À¤µ¤¤¡£
¡¡UniTask.Void ¤ÎÍøÍѤϿµ½Å¤Ë¹Ô¤¤¡¢Forget() ¤ò»È¤¦¾ì¹ç¤ÏÎã³°½èÍý¤òÁȤ߹þ¤ó¤Ç¤¯¤À¤µ¤¤¡£
¡¡¤½¤·¤Æ CancellationToken ¤òŬÀڤ˰·¤¤¡¢½èÍý¤Î¥¥ã¥ó¥»¥ë¤ò³Îǧ¤¹¤ë¥Æ¥¹¥È¥±¡¼¥¹¤òÍÑ°Õ¤·¤Þ¤·¤ç¤¦¡£
¡¡UniTask ¤ÎÍøÍѤϸúΨŪ¤Ç¤¹¤¬¡¢Å¬Àڤ˥¥ã¥ó¥»¥ë½èÍý¤ò´ÉÍý¤·¤Ê¤¤¤È¥á¥â¥ê¥ê¡¼¥¯¤Î¸¶°ø¤È¤Ê¤ê¤Þ¤¹¡£
¡¡¤Þ¤¿¡¢Addressables »ÈÍÑ»þ¤Ï¥¢¥»¥Ã¥È¤Î¥ê¥ê¡¼¥¹½èÍý¤â˺¤ì¤º¤Ë¼ÂÁõ¤·¤Þ¤·¤ç¤¦¡£
¡¡¤³¤Îµ»ö¤Ç¤Ï¡¢UniTask¤òÍѤ¤¤¿Unity¤Ç¤ÎÈóƱ´ü½èÍý¤Î´ðÁäˤĤ¤¤Æ²òÀ⤷¤Þ¤·¤¿¡£
UniTask¤ò»ÈÍѤ¹¤ë¤³¤È¤Ç¡¢¥³¥ë¡¼¥Á¥ó¤Î´ÉÍý¤¬¤è¤êÍưפˤʤꡢ¥³¡¼¥É¤âľ´¶Åª¤Ë¤Ê¤ê¤Þ¤¹¡£
CancellationToken¤òÍѤ¤¤ÆÈóƱ´ü½èÍý¤ò¥¥ã¥ó¥»¥ë¤¹¤ëÊýË¡¤ä¡¢DOTween¤È¤ÎÏ¢·ÈÊýË¡¤Ë¤Ä¤¤¤Æ¤âÀâÌÀ¤·¤Þ¤·¤¿¡£
¡¡ÈóƱ´ü½èÍý¤ÏUnity¤Î¥Ñ¥Õ¥©¡¼¥Þ¥ó¥¹¤ò¸þ¾å¤µ¤»¤ë¶¯ÎϤʥġ¼¥ë¤Ç¤¢¤ê¡¢UniTask¤Ï¤½¤Î¼ÂÁõ¤ò½õ¤±¤ë½ÅÍפʥ饤¥Ö¥é¥ê¤Ç¤¹¡£
¤·¤«¤·¡¢ÈóƱ´ü½èÍý¤ÏÎã³°¤ò¤¦¤Þ¤¯¥Ï¥ó¥É¥ê¥ó¥°¤¹¤ë¤³¤È¤¬µá¤á¤é¤ì¤ë¤¿¤á¡¢¥¨¥é¡¼¥Ï¥ó¥É¥ê¥ó¥°¤Î½èÍý¤òŬÀڤ˻ÈÍѤ¹¤ë¤³¤È¤ò˺¤ì¤Ê¤¤¤Ç¤¯¤À¤µ¤¤¡£
¡¡»²¹Í¤Ë¤µ¤»¤Æ¤¤¤¿¤À¤¤Þ¤·¤¿¡£¤¢¤ê¤¬¤È¤¦¤´¤¶¤¤¤Þ¤·¤¿¡£
Qiita @IShix ÍÍ
¡ÚUnity¡ÛUniTask Coroutine¤È¤Î°ã¤¤¤È¥¥ã¥ó¥»¥ë½èÍý¤ÎµóÆ°
https://qiita.com/IShix/items/dcf86cb5ca1b587a88ad
¤Ï¤Ê¤Á¤ë¤Î¥Þ¥¤¥Î¡¼¥È ÍÍ
¡ÚUniTask¡ÛSuppressCancellationThrow¤ò»È¤Ã¤Æ¥¥ã¥ó¥»¥ë¤òÊÖ¤êÃͤȤ·¤Æ¼è¤ê½Ð¤¹
https://www.hanachiru-blog.com/entry/2021/07/01/22...
¤æ¤ë¥æ¥Ë ÍÍ
¡ÚUnity¡Ûʬ¤«¤ê¤ä¤¹¤¤UniTask¤Î¥¥ã¥ó¥»¥ëÊýË¡¤Þ¤È¤á¡ª
https://yuru-uni.com/2024/04/06/unitask_cancel/
- ¥«¥Æ¥´¥ê¡§
- ¿Ê³Ø/¥¹¥¯¡¼¥ë
- ¥×¥í¥°¥é¥ß¥ó¥°
¥³¥á¥ó¥È¤ò¤«¤¯