ºÇ½ª¹¹¿·¡§
orika_ex_miyako 2025ǯ02·î27Æü(ÌÚ) 16:51:07ÍúÎò
¡¡Unity ¤ÎÈóƱ´ü½èÍý¤ò°·¤¦ºÝ¤Ë¤Ï¡¢½¾Íè¤Î¥³¥ë¡¼¥Á¥ó¤Î¤Û¤«¤Ë C# ¤Î Task ¥Ù¡¼¥¹¤Î¥¢¥×¥í¡¼¥Á(async/await)¤òÍѤ¤¤ë¤³¤È¤¬¤Ç¤¤Þ¤¹¡£
¤³¤Îµ»ö¤Ç¤Ï¡¢UniTask ¤ò»ÈÍѤ·¤ÆÈóƱ´ü½èÍý¤ò´ÉÍý¤·¤Ä¤Ä¡¢InstantiateAsync ¤È AsyncInstantiateOperation.SetIntegrationTimeMS ¤òÁȤ߹ç¤ï¤»¤¿¥µ¥ó¥×¥ë¥³¡¼¥É¤ò¾Ò²ð¤·¤Þ¤¹¡£
¡¡¤Þ¤¿¡¢MonoBehaviour.destroyCancellationToken ¤ò³èÍѤ·¤¿¥¥ã¥ó¥»¥ë½èÍý¤Ë¤Ä¤¤¤Æ¤â²òÀ⤷¡¢¥³¥ë¡¼¥Á¥ó¤È¤Î°ã¤¤¤Ë¤Ä¤¤¤ÆÈæ³Ó¤·¤Þ¤¹¡£
¡¡UniTask ¤Ï¡¢Unity ¸þ¤±¤Î·ÚÎ̤ÊÈóƱ´ü½èÍý¥é¥¤¥Ö¥é¥ê¤Ç¤¹¡£
¡¡°Ê²¼¤ÎÆÃħ¤¬¤¢¤ê¤Þ¤¹¡£
¡¡¡¦ÈóƱ´ü¥¿¥¹¥¯¥Ù¡¼¥¹¤Î½èÍý´ÉÍý ¡¡¡¦¥³¥ë¡¼¥Á¥ó¤è¤ê¤â´Ê·é¤Ç½ÀÆð¤Êµ½Ò ¡¡¡¦Unity ¤ÎÆÃÄ굡ǽ¡ÊAsyncOperation ¤Ê¤É¡Ë¤ÈÏ¢·È
¡¡UniTask ¤ò¥×¥í¥¸¥§¥¯¥È¤ËƳÆþ¤¹¤ë¤Ë¤Ï¡¢°Ê²¼¤Î¼ê½ç¤ò¼Â¹Ô¤·¤Þ¤¹¡£
¡¡£±¡¥Unity Package Manager ¤ò³«¤¯¡£ ¡¡£²¡¥¥Ü¥¿¥ó¤«¤é "Add package from git URL..." ¤òÁªÂò¡£ ¡¡£³¡¥°Ê²¼¤Î URL ¤òÆþÎϤ·¤Æ¥¤¥ó¥¹¥È¡¼¥ë ¡¡¡¡¡¡https://github.com/Cysharp/UniTask.git?path=src/UniTask
¡¡ Unity 2022.3.20f1 ¤è¤ê¡¢ÈóƱ´ü½èÍý¤Ë¤è¤ëÀ¸À®¤¬²Äǽ¤Ê InstantiateAsync ¥á¥½¥Ã¥É¤¬Äɲ䵤ì¤Þ¤·¤¿¡£(¤Û¤«¤Ë¤â¤¤¤¯¤Ä¤«¤Î¥á¥½¥Ã¥É¤¬Äɲ䵤ì¤Æ¤¤¤Þ¤¹¡£)
Unity Releases
Unity 2022.3.20
https://unity.com/ja/releases/editor/whats-new/202...
¡¡¥×¥ì¥Ï¥Ö¤òÍøÍѤ·¤¿¥²¡¼¥à¥ª¥Ö¥¸¥§¥¯¥È¤ÎÀ¸À®¤Ï Instantiate ¥á¥½¥Ã¥É¤òÍøÍѤ·¤Æ¹Ô¤¤¤Þ¤¹¤¬¡¢¤³¤Î¾ì¹ç¡¢Ê£¿ô¤Î¥ª¥Ö¥¸¥§¥¯¥È¤ÎÀ¸À®¤ò¤Þ¤È¤á¤Æ¹Ô¤¦¤È¡¢½èÍý¤¬½Å¤¯¤Ê¤ë(²èÌ̤¬¥«¥¯¤Ä¤¯)¤³¤È¤¬ÌäÂê¤Ç¤·¤¿¡£
InstantiateAsync ¥á¥½¥Ã¥É¤ÏÈóƱ´ü½èÍý¤È¤·¤Æ¥×¥ì¥Ï¥Ö¤ÎÀ¸À®¤¬²Äǽ¤Ë¤Ê¤ë¤¿¤á¡¢¤³¤Î¥Ç¥á¥ê¥Ã¥È¤ò²óÈò¤·¤ÆÀ¸À®½èÍý¤ò¹Ô¤¦¤³¤È¤¬²Äǽ¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£
¡¡¤¿¤À¤·¡¢Ä̾ï¤Î Instantiate ¥á¥½¥Ã¥É¤è¤ê¤ÏÉé²Ù¤¬¹â¤¤¤¿¤á¡¢±¿ÍѤˤÏÃí°Õ¤¬É¬Íפˤʤê¤Þ¤¹¡£
¤Ä¤Þ¤ê¡¢Instantiate ¥á¥½¥Ã¥É¤òñ½ã¤Ë InstantiateAsync ¥á¥½¥Ã¥É¤ËÃÖ¤´¹¤¨¤ì¤Ð¤¤¤¤¡¢¤È¤¤¤¦¤ï¤±¤Ç¤Ï¤Ê¤¤¡¢¤È¤¤¤¦¤³¤È¤Ç¤¹¡£
Unity ¸ø¼°¥¹¥¯¥ê¥×¥È¥ê¥Õ¥¡¥ì¥ó¥¹
Object.InstantiateAsync
https://docs.unity3d.com/6000.0/Documentation/Scri...
¡¡
¡¡InstantiateAsync ¥á¥½¥Ã¥É¤òÍøÍѤ·¤Æ¥²¡¼¥à¥ª¥Ö¥¸¥§¥¯¥È¤ÎÀ¸À®¤ò¹Ô¤¦¤È¡¢À¸À®½èÍý¼«ÂΤÏÊÂÎó¤Ç¹Ô¤ï¤ì¤Þ¤¹¡£
¤½¤·¤ÆÀ¸À®¤µ¤ì¤¿¥²¡¼¥à¥ª¥Ö¥¸¥§¥¯¥È¤Ï¡¢¤½¤Î¤¢¤È¤Ë Awake ¥á¥½¥Ã¥É¤¬¸Æ¤Ð¤ì¤Þ¤¹¤¬¡¢¤³¤ì¤Ï¡¢¤Þ¤È¤á¤Æ¥á¥¤¥ó¥¹¥ì¥Ã¥É¤Ç¸Æ¤Ð¤ì¤Þ¤¹¡£
¡¡¤½¤Î¤¿¤áÂçÎ̤ËÀ¸À®¤ò¹Ô¤¦¤È¡¢¤¿¤È¤¨ÈóƱ´ü½èÍý¤Ç¤¢¤Ã¤Æ¤â Awake ¥á¥½¥Ã¥É¤¬ÂçÎ̤˽èÍý¤µ¤ì¤Æ¤·¤Þ¤Ã¤Æ¡¢·ë²ÌŪ¤Ë²¸·Ã¤ò¼õ¤±¤é¤ì¤Ê¤¤¾õ¶·¤¬È¯À¸¤·¤Þ¤¹¡£
¡¡¤½¤ì¤ò²óÈò¤¹¤ë¤¿¤á¡¢AsyncInstantiateOperation.SetIntegrationTimeMS ¥á¥½¥Ã¥É¤¬Äɲ䵤ì¤Æ¤¤¤Þ¤¹¡£
¤³¤ì¤Ï°ú¿ô¤Ç»ØÄꤷ¤¿¥ß¥êÉÿô¤òĶ¤¨¤ë¤È¡¢½ªÎ»¤·¤Æ¤¤¤Ê¤¤ Awake ¥á¥½¥Ã¥É¤Ï¡¢¼¡¤Î¥Õ¥ì¡¼¥à¤Ë¤Æ²ò·è¤µ¤ì¤ë¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£
Unity ¸ø¼°Æ°²è
¡ÚUnity¡ÛÈóƱ´ü¤Ë¥¤¥ó¥¹¥¿¥ó¥¹¤òÂçÎÌÀ¸À®¡ª¿· API "InstantiateAsync" ¤ò»È¤Ã¤Æ¤ß¤è¤¦¡ª
https://www.youtube.com/shorts/Q9K-3zkEijQ
Unity ¸ø¼°¥¹¥¯¥ê¥×¥È¥ê¥Õ¥¡¥ì¥ó¥¹
AsyncInstantiateOperation.SetIntegrationTimeMS
https://docs.unity3d.com/6000.0/Documentation/Scri...
¡¡°Ê²¼¤Ï¡¢Ä̾ï¤Î¥×¥ì¥Ï¥Ö¤ò»ÈÍѤ·¤Æ¥ª¥Ö¥¸¥§¥¯¥È¤ò°ìÄê´Ö³Ö¤ÇÀ¸À®¤·¡¢UniTask ¤Î¥¥ã¥ó¥»¥ë½èÍý¤â¼ÂÁõ¤·¤¿Îã¤Ç¤¹¡£
¥¥ã¥ó¥»¥ë½èÍý¤Ë¤Ä¤¤¤Æ¤Ï MonoBehaviour.destroyCancellationToken ¤òÍøÍѤ·¤Æ¤¤¤Þ¤¹¡£
Unity ¸ø¼°¥¹¥¯¥ê¥×¥È¥ê¥Õ¥¡¥ì¥ó¥¹
MonoBehaviour-destroyCancellationToken
https://docs.unity3d.com/ja/current/ScriptReferenc...
using UnityEngine; using Cysharp.Threading.Tasks; using System.Threading; public class AsyncSpawner : MonoBehaviour { [SerializeField] private GameObject prefab; [SerializeField] private int spawnCount = 10; [SerializeField] private float spawnInterval = 1.0f; private void Start() { SpawnObjectsAsync(destroyCancellationToken).Forget(); } private async UniTaskVoid SpawnObjectsAsync(CancellationToken cancellationToken) { for (int i = 0; i < spawnCount; i++) { // À¸À® GameObject instance = Instantiate(prefab); // ÇÛÃ֤Ƚé´ü²½ instance.transform.position = new Vector3(i * 2, 0, 0); // »ØÄê´Ö³Ö¤ÇÂÔµ¡ await UniTask.Delay(System.TimeSpan.FromSeconds(spawnInterval), cancellationToken: cancellationToken); } } }
¡¡¥³¡¼¥É¤Î¥Ý¥¤¥ó¥È¤È¤·¤Æ¤Ï¡¢À¸À®½èÍý¼«ÂΤÏƱ´ü½èÍý¤Ç¤¢¤ë Instantiate ¥á¥½¥Ã¥É¤òÍøÍѤ·¤Æ¤¤¤Þ¤¹¡£
¤Þ¤¿¡¢Addressables ¤ò»È¤ï¤º¡¢Ä¾ÀÜ¥×¥ì¥Ï¥Ö¤ò¥¤¥ó¥¹¥Ú¥¯¥¿¡¼¤«¤é»ØÄꤷ¤ÆÅÐÏ¿¤·¤Æ¤¤¤Þ¤¹¡£
¡¡¥¥ã¥ó¥»¥ë½èÍý¤Ë¤Ä¤¤¤Æ¤Ï¡¢destroyCancellationToken ¤ò»ÈÍѤ·¤Æ¡¢UniTask ¤¬ÇË´þ»þ¤ËÃæÃǤǤ¤ë¤è¤¦¤Ë¥Ï¥ó¥É¥ê¥ó¥°¤·¤Æ¤¤¤Þ¤¹¡£
¡¡ÈóƱ´ü½èÍý¤ÎÀ©¸æ¤Ë¤Ä¤¤¤Æ¤Ï¡¢¥³¥ë¡¼¥Á¥ó¤Ç¤Ï¤Ê¤¯ UniTask.Delay ¤òÍøÍѤ·¤Æ°ìÄê´Ö³Ö¤ÇÀ¸À®¤ò¹Ô¤Ã¤Æ¤¤¤Þ¤¹¡£
¡¡¾åµ¤ÈƱ¤¸½èÍý¤ò¥³¥ë¡¼¥Á¥ó¤Ç¼ÂÁõ¤¹¤ë¤È°Ê²¼¤Î¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£
Äɲä·¤¿¤ê¡¢½¤Àµ¤·¤¿Éôʬ¤À¤±¤òÈ´¿è¤·¤Þ¤¹¡£
using System.Collections; private void Start() { StartCoroutine(SpawnObjectsCoroutine); } private IEnumerator SpawnObjectsCoroutine() { for (int i = 0; i < spawnCount; i++) { GameObject instance = Instantiate(prefab); instance.transform.position = new Vector3(i * 2, 0, 0); yield return new WaitForSeconds(spawnInterval); } }
¡¡¤â¤·¤â¤³¤Î¥³¥ë¡¼¥Á¥ó¤ò¡¢¥²¡¼¥à¥ª¥Ö¥¸¥§¥¯¥È¤ÎÇË´þ°Ê³°¤Ç¤âÅÓÃæ¤ÇÄä»ß¤µ¤»¤¿¤¤¾ì¹ç¤Ë¤Ï¡¢¾åµ¤Î½èÍý¤Ç¤ÏÄä»ß¤Ç¤¤Þ¤»¤ó¡£
²¼µ¤Î¤è¤¦¤Ê¡¢ÊÑ¿ô¤Ë½èÍý¤òÂåÆþ¤¹¤ë·Á¤Ç½èÍý¤òºî¤ë¤³¤È¤Ç¡¢ÅÓÃæ¤ÇÄä»ß¤Ç¤¤ë¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£
¡¡½ñ¼°¤Ï°Û¤Ê¤ê¤Þ¤¹¤¬¡¢IEnumerator ·¿¤È Coroutine ·¿¤Î¤É¤Á¤é¤Ç¤âÂбþ¤Ç¤¤Þ¤¹¡£
private IEnumerator coroutine; private void Start() { coroutine = SpawnObjectsCoroutine(); StartCoroutine(SpawnObjectsCoroutine); } // ¥³¥ë¡¼¥Á¥ó¤òÅÓÃæ¤ÇÄä»ß¤¹¤ë¥á¥½¥Ã¥É public void StopSpawning() { StopCoroutine(spawnCoroutine); }
private Coroutine coroutine; private void Start() { coroutine = StartCoroutine(SpawnObjectsCoroutine); } // ¥³¥ë¡¼¥Á¥ó¤òÅÓÃæ¤ÇÄä»ß¤¹¤ë¥á¥½¥Ã¥É public void StopSpawning() { if (spawnCoroutine != null) { StopCoroutine(spawnCoroutine); spawnCoroutine = null; } }
¡¡°Ê²¼¤Ï¡¢Addressables ¤ò»ÈÍѤ·¤Æ¥ª¥Ö¥¸¥§¥¯¥È¤ò°ìÄê´Ö³Ö¤ÇÈóƱ´üŪ¤ËÀ¸À®¤·¡¢¥¥ã¥ó¥»¥ë½èÍý¤â¼ÂÁõ¤·¤¿Îã¤Ç¤¹¡£
¤³¤Á¤é¤Ç¤Ï InstantiateAsync ¥á¥½¥Ã¥É¤È AsyncInstantiateOperation.SetIntegrationTimeMS ¥á¥½¥Ã¥É¤òÍøÍѤ·¤Æ
ÈóƱ´ü½èÍý¤òÍøÍѤ·¤Æ¥ª¥Ö¥¸¥§¥¯¥È¤ÎÀ¸À®¤ò¹Ô¤Ã¤Æ¤¤¤Þ¤¹¡£
using UnityEngine; using Cysharp.Threading.Tasks; using System.Threading; using UnityEngine.AddressableAssets; using UnityEngine.ResourceManagement.AsyncOperations; public class AsyncSpawner : MonoBehaviour { public AssetReference prefabReference; public int spawnCount = 5; public float spawnInterval = 1.0f; // Éà public float timeMs = 2.0f; // ¥ß¥êÉà private void Start() { SpawnObjectsAsync(destroyCancellationToken).Forget(); } private async UniTaskVoid SpawnObjectsAsync(CancellationToken cancellationToken) { for (int i = 0; i < spawnCount; i++) { // ¥¥ã¥ó¥»¥ë¥Á¥§¥Ã¥¯ cancellationToken.ThrowIfCancellationRequested(); // ÈóƱ´ü½èÍý¤Ë¤è¤ëÀ¸À®½èÍý¤Î¼Â¹Ô AsyncOperationHandle<GameObject> handle = prefabReference.InstantiateAsync(); // SetIntegrationTimeMS ¤òÍøÍѤ·¤Æ Awake ¼Â¹Ô¥¿¥¤¥ß¥ó¥°¤òÀ©¸æ AsyncInstantiateOperation.SetIntegrationTimeMS(timeMs); // À¸À®´°Î»¤Þ¤ÇÂÔµ¡ GameObject instance = await handle.Task; // ÇÛÃ֤Ƚé´ü²½ instance.transform.position = new Vector3(i * 2, 0, 0); // »ØÄê´Ö³Ö¤ÇÂÔµ¡ await UniTask.Delay(System.TimeSpan.FromSeconds(spawnInterval), cancellationToken: cancellationToken); } } }
¡¡¤³¤Îµ»ö¤Ç¤Ï¡¢UniTask ¤ÈÄ̾ï¤Î¥×¥ì¥Ï¥Ö¤òÍøÍѤ·¤¿Æ±´ü¥ª¥Ö¥¸¥§¥¯¥È¤ÎÀ¸À®½èÍý¤È¡¢ÈóƱ´ü¥ª¥Ö¥¸¥§¥¯¥ÈÀ¸À®½èÍý¤Ë¤Ä¤¤¤Æ²òÀ⤷¤Þ¤·¤¿¡£
¡¡£±¡¥UniTask ¤òÍøÍѤ·¤¿ÈóƱ´ü½èÍý¤Ë¤è¤ê¡¢¥Õ¥ì¡¼¥à¥Ñ¥Õ¥©¡¼¥Þ¥ó¥¹¤ò°Ý»ý¡£ ¡¡£²¡¥½ÀÆð¤Ê¥¥ã¥ó¥»¥ë½èÍý¤ÎÁȤ߹þ¤ß¡£
¡¡¥ª¥Ö¥¸¥§¥¯¥È¤ÎÀ¸À®¤Ï¥³¥¹¥È¤Î¤«¤«¤ë½èÍý¤Ç¤¢¤ê¤Þ¤¹¤¬¡¢Æ±´üŪ¤ÊÀ¸À®½èÍý¤¬Å¬¤·¤Æ¤¤¤ë¤«¡¢¤¢¤ë¤¤¤ÏÈóƱ´ü½èÍý¤Ç¤âÌäÂ꤬¤Ê¤¤¤Î¤«¡¢
¤³¤ì¤é¤òŬÀڤʾìÌ̤ǻȤ¤Ê¬¤±¤ë¤³¤È¤Ç½ÀÆð¤Ê½èÍý¤ò¼ÂÁõ¤Ç¤¤ë¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£
¡¡ÆÃ¤Ë¥×¥í¥¸¥§¥¯¥È¤Ç¤ÎÈóƱ´ü½èÍý¤ÎºÇŬ²½¤ò¹Ô¤¦ºÝ¤Ë¤Ï¡¢¤³¤¦¤¤¤Ã¤¿Éôʬ¤òǰƬ¤Ë¤ª¤¤¤Æ¥Á¥ã¥ì¥ó¥¸¤·¤Æ¤ß¤Æ¤¯¤À¤µ¤¤¡£
¡¡»²¹Í¤Ë¤µ¤»¤Æ¤¤¤¿¤À¤¤Þ¤·¤¿¡£¤¢¤ê¤¬¤È¤¦¤´¤¶¤¤¤Þ¤·¤¿¡£
Zenn amp ÍÍ
¡ÚUnity¡ÛInstantiateAsync¤Î»È¤¤Êý¤È®ÅÙ¸¡¾Ú
https://zenn.dev/ambr_inc/articles/1636d59bdf8786
Hatena Blog MR¤¬³Ú¤·¤¤ ÍÍ
Unity¤ÇMonoBehaviour¤ÎÇË´þ¤ò¸¡ÃΤ¹¤ë¥¥ã¥ó¥»¥ë¥È¡¼¥¯¥ó¤ò»²¾È¤¹¤ë
https://bluebirdofoz.hatenablog.com/entry/2024/10/...
LIGHT11 ÍÍ
¡ÚUnity¡ÛUnity6¤«¤éÄɲ䵤줿¡ÖInstantiateAsync¡×¤Ç¥ª¥Ö¥¸¥§¥¯¥È¤òÈóƱ´üÀ¸À®¤¹¤ë
https://light11.hatenadiary.com/entry/2024/12/18/1...
- ¥«¥Æ¥´¥ê¡§
- ¿Ê³Ø/¥¹¥¯¡¼¥ë
- ¥×¥í¥°¥é¥ß¥ó¥°
¥³¥á¥ó¥È¤ò¤«¤¯