Unity¤Ë´ØÏ¢¤¹¤ëµ­»ö¤Ç¤¹

ÈóƱ´ü½èÍý¤È¤Ï


¡¡ÈóƱ´ü½èÍý¤Ï¡¢¥×¥í¥°¥é¥à¤¬Ê£¿ô¤Î¥¿¥¹¥¯¤òÊÂÎó¤Ë½èÍý¤¹¤ë¼êË¡¤Î°ì¤Ä¤Ç¤¹¡£
Î㤨¤Ð¡¢½Å¤¤½èÍý¤ò¹Ô¤¦¥¿¥¹¥¯¤òÊ̤Υ¹¥ì¥Ã¥É¤Ç¼Â¹Ô¤·¡¢¥á¥¤¥ó¥¹¥ì¥Ã¥É¤Ï¥æ¡¼¥¶¡¼¥¤¥ó¥¿¡¼¥Õ¥§¡¼¥¹¤Î¹¹¿·¤Ê¤É¤ËÀìÇ°¤¹¤ë¤È¤¤¤Ã¤¿»È¤¤Êý¤¬¤¢¤ê¤Þ¤¹¡£
¤³¤ì¤Ë¤è¤ê¡¢¥×¥í¥°¥é¥à¤Î±þÅúÀ­¤òÊݤÁ¤Ä¤Ä¡¢¸úΨŪ¤ËÊ£¿ô¤Î¥¿¥¹¥¯¤ò¿Ê¹Ô¤µ¤»¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£


¥³¥ë¡¼¥Á¥ó


¡¡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¤È¤Ï


¡¡UniTask¤Ï¡¢Unity¸þ¤±¤ÎÈóƱ´ü½èÍý¥é¥¤¥Ö¥é¥ê¤Ç¡¢Unity¤Î¥³¥ë¡¼¥Á¥ó¤ò¤è¤ê¸úΨŪ¤«¤ÄÊØÍø¤Ë»È¤¦¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£
Æäˡ¢async/await¥Ñ¥¿¡¼¥ó¤ò³èÍѤ¹¤ë¤³¤È¤Ç¡¢ÈóƱ´ü¤Î¥í¥¸¥Ã¥¯¤òľ´¶Åª¤Ëµ­½Ò¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£


UniTask¤ò»È¤Ã¤¿¥³¥ë¡¼¥Á¥ó½èÍý¤ÎÃÖ¤­´¹¤¨


¡¡°Ê²¼¤Ï¡¢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 ¤ÎÈæ³Ó


¡¡¤½¤ì¤¾¤ì¤ÎÆÃħ¤ò¸µ¤ËÈæ³Ó¤·¤Æ¤ß¤Þ¤·¤ç¤¦¡£
ÆÃħ¥³¥ë¡¼¥Á¥ó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 ¤Î½èÍý¤ò½ñ¤¤¤Æ¤·¤Þ¤¦¤È¡¢º£¤Þ¤Ç¤È¤ÏµÕ¤Î½èÍý¤Î±¿ÍѤȤʤê¤Þ¤¹¡£


UniTask¤ÈCancellationToken


¡¡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¥á¥½¥Ã¥É¤¬¸Æ¤Ð¤ì¤ë¤È¡¢¤¹¤Ù¤Æ¤ÎÈóƱ´ü½èÍý¤¬¥­¥ã¥ó¥»¥ë¤µ¤ì¤Þ¤¹¡£


UniTask¤òÍѤ¤¤¿ÈóƱ´ü½èÍý¤Î¥¨¥é¡¼¥Ï¥ó¥É¥ê¥ó¥°


¡¡ÈóƱ´ü½èÍý¤Ç¤Ï¡¢Îã³°¤¬È¯À¸¤¹¤ë²ÄǽÀ­¤¬¾ï¤Ë¸ºß¤·¤Þ¤¹¡£
¤³¤Î¾ì¹ç¡¢¤¤¤¯¤Ä¤«¤ÎÊýË¡¤òÍøÍѤ·¤Æ¡¢Îã³°¤òŬÀڤ˥ϥó¥É¥ê¥ó¥°¤¹¤ë¤³¤È¤¬½ÅÍפǤ¹¡£
ÆÃ¤Ë CancellationToken¤¬¥­¥ã¥ó¥»¥ë¤µ¤ì¤¿¤È¤­¤ÏOperationCanceledException¤¬¥¹¥í¡¼¤µ¤ì¤Þ¤¹¤Î¤Ç¡¢¥Ï¥ó¥É¥ê¥ó¥°¤·¤Æ¤¤¤Ê¤¤¤È¥¨¥é¡¼¤È¤·¤ÆÄä»ß¤·¤Æ¤·¤Þ¤¤¤Þ¤¹¡£

¡¡°Ê²¼¤Ë¡¢ÈóƱ´ü½èÍý¤Î¥¨¥é¡¼¥Ï¥ó¥É¥ê¥ó¥°¤ÎÎã¤ò¼¨¤·¤Þ¤¹


£±¡¤try/catch¥Ö¥í¥Ã¥¯¤ò»ÈÍѤ·¤¿Îã


¡¡ºÇ¤â°ìÈÌŪ¤ÊÊýË¡¤Ç¤¹¡£
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 ¥á¥½¥Ã¥É¤òÍøÍѤ·¤¿ÊýË¡


¡¡Àè¤Û¤É¤Î³Æ¥×¥í¥»¥¹¤Î¸Æ¤Ó½Ð¤·¤Ë .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


¡¡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);

¡¡Ê£¿ô¤Î½ñ¼°¤¬¤¢¤ë¾ì¹ç¡¢µ­½Ò¤Ë°ì´ÓÀ­¤ò»ý¤¿¤»¤ë¤³¤È¤¬¤Ç¤­¤ì¤Ð¤É¤Î½èÍý¤òÍøÍѤ·¤Æ¤âÌäÂꤢ¤ê¤Þ¤»¤ó¡£


£²¡¥SuppressCancellationThrow ¥á¥½¥Ã¥É¤òÍøÍѤ·¤¿¾ì¹ç


¡¡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 ¤Ç½èÍý¤·¤Þ¤¹¡£
¤³¤ì¤Ë¤è¤ê¡¢¥­¥ã¥ó¥»¥ë¤È¥¨¥é¡¼¤òÌÀ³Î¤Ëʬ¤±¤Æ´ÉÍý¤Ç¤­¤Þ¤¹¡£


UniTask ÍøÍѤÎÃí°ÕÅÀ


¡¡¥³¥ë¡¼¥Á¥ó¤Î½èÍý¤È¤Ï½èÍý¹½Â¤Åª¤Ë°Û¤Ê¤ë¤¿¤á¡¢Æ±¤¸¤è¤¦¤Ëµ­½Ò¤·¤Æ¤â¡¢ÁÛÄꤷ¤Æ¤¤¤ëÄ̤ê¤ËÆ°¤«¤Ê¤¤¥±¡¼¥¹¤¬¤¢¤ê¤Þ¤¹¡£
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/

¥³¥á¥ó¥È¤ò¤«¤¯


¡Öhttp://¡×¤ò´Þ¤àÅê¹Æ¤Ï¶Ø»ß¤µ¤ì¤Æ¤¤¤Þ¤¹¡£

ÍøÍѵ¬Ìó¤ò¤´³Îǧ¤Î¤¦¤¨¤´µ­Æþ²¼¤µ¤¤

Menu


´ðÁÃ

µ»½Ñ/Ãμ±(¼ÂÁõÎã)

3D¥¢¥¯¥·¥ç¥ó¥²¡¼¥à

2D¤ª¤Ï¤¸¤­¥²¡¼¥à(ȯŸÊÔ)

2D¶¯À©²£¥¹¥¯¥í¡¼¥ë¥¢¥¯¥·¥ç¥ó(ȯŸÊÔ)

2D¥¿¥Ã¥×¥·¥å¡¼¥Æ¥£¥ó¥°(³ÈÄ¥ÊÔ)

¥ì¡¼¥¹¥²¡¼¥à(È´¿è)

2DÊüÃÖ¥²¡¼¥à(ȯŸÊÔ)

3D¥ì¡¼¥ë¥¬¥ó¥·¥å¡¼¥Æ¥£¥ó¥°(±þÍÑÊÔ)

3Dæ½Ð¥²¡¼¥à(È´¿è)

2D¥ê¥¢¥ë¥¿¥¤¥à¥¹¥È¥é¥Æ¥¸¡¼

3D¥¿¥Ã¥×¥¢¥¯¥·¥ç¥ó(NavMeshAgent »ÈÍÑ)

2D¥È¥Ã¥×¥Ó¥å¡¼¥¢¥¯¥·¥ç¥ó(¥«¥¨¥ë¤Î°Ù¤Ë¡Á¡¢¥Ü¥³¥¹¥«¥¦¥©¡¼¥ºÉ÷)

VideoPlayer ¥¤¥Ù¥ó¥ÈϢư¤Î¼ÂÁõÎã

VideoPlayer ¥ê¥¹¥ÈÆ⤫¤é¥à¡¼¥Ó¡¼ºÆÀ¸¤Î¼ÂÁõÎã(ȯŸ)

AR ²èÁüÉÕ¤­¥ª¥Ö¥¸¥§¥¯¥ÈÀ¸À®¤Î¼ÂÁõÎã

AR ¥ê¥¹¥ÈÆ⤫¤éÀ¸À®¤Î¼ÂÁõÎã(ȯŸ)

2D¥È¥Ã¥×¥Ó¥å¡¼¥¢¥¯¥·¥ç¥ó(¥µ¥Ð¥¤¥Ð¡¼É÷)

private



¤³¤Î¥µ¥¤¥ÈÆâ¤ÎºîÉʤϥæ¥Ë¥Æ¥£¤Á¤ã¤ó¥é¥¤¥»¥ó¥¹¾ò¹à¤Î¸µ¤ËÄ󶡤µ¤ì¤Æ¤¤¤Þ¤¹¡£

´ÉÍý¿Í/Éû´ÉÍý¿Í¤Î¤ßÊÔ½¸¤Ç¤­¤Þ¤¹