¡¡¤³¤ÎÉôʬ¤Î½èÍý¤Îή¤ì¤â¤¤¤Þ¤Þ¤Ç¤ÈƱ¤¸¤Ç¤¹¡£
¥Õ¥¡¥ß¥³¥ó¤Ç¤¢¤ì¤Ð¡¢
¥½¥Õ¥È¤Î¼ïÎà¤ÏÃΤé¤Ê¤¤¤â¤Î¤Î¡¢¥Õ¥¡¥ß¥³¥ó¤Î¥½¥Õ¥È¤Ç¤¢¤ì¤Ðµ¯Æ°¤Ï¤¹¤ë¤È¤¤¤¦¥¤¥á¡¼¥¸¤Ç¤¹¡£
¤½¤Î¤¿¤á¡¢¤³¤Î¥¯¥é¥¹¤Î¥¢¥¿¥Ã¥ÁÀè¤âƱ¤¸¤Ç¤¹¡£
¡¡¤¿¤À¤·¡¢¼Â¹Ô¤¹¤ëÊÑ¿ô¤Î·¿¤¬ GameEventBase ¥¯¥é¥¹¤Ç¤Ï¤Ê¤¯¡¢IGameEvent ·¿¤Î¥¤¥ó¥¿¡¼¥Õ¥§¡¼¥¹¤Ç¤¢¤ì¤Ð¼Â¹Ô¤Ç¤¤ë¤è¤¦¤Ë½èÍý¤òÄɲ䷤Ƥޤ¹¡£
¤½¤ì°Ê³°¤ÏƱ¤¸¤Ç¡¢GameEventHandler ¥¯¥é¥¹¤Ç¤Ï¼Â¹Ô¤¹¤ë GameEvent ¤Î¼ïÎà¤ÏÆÃÄꤷ¤Þ¤»¤ó¡£
º£¤Þ¤Ç¤ÈƱ¤¸¤è¤¦¤Ë¡¢º£²ó¤Ï ExecuteEventAsync ¥á¥½¥Ã¥É¤Î¿¶¤ëÉñ¤¤¤òÊѤ¨¤Æ¼Â¹Ô¤µ¤»¤Þ¤¹¡£
¡¡UniTask ¤òÍøÍѤ¹¤ë¤¿¤á¡¢¤ª¤è¤Ó¡¢Á°²ó¥¤¥ó¥Ý¡¼¥È¤·¤¿ Serializable Interface ¥¢¥»¥Ã¥È¤òÍøÍѤ¹¤ë¤¿¤á¡¢using ¤Ë£³¤Ä¤ÎÀë¸À¤òÄɲä·¤Þ¤¹¡£
<= ¥¯¥ê¥Ã¥¯¤¹¤ë¤È³«¤¤Þ¤¹¡£
using System.Collections;
using System.Threading;¡¡¡¡¡¡¡¡¡¡¡¡// ¡¡¢«¡¡Äɲä·¤Þ¤¹¡£CancellationToken ¤ò»È¤¦¤¿¤á¤ËɬÍ×¤Ê namespace ¤Ç¤¹¡£
using UnityEngine;¡¡¡¡
using Cysharp.Threading.Tasks;¡¡¡¡ // ¡¡¢«¡¡Äɲä·¤Þ¤¹¡£UniTask ¤ò»È¤¦¤¿¤á¤ËɬÍ×¤Ê namespace ¤Ç¤¹¡£
using TNRD; ¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ // ¡¡¢«¡¡Äɲä·¤Þ¤¹¡£Serializable Interface ¤ò»È¤¦¤¿¤á¤ËɬÍ×¤Ê namespace ¤Ç¤¹¡£
public class GameEventHandler : MonoBehaviour
{
//[SerializeField] private GameEventBase[] gameEvents;¡¡¡¡¡¡//¡¡¤½¤Î¤Þ¤Þ»Ä¤·¤Æ¤ª¤¤¤Æ¤â¤è¤¤¤Ç¤¹¤·¡¢¥³¥á¥ó¥È¥¢¥¦¥È¤Ç¤â HideInInspector °À¤òÉÕÍ¿¤·¤Æ¤â¤è¤¤¤Ç¤¹¡£
[SerializeField] private SerializableInterface<IGameEvent>[] gameEventInterface;¡¡¡¡//¡¡¢«¡¡Äɲä·¤Þ¤¹¡£
/// <summary>
/// ¥³¥ë¡¼¥Á¥ó¤Ë¤è¤ëÈóƱ´ü
/// </summary>
/// <returns></returns>
public IEnumerator ExecuteGameEventsCoroutine() {
int index = 0;
bool isSaveOn = false;
foreach (var gameEvent in gameEvents) {
IEnumerator gameEventCoroutine = gameEvent.ExecuteEventCoroutine();
yield return StartCoroutine(gameEventCoroutine);
// ¤³¤Î¥Õ¥é¥°¤òÆþ¤ì¤Ê¤¤¤È¡¢°ìÅÙ true ¤Ë¤Ê¤Ã¤¿¤¢¤È¤Ë false ¤ËÌᤵ¤ì¤ë²ÄǽÀ¤¬¤¢¤ë
if (!isSaveOn && gameEventCoroutine.Current != null) {
isSaveOn = (bool)gameEventCoroutine.Current;
}
Debug.Log($"¥¤¥Ù¥ó¥È {index} : ½ªÎ»");
index++;
}
yield return isSaveOn;
}
////*¡¡¤³¤³¤«¤é¥á¥½¥Ã¥É¤ò£±¤ÄÄɲá¡*////
/// <summary>
/// ÈóƱ´ü
/// </summary>
public async UniTask<bool> ExecuteGameEventsAsync(CancellationToken t) {
// NPC ¤Î MonoBehaviour ¤Ëɳ¤Å¤¯¥¥ã¥ó¥»¥ë¥È¡¼¥¯¥óºîÀ®
var token = this.GetCancellationTokenOnDestroy();
int index = 0;
bool isSaveOn = false;
foreach (var gameEvent in gameEvents) {
if (!token.IsCancellationRequested) {
// // ¥»¡¼¥Ö²Äǽ¤«³Îǧ¡£¤³¤Ã¤Á¤Ç¤âÆ°¤¯¤¬Ê¬¤«¤ê¤Ë¤¯¤¤
// if (isSaveOn) {
// // £±¤Ä¤Ç¤â¥»¡¼¥ÖÂоݤˤʤäƤ¤¤ì¤Ð¾å½ñ¤¤·¤Ê¤¤
// await gameEvent.ExecuteEventAsync(token);
// } else {
// // ¤Þ¤À¥»¡¼¥ÖÂоݤνèÍý¤¬Â¸ºß¤·¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢¥»¡¼¥ÖÂоݤ«¤É¤¦¤«¤ò¼Â¹Ô¸å¤Ë³Îǧ
// isSaveOn = await gameEvent.ExecuteEventAsync(token);
// }
// ¥¤¥Ù¥ó¥È¤ò¼Â¹Ô¤·¡¢¥»¡¼¥ÖÂоݤǤ¢¤ë¤«¤òÌá¤êÃͤǼèÆÀ
bool isSaveEvent = await gameEvent.ExecuteEventAsync(token);
// ¤Þ¤À¥»¡¼¥ÖÂоݤΥ¤¥Ù¥ó¥È¤¬Â¸ºß¤·¤Æ¤ª¤é¤º¡¢¤«¤Ä¡¢º£²ó¤Î¥¤¥Ù¥ó¥È¤¬¥»¡¼¥ÖÂоݤΥ¤¥Ù¥ó¥È¤Î¾ì¹ç
if (!isSaveOn && isSaveEvent) {
// ¥»¡¼¥Ö¤¹¤ë¤è¤¦¤Ë¤¹¤ë
isSaveOn = isSaveEvent;
}
// UniTask ¤ËÌá¤êÃͤ¬¤Ê¤¤¾ì¹ç¡¢¥¥ã¥ó¥»¥ë³Îǧ¤¬¤Ç¤¤ë
//bool canceled = await gameEvent.ExecuteEventAsync(token).SuppressCancellationThrow(); // ¥¥ã¥ó¥»¥ë¤µ¤ì¤¿¤é true ¤òÊÖ¤¹
// if (canceled) {
// Debug.Log("¥¥ã¥ó¥»¥ë¤µ¤ì¤¿");
// }
Debug.Log($"¥¤¥Ù¥ó¥È {index} : ½ªÎ»");
index++;
//Destroy(gameObject); // ¥¿¥¹¥¯Ãæ»ß¤Î¥Ç¥Ð¥Ã¥°ÍÑ
// token ¤Î¹¹¿·¤Î¤¿¤á1¥Õ¥ì¡¼¥àÂÔ¤Ä
await UniTask.Yield(); // token Æþ¤ì¤ë¤È¤³¤³¤Ç»ß¤Þ¤ê¡¢·ë²Ì¡¢°ÜÆ°ºÆ³«¤·¤Ê¤¯¤Ê¤ë
//Debug.Log(token.IsCancellationRequested); // ¥¿¥¹¥¯Ãæ»ß¤Î¥Ç¥Ð¥Ã¥°ÍÑ
}
}
// ¥»¡¼¥Ö¤ÎÍ̵¤òÌ᤹
return isSaveOn;
}
////*¡¡¤³¤³¤Þ¤Ç¡¡*////
}
¡¡¤¹¤Ç¤Ë GameEventHandler ¥¯¥é¥¹¤¬¥²¡¼¥à¥ª¥Ö¥¸¥§¥¯¥È¤Ë¥¢¥¿¥Ã¥Á¤µ¤ì¤Æ¤¤¤ë¤È»×¤¤¤Þ¤¹¤Î¤Ç¡¢¥¤¥ó¥¹¥Ú¥¯¥¿¡¼¤ò³Îǧ¤·¤Æ¤¯¤À¤µ¤¤¡£
SerializableInterface<IGameEvent> ·¿¤ÇÀë¸À¤·¤¿ GameEventInterface ÇÛÎóÊÑ¿ô¤¬¥¤¥ó¥¹¥Ú¥¯¥¿¡¼¤Ëɽ¼¨¤µ¤ì¤ë¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£
¥¤¥ó¥¹¥Ú¥¯¥¿¡¼²èÁü
¡¡¤³¤ÎÉôʬ¤Ë¡¢º£¤Þ¤Ç¥¢¥µ¥¤¥ó¤·¤Æ¤¤¤¿ GameEventBase ¤ÎÂå¤ï¤ê¤Ë IGameEvent ¥¤¥ó¥¿¡¼¥Õ¥§¡¼¥¹¤ò¼ÂÁõ¤·¤Æ¤¤¤ë¥¯¥é¥¹¤ò¥¢¥µ¥¤¥ó¤·¤Æ¥¤¥Ù¥ó¥È¤ò¼Â¹Ô¤µ¤»¤Þ¤¹¡£
¡¡½èÍý¤Î¼Â¹ÔÆâÍƤȤ·¤Æ¤ÏƱ¤¸Î®¤ì¤Ç¤¹¤¬¡¢¼Â¹Ô¤¹¤ë¤Þ¤Ç¤Î½èÍý¤Îµ½ÒÊýË¡¤¬ÊѤï¤ë¡¢¤È¤¤¤¦·Á¤Ë¤Ê¤ê¤Þ¤¹¡£