ºÇ½ª¹¹¿·¡§
orika_ex_miyako 2025ǯ11·î07Æü(¶â) 11:18:09ÍúÎò
¡¡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;
using System.Collections.Generic;
public class AsyncSpawner : MonoBehaviour {
public AssetReference prefabReference; // Addressables »²¾È¡£¥¤¥ó¥¹¥Ú¥¯¥¿¤Ç¥¢¥»¥Ã¥È¤ò»ØÄê²Äǽ¡£
public int spawnCount = 5;
public float spawnInterval = 1.0f; // À¸À®¸å¤ËÂÔµ¡¤¹¤ëÉÃ
public float timeMs = 2.0f; // ¥ß¥êÉÃ
private List<GameObject> spawnedObjectList = new();¡¡// À¸À®¤·¤¿¥¤¥ó¥¹¥¿¥ó¥¹¤ò´ÉÍý¤¹¤ë¥ê¥¹¥È
private void Start() {
¡¡¡¡¡¡¡¡// SuppressCancellationThrow ¤ò»ØÄꤹ¤ë¤³¤È¤Ç¡¢Destroy »þ¤Î¥¥ã¥ó¥»¥ë¤ò°ÂÁ´¤Ë̵»ë¤Ç¤¤Þ¤¹
SpawnObjectsAsync(destroyCancellationToken).Forget(SuppressCancellationThrow: true);
}
private async UniTaskVoid SpawnObjectsAsync(CancellationToken cancellationToken) {
for (int i = 0; i < spawnCount; i++) {
// ¥¥ã¥ó¥»¥ë¥Á¥§¥Ã¥¯
cancellationToken.ThrowIfCancellationRequested();
// È󯱴ü½èÍý¤Ë¤è¤ëÀ¸À®½èÍý¤Î¼Â¹Ô¡¡¡È󯱴ü¥í¡¼¥É ¡õ À¸À®¤ò¹Ô¤¦¡£
AsyncOperationHandle<GameObject> handle = prefabReference.InstantiateAsync();
¡¡¡¡¡¡¡¡¡¡¡¡// È󯱴ü½èÍý¤Ë¤è¤ëÀ¸À®½èÍý¤Î¼Â¹Ô¢¡¡È󯱴ü¥í¡¼¥É ¡õ À¸À®¤ò¹Ô¤¦¡£
AsyncOperationHandle<GameObject> handle = Addressables.InstantiateAsync(prefabReference);
// SetIntegrationTimeMS ¤òÍøÍѤ·¤Æ Awake ¼Â¹Ô¥¿¥¤¥ß¥ó¥°¤òÀ©¸æ
AsyncInstantiateOperation.SetIntegrationTimeMS(timeMs);
// Addressables ¤Î¥í¡¼¥É´°Î»¡¢À¸À®´°Î»¤Þ¤ÇÂÔµ¡
GameObject instance = await handle.Task;
// ÇÛÃ֤Ƚé´ü²½
instance.transform.position = new Vector3(i * 2, 0, 0);
// ¸å¤Ç²òÊü¤Ç¤¤ë¤è¤¦¥ê¥¹¥È¤ËÄɲÃ
spawnedObjectList.Add(instance);
// »ØÄê´Ö³Ö¤ÇÂÔµ¡
await UniTask.Delay(System.TimeSpan.FromSeconds(spawnInterval), cancellationToken: cancellationToken);
}
}
¡¡¡¡private void OnDestroy()
{
// À¸À®¤·¤¿¥¤¥ó¥¹¥¿¥ó¥¹¤ò¤¹¤Ù¤Æ²òÊü
// Addressables.InstantiateAsync ¤ÇÀ¸À®¤µ¤ì¤¿¥ª¥Ö¥¸¥§¥¯¥È¤Ï Destroy ¤Ç¤Ï¤Ê¤¯ ReleaseInstance ¿ä¾©
foreach (var obj in spawnedObjectList)
{
if (obj != null) {
// ¡¤ÎÊýË¡¤ÇÀ¸À®¤·¤Æ¤¤¤ë¾ì¹ç¤Î²òÊüÊýË¡
prefabReference.ReleaseInstance(obj);
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡// ¢¤ÎÊýË¡¤ÇÀ¸À®¤·¤Æ¤¤¤ë¾ì¹ç¤Î²òÊüÊýË¡
Addressables.ReleaseInstance(obj);
}
}
spawnedObjectList.Clear();
}
}
¡¡public AssetReference prefabReference; ¤ÎÀë¸À¤Ç¤¹¤¬¡¢¤³¤Î·¿»ØÄê¤ÏÈÆÍÑŪ¤Ê»ØÄê¤Ç¤¹¡£¤½¤Î¤¿¤á¡¢¤É¤Î¤è¤¦¤Ê¥Ç¡¼¥¿·¿¤Ç¤â¥¢¥µ¥¤¥ó¤Ç¤¤Þ¤¹¡£
AssetReferenceGameObject ·¿¤âÍѰդµ¤ì¤Æ¤ª¤ê¡¢¥¢¥µ¥¤¥ó¤Ç¤¤ë·¿¤ò¥×¥ì¥Ï¥Ö(GameObject ·¿)¤Ë¸ÂÄꤷ¤ÆÌäÂê¤Ê¤¤¤Î¤Ç¤¢¤ì¤Ð¡¢¤³¤Á¤é¤ÎÀë¸À¤ÎÊý¤¬·¿°ÂÁ´¤Ç¤¹¡£
¡¡MonoBehaviour.destroyCancellationToken ¤Ï MonoBehaviour ¤¬ÇË´þ¤µ¤ì¤¿¤È¤¤ËȯÀ¸¤¹¤ë¥¥ã¥ó¥»¥ë¥È¡¼¥¯¥ó¤Ç¤¹¡£
Unity 2022.2 °Ê¹ß¤Þ¤¿¤Ï 6000.0 °Ê¹ß¤ÇÍøÍѤǤ¤Þ¤¹¡£
¡¡Addressables.InstantiateAsync() ¤Ï¡¢¥í¡¼¥É¤È¥¤¥ó¥¹¥¿¥ó¥¹²½¤òƱ»þ¤Ë¹Ô¤¦ÊØÍø¤Ê¥á¥½¥Ã¥É¤Ç¤¹¡£
¤¿¤À¤·¡¢Addressables ¤ò»öÁ°¥í¡¼¥É¤·¤Æ¤ª¤¤¤Æ»È¤¤²ó¤¹¾ì¹ç¤Ï Addressables.LoadAssetAsync ¢ª Instantiate ¤ÎÊý¤¬¸úΨŪ¤Ç¤¹¡£
¡¡ReleaseInstance() ¤Ï¡ÖAddressables.InstantiateAsync ¤ÇÀ¸À®¤·¤¿¥ª¥Ö¥¸¥§¥¯¥È¡×ÀìÍѤβòÊü´Ø¿ô¤Ê¤Î¤Ç¡¢ÉáÄ̤ΠInstantiate ¤È¤Ï°·¤¤¤¬°Û¤Ê¤ê¤Þ¤¹¡£
»²¹Í¥µ¥¤¥È
Unity ¸ø¼°¥¹¥¯¥ê¥×¥È¥ê¥Õ¥¡¥ì¥ó¥¹
MonoBehaviour.destroyCancellationToken
https://docs.unity3d.com/ja/2023.1/ScriptReference...
Unity ¸ø¼°¥Þ¥Ë¥å¥¢¥ë
Method InstantiateAsync
https://docs.unity3d.com/ja/Packages/com.unity.add...
Unity ¸ø¼°¥Þ¥Ë¥å¥¢¥ë
Method ReleaseInstance
https://docs.unity3d.com/ja/Packages/com.unity.add...
¡¡ºÇ½é¤Î£±¤ÄÌܤÎÀ¸À®¤À¤±Æ±´üŪ¤ËÀ¸À®¤·¡¢£²¤ÄÌܤÎÀ¸À®°Ê¹ß¤ÏÈ󯱴ü¤ÇÀ¸À®¤¹¤ëÊýË¡¤ò¾Ò²ð¤·¤Þ¤¹¡£
¡¡¤¿¤È¤¨¤Ð²èÌ̤κǽé¤Ëɽ¼¨¤¹¤ë¥ª¥Ö¥¸¥§¥¯¥È¤Î¤ß¤òÀ¸À®¤·¤Æ¤ª¤¤¤Æ¡¢£²¤ÄÌܰʹߤϽ缡΢¦¤ÇÀ¸À®¤µ¤ì¤ì¤Ð´Ö¤Ë¹ç¤¦¤è¤¦¤Ê¥±¡¼¥¹¤òÁÛÄꤷ¤Æ¤¤¤Þ¤¹¡£
Ê£¿ô¤Î¥ª¥Ö¥¸¥§¥¯¥È¤ò¤Þ¤È¤á¤ÆÀ¸À®¤·¤Æ²èÌ̤¬»ß¤Þ¤Ã¤Æ¸«¤¨¤Æ¤·¤Þ¤¦¤è¤¦¤Ê¾ì¹ç¤Ë¤Ï¸ú²ÌŪ¤Ç¤¹¡£
using UnityEngine;
using Cysharp.Threading.Tasks;
using System.Threading;
using System.Collections.Generic;
public class AsyncViewSpawner : MonoBehaviour {
¡¡¡¡public View viewPrefab; // ¼«ºî¥¯¥é¥¹¤ò¥¢¥¿¥Ã¥Á¤·¤Æ¤¢¤ë¥×¥ì¥Ï¥Ö
public Transform viewTran; // À¸À®°ÌÃÖ
public int spawnCount = 5;
public float spawnInterval = 1.0f;
private List<View> viewList = new();
private void Start() {
await CreateViewAsync(destroyCancellationToken).Forget();
}
/// <summary>
/// View ¤òÀ¸À®¤¹¤ë¡Ê1¤ÄÌܤòƱ´ü¤ÇÂÔµ¡¡¢2¤ÄÌܰʹߤòÈ󯱴ü¤ÇÊÂÎó¼Â¹Ô¡Ë
/// </summary>
protected async UniTask CreateViewAsync(CancellationToken cancellationToken) {
// View ¤ÎÀ¸À®¤ÈÀßÄê
for (int i = 0; i < spawnCount; i++) {
int index = i;
// È󯱴üÀ¸À®(À¸À®¤Ï£±¤Ä¤Ç¤¢¤Ã¤Æ¤âÇÛÎó¤Ç¼õ¤±¼è¤ë)
UniTask<View[]> createTask = InstantiateAsync(viewPrefab, viewTran).ToUniTask(); // worldPositionStays: false ¤Î»ØÄêÉÔÍ×
// ºÇ½é¤Î£±¤ÄÌܤΤß
if (index == 0) {
// Ʊ´ü¤ÇÈ󯱴üÀ¸À®¤¬½ª¤ë¤Þ¤ÇÂÔµ¡
View[] viewArray = await createTask;
// ÂÔµ¡¸å¡¢À¸À®¤µ¤ì¤¿¥ª¥Ö¥¸¥§¥¯¥È¤ò¼è¤ê½Ð¤¹
View view = viewArray[0];
// ɬÍפ˱þ¤¸¤Æ½é´üÀßÄê¤ÈÇÛÃÖ°ÌÃÖÀßÄê
view.SetUpView();
view.transform.localPosition = Vector3.zero;
viewList.Add(view);
} else {
// £²¤ÄÌܰʹߤÏÈ󯱴ü¤ÇÀ¸À®
createTask.ContinueWith(viewArray => {
// È󯱴üÀ¸À®¸å¤Ë¥ª¥Ö¥¸¥§¥¯¥È¤ò¼è¤ê½Ð¤¹
View view = viewArray[0];
// ɬÍפ˱þ¤¸¤Æ½é´üÀßÄê¤ÈÇÛÃÖ°ÌÃÖÀßÄê
view.SetUpView();
view.transform.localPosition = Vector3.zero;
viewList.Add(view);
return UniTask.CompletedTask; // UniTask¥Ð¡¼¥¸¥ç¥ó¤ÎÌá¤êÃÍ
}).AttachExternalCancellation(cancellationToken).Forget();
}
}
}
}
¡¡Æ±´üÀ¸À®Æâ¤Î½èÍý¤ÈÈ󯱴üÀ¸À®¤Î½èÍý¤Ç½ÅÊ£¤·¤Æ¤¤¤ë½èÍý¤¬¤¢¤ê¤Þ¤¹¤Î¤Ç¡¢¥á¥½¥Ã¥É²½¤ò¸¡Æ¤¤¹¤ë¤È¤è¤ê¤è¤¤¥³¡¼¥É¤Ë¤Ê¤ê¤Þ¤¹¡£
/// <summary>
/// À¸À®¸å¤Î½é´üÀßÄê¤È¥ê¥¹¥ÈÅÐÏ¿
/// </summary>
private void InitializeView(View view) {
view.SetUpView();
view.transform.localPosition = Vector3.zero;
viewList.Add(view);
}
¡¡¤Þ¤¿¥ª¥Ö¥¸¥§¥¯¥È¥×¡¼¥ë¤È°ì½ï¤ËÍøÍѤ¹¤ë¤³¤È¤ÇºÆÍøÍÑÀ¤â¹â¤Þ¤ê¤Þ¤¹¡£
¡¡¤³¤Îµ»ö¤Ç¤Ï¡¢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...
LIGHT11 ÍÍ
¡ÚUniTask¡Û¥¥ã¥ó¥»¥ë»þ¤ËÎã³°¤òȯÀ¸¤µ¤»¤º¤Ë¥Ï¥ó¥É¥ê¥ó¥°¤Ç¤¤ëSuppressCancellationThrow¤Î»È¤¤Êý
https://light11.hatenadiary.com/entry/2025/04/17/1...
- ¥«¥Æ¥´¥ê¡§
- ¿Ê³Ø/¥¹¥¯¡¼¥ë
- ¥×¥í¥°¥é¥ß¥ó¥°




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