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

°ìÄê¤Î»þ´Ö¤¬·Ð²á¤¹¤ë¤È¥¤¥Ù¥ó¥È½àÈ÷¤¬À°¤¦¥±¡¼¥¹


¡¡UniTask¤ÈUniRx¤ò»ÈÍѤ·¤Æ Final Fantasy¤ÎATB¥²¡¼¥¸¤Î¤è¤¦¤Ê¡¢°ìÄê»þ´Ö¤¬·Ð²á¤¹¤ë¤È¥¤¥Ù¥ó¥È¤Î½àÈ÷¤¬À°¤¦¥·¥¹¥Æ¥à¤ò¼ÂÁõ¤¹¤ëÎã¤Ç¤¹¡£
¤³¤³¤Ç¤Ï¥Ü¥¿¥ó¤¬²¡¤»¤ë¤è¤¦¤Ë¤·¤Æ¤¤¤Þ¤¹¡£

¡¡£³²ó¤Ë¤ï¤±¤Æ°Û¤Ê¤ë³Ø½¬¤ò¹Ô¤¤¤Þ¤¹¤¬¡¢¤¹¤Ù¤ÆƱ¤¸½èÍý¤È¤·¤Æµ¡Ç½¤·¤Þ¤¹¡£
½ù¡¹¤ËÆñ¤·¤¯¤Ê¤Ã¤Æ¤¤¤­¤Þ¤¹¤Î¤Ç¡¢£±²ó¤Î³Ø½¬¤Ç¤¹¤Ù¤Æ¤ò³Ð¤¨¤è¤¦¤È¤¹¤ëɬÍפϤ¢¤ê¤Þ¤»¤ó¡£

¡¡¤Þ¤º¤Ï¤³¤Î¼ê½ç¤ÎÆâÍƤòÍý²ò¤·¤Æ¤«¤éÀè¤Ë¿Ê¤à¤è¤¦¤Ë¤·¡¢¤½¤Á¤é¤¬Æñ¤·¤¤¾ì¹ç¤Ë¤Ï¤Þ¤¿¤³¤Á¤é¤ËÌá¤Ã¤Æ¤­¤ÆÉü½¬¤·¤Æ¤ß¤Æ¤¯¤À¤µ¤¤¡£


¡ã¼ÂÁõÆ°²è¡ä
Æ°²è¥Õ¥¡¥¤¥ë¤Ø¤Î¥ê¥ó¥¯


À߷פȳµÍ×


¡¡Unity¤Ë¤ª¤¤¤Æ¡¢UI¤Îɽ¼¨¡¦Áàºî¤È¥²¡¼¥à¥·¥¹¥Æ¥à¤ÎÀ©¸æ¤È¤¤¤¦2¤Ä¤Îµ¡Ç½¤ÏÀÚ¤êÎ¥¤»¤Ê¤¤¤³¤È¤¬Â¿¤¤¤Ç¤¹¡£
Î㤨¤Ð¡¢¥²¡¼¥à¤Î¿Ê¹Ô¤Ë¹ç¤ï¤»¤ÆUI¤Îɽ¼¨¡¦Áàºî¤òÀ©¸æ¤¹¤ë¤è¤¦¤Êµ¡Ç½¤ò¼Â¸½¤¹¤ë¤Ë¤Ï¡¢UI¤ÎÁàºî¤Ë´Ø¤¹¤ë½èÍý¤È¥²¡¼¥à¥·¥¹¥Æ¥à¤Î¿Ê¹Ô¤Ë´Ø¤¹¤ë½èÍý¤ò¤¦¤Þ¤¯ÁȤ߹ç¤ï¤»¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£

¡¡º£²ó¤Ï¥¤¥Ù¥ó¥È½èÍý¤Î³Ø½¬¤òƧ¤Þ¤¨¤Æ¡¢¤Þ¤º¤Ï£±¤Ä¤Î¥¯¥é¥¹¤Ç½èÍý¤ò¼ÂÁõ¤·¤Þ¤¹¡£

¡¡¥¯¥é¥¹¤Ë¤Ä¤¤¤Æ¤â¡¢ÈóƱ´ü½èÍý¤ò¥³¥ë¡¼¥Á¥ó¥á¥½¥Ã¥É¤Ç¼ÂÁõ¤¹¤ë¥Ñ¥¿¡¼¥ó¤È¡¢UniRx ¤È¥ª¥Ö¥¶¡¼¥Ð¡¼¥Ñ¥¿¡¼¥ó¤òÍøÍѤ·¤Æ¼ÂÁõ¤¹¤ë¥Ñ¥¿¡¼¥ó¤Î£²¤Ä¤òºîÀ®¤·¤Þ¤¹¡£
UniRx ¤È¥ª¥Ö¥¶¡¼¥Ð¡¼¥Ñ¥¿¡¼¥ó¤Ë¤Ä¤¤¤Æ¤Ï¡¢¤µ¤é¤Ë¼¡¤Î¼ê½ç¤Ç MVP ¥Ñ¥¿¡¼¥ó¤È¤·¤Æ¤ÎºîÀ®ÊýË¡¤â³Ø½¬¤·¤Þ¤¹¡£
¡¡

ɬÍפʵ¡Ç½

¡¡
¡¡º£²ó¼ÂÁõ¤·¤¿¤¤½èÍý¤Ë¤ª¤¤¤Æ¤Ï¡¢°Ê²¼¤Î¤è¤¦¤Êµ¡Ç½¤ò»ý¤Ä¥¯¥é¥¹¤¬É¬ÍפǤ¹¡£

¡¡£±¡¥ATBÃͤνé´ü²½
¡¡£²¡¥¹¶·â¥Ü¥¿¥ó¤Î¥¯¥ê¥Ã¥¯¤Ë¤è¤ëATBÃͤΥꥻ¥Ã¥È
¡¡£³¡¥ATB¥²¡¼¥¸¤Îɽ¼¨¤Î UI ¹¹¿·
¡¡£´¡¥ATBÃͤβóÉü
¡¡£µ¡¥¹¶·â¥Ü¥¿¥ó¤Î¾õÂ֤ι¹¿·

¡¡¤É¤Î¤è¤¦¤Ê½èÍý¤Î¥í¥¸¥Ã¥¯¤ò¹½ÃÛ¤¹¤ì¤Ð¡¢¤³¤ì¤é¤Îµ¡Ç½¤ò¼Â¸½¤Ç¤­¤ë¤«¹Í¤¨¤Æ¤ß¤Æ¤¯¤À¤µ¤¤¡£
¡¡
¡¡¤¤¤º¤ì¤Î½èÍý¤âÌ©Àܤˤ«¤«¤ï¤Ã¤Æ¤¤¤Þ¤¹
¤Þ¤¿Î㤨¤Ð¡¢£´¤Î½èÍý¤òºî¤ë¤¿¤á¤Ë¤Ï¾¯¤Ê¤¯¤È¤â¡Ö¸½ºßÃÍ¡¢²óÉüÎÌ¡¢¾å¸ÂÃͤȤ¤¤Ã¤¿Ãͤò´ÉÍý¤¹¤ë¡×»ÅÁȤߤòºîÀ®¤¹¤ëɬÍפ¬¤¢¤ê¡¢
¡Ö¸½ºßÃͤϾå¸ÂÃͤòĶ¤¨¤Ê¤¤¤è¤¦¤ËÀ©¸æ¤¹¤ë¡×¤È¤¤¤Ã¤¿½èÍý¤ÎÆâÉô¤¬¸«¤¨¤Æ¤­¤Þ¤¹¡£



¡¡¤Ê¤ª½èÍý¤Î¥Ç¥Ð¥Ã¥°¤Ë¤¢¤¿¤ê¡¢UI ¤Ë¤Ä¤¤¤Æ¤ÏºÇÄã¸Â¤Î¤â¤Î¤Ç¤è¤¤¤Î¤Ç¼«ºî¤·¤Æ¤ª¤­¤Þ¤·¤ç¤¦¡£

¡¡Image ¤È Button ¤¬ÇÛÃÖ¤µ¤ì¤Æ¤¤¤ì¤ÐÂç¾æÉפǤ¹¡£


¥³¥ë¡¼¥Á¥ó¤òÍøÍѤ·¤¿¼ÂÁõÎã


¡¡Àè¤Û¤É¤Îµ¡Ç½¤Ë¤Ä¤¤¤Æ¡¢£±¤Ä¤Î¥¯¥é¥¹¤Ë¤Þ¤È¤á¤Æµ­½Ò¤·¤Æ¤ß¤Þ¤¹¡£

¡¡ºîÀ®¤¹¤ë¥¯¥é¥¹¤Ï ATBControllerCoroutine ¤Ç¤¹¡£
ÈóƱ´ü½èÍý¤Ë¥³¥ë¡¼¥Á¥ó¥á¥½¥Ã¥É¤òÍøÍѤ·¤Æ¥¤¥Ù¥ó¥È½èÍý¤òºîÀ®¤·¤Æ¤¤¤Þ¤¹¡£

¡¡¤Þ¤º¤Ï¤³¤Á¤é¤Ç½èÍý¤Î¹½À®¤òÍý²ò¤¹¤ë¤è¤¦¤Ë¤·¤Þ¤·¤ç¤¦¡£


ATBControllerCoroutine.cs

<= ¥¯¥ê¥Ã¥¯¤¹¤ë¤È³«¤­¤Þ¤¹¡£




¡¡³Æµ¡Ç½¤Ë¤Ä¤¤¤ÆÈÖ¹æ¤ò¿¶¤Ã¤Æ¤ª¤­¤Þ¤·¤¿¡£
¤É¤Î½èÍý¤¬¤É¤³¤Ë¼ÂÁõ¤µ¤ì¤Æ¤¤¤Æ¡¢¤É¤¦¤¤¤Ã¤¿¥í¥¸¥Ã¥¯¤Ë¤Ê¤Ã¤Æ¤¤¤ë¤Î¤«¤òÆɤ߲ò¤¤¤Æ¤ß¤Æ¤¯¤À¤µ¤¤¡£

¡¡¤Þ¤¿ AttackThreshold¡¢recoveryRate¤Ê¤É¤Î¥Ñ¥é¥á¡¼¥¿¤òÄ´À°¤¹¤ë¤³¤È¤Ç¡¢ATB¤ÎÆ°ºî¤òÄ´À°¤Ç¤­¤Þ¤¹¡£

¡¡¼ÂºÝ¤Ë¥²¡¼¥à¤ò¼Â¹Ô¤·¤ÆÆ°ºî¤Î¸¡¾Ú¤ò¹Ô¤¤¤Þ¤·¤ç¤¦¡£


UniRx ¤È¥ª¥Ö¥¶¡¼¥Ð¡¼¥Ñ¥¿¡¼¥ó¤òÍøÍѤ·¤¿¼ÂÁõÎã


¡¡Â³¤¤¤Æ¤Ï¡¢Àè¤Û¤É¤Î½èÍý¤ò UniRx ¤È¥ª¥Ö¥¶¡¼¥Ð¡¼¥Ñ¥¿¡¼¥ó¤òÍøÍѤ·¤Æ¼ÂÁõ¤·¤¿Îã¤òÄ󼨤·¤Þ¤¹¡£

¡¡Á°²óºîÀ®¤·¤¿¥¯¥é¥¹¤ò½¤Àµ¤¹¤ë¤Î¤Ç¤Ï¤Ê¤¯¡¢¿·¤·¤¯ ATBController ¥¯¥é¥¹¤òºîÀ®¤·¡¢Èæ³Ó¤Ç¤­¤ë¤è¤¦¤Ë¤·¤Æ¤¤¤Þ¤¹¡£
º£²ó¤âµ¡Ç½¤´¤È¤ÎÈÖ¹æ¤ò¿¶¤Ã¤Æ¤¢¤ê¤Þ¤¹¤Î¤Ç¡¢½èÍý¤òÆɤ߲ò¤¤¤Æ¤ß¤Æ¤¯¤À¤µ¤¤¡£


ATBController.cs

<= ¥¯¥ê¥Ã¥¯¤¹¤ë¤È³«¤­¤Þ¤¹¡£




¡¡¥³¥ë¡¼¥Á¥ó¤Ç¤Î¼ÂÁõ»þ¤Ë Start ¥á¥½¥Ã¥É¤Ëµ­½Ò¤·¤Æ¤¤¤¿
¥Ü¥¿¥ó¤Î¥¯¥ê¥Ã¥¯½èÍý¤È WaitTimer ¥á¥½¥Ã¥É¤Î½èÍý(ATB¤Î²óÉü½èÍý)¤ò¥Ü¥¿¥ó¤Î¥¯¥ê¥Ã¥¯½èÍý¤ò UniRx¤ÎObservable¤ò»È¤Ã¤Æ¼ÂÁõ¤·¤Æ¤¤¤Þ¤¹¡£

¡¡¤Þ¤¿¡¢¹¶·â¥Ü¥¿¥ó¤Î¾õÂÖ¤ò¹¹¿·¤¹¤ë¤¿¤á¤Ë¤Ï UniRx¤ÎReactiveProperty¤ò»È¤Ã¤Æ¤¤¤Þ¤¹¤Î¤Ç¡¢ResetATB¥á¥½¥Ã¥É¤â¡¢Ã±½ã¤ËATB¤ÎÃͤò¥ê¥»¥Ã¥È¤¹¤ë¤À¤±¤Î¼ÂÁõ¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£

¡¡Á´ÂÎŪ¤Ë¡¢UniRx¤ò»È¤Ã¤¿¥·¥ó¥×¥ë¤Ç¤ï¤«¤ê¤ä¤¹¤¤¥³¡¼¥É¤Ë¤Ê¤Ã¤Æ¤¤¤ë¤³¤È¤¬Ê¬¤«¤ê¤Þ¤¹¡£

¡¡¤³¤Á¤é¤â¼ÂºÝ¤Ë¥²¡¼¥à¤ò¼Â¹Ô¤·¤ÆÆ°ºî¤Î¸¡¾Ú¤ò¹Ô¤¤¤Þ¤·¤ç¤¦¡£


ATBController¤Î Update Æâ¤Î½èÍý¤Î¥ê¥Õ¥¡¥¯¥¿¥ê¥ó¥°


¡¡Àè¤Û¤É¤Î ATBController¤Î Update Æâ¤Î½èÍý¤ò UniRx ¤Î Observable ¤Ë¤·¤Æ´Ê·é¤Ë¼ÂÁõ¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£
¤½¤Î·ë²Ì¡¢Start ¥á¥½¥Ã¥ÉÆâ¤Ë¤ª¤¤¤Æ¡¢ATBÃͤνé´ü²½¡¢¥ê¥»¥Ã¥È¡¢¥²¡¼¥¸¤Îɽ¼¨¹¹¿·¡¢²óÉü¡¢¹¶·â¥Ü¥¿¥ó¤Î¾õÂÖ¹¹¿·¤Ê¤É¤Îµ¡Ç½¤ò¤¹¤Ù¤Æ¼ÂÁõ¤·¤Æ¤¤¤Þ¤¹¡£

¡¡°Ê²¼¤¬¤½¤ÎÎã¤Ç¤¹¡£


ATBController.cs

<= ¥¯¥ê¥Ã¥¯¤¹¤ë¤È³«¤­¤Þ¤¹¡£



UniRx Á´ÂΤβòÀâ


¡¡Start ¥á¥½¥Ã¥É¤ÇReactiveProperty<float>·¿¤ÎcurrentATB¤ò0¤Ç½é´ü²½¤·¤Æ¤¤¤Þ¤¹¡£
¤¿¤À¤·¤³¤ì¤ÏÀë¸À¤Î»þÅÀ¤Ç½é´ü²½¤·¤Æ¤âÌäÂꤢ¤ê¤Þ¤»¤ó¡£

¡¡¹¶·â¥Ü¥¿¥ó¤¬¥¯¥ê¥Ã¥¯¤µ¤ì¤¿¤é ResetATB ¤ò¼Â¹Ô¤·¡¢currentATB.Value¤ò0¤Ë¥ê¥»¥Ã¥È¤¹¤ë¥¹¥È¥ê¡¼¥à¤òºîÀ®¤·¤Æ¤¤¤Þ¤¹¡£
¤Þ¤¿¡¢ATBÃͤò²óÉü¤¹¤ë¥¹¥È¥ê¡¼¥à¤âºîÀ®¤·¤Æ¤¤¤Þ¤¹¡£



¡¡¤¤¤Þ¤Þ¤Ç Update ¥á¥½¥Ã¥ÉÆâ¤Ë¤¢¤Ã¤¿ ATB¥²¡¼¥¸¤Îɽ¼¨¤ò¹¹¿·¤¹¤ë½èÍý¤ä¡¢¹¶·â¥Ü¥¿¥ó¤Î¾õÂÖ¤ò¹¹¿·¤¹¤ë½èÍý¤ò UniRx ¤òÍøÍѤ·¤Æ¥¹¥È¥ê¡¼¥à¤òºîÀ®¤·¤Æ¤¤¤Þ¤¹¡£
Select ¥ª¥Ú¥ì¡¼¥¿¤ò³èÍѤ·¡¢currentATB¤ÎÃͤ¬attackThreshold°Ê¾å¤Ç¤¢¤ì¤Ð¹¶·â¥Ü¥¿¥ó¤òÍ­¸ú¤Ë¤·¡¢¤½¤¦¤Ç¤Ê¤±¤ì¤Ð̵¸ú¤Ë¤·¤Þ¤¹¡£
¤½¤ÎºÝ¤Ë¤Ï Subscribe ¤Ç¤Ï¤Ê¤¯¡¢SubscribeToInteractable ¤òÍøÍѤ¹¤ë¤³¤È¤Ç½èÍý¤ò´Ê·é¤Ëµ­½Ò¤·¤Æ¤¤¤Þ¤¹¡£


¡ãSubscribeToInteractable ¤Î¾ì¹ç¡ä
        // ¹¶·â¥Ü¥¿¥ó¤Î¾õÂÖ¤ò¹¹¿·¤¹¤ë¥¹¥È¥ê¡¼¥à(¡ù¡¡¤¤¤Þ¤Þ¤Ç Update ¤Ç½èÍý¤·¤Æ¤¤¤¿ÆâÍÆ)
        currentATB
            .Select(atb => atb >= attackThreshold)
            .SubscribeToInteractable(attackButton)
            .AddTo(this); // ¥¹¥È¥ê¡¼¥à¤òÇË´þ¤¹¤ë¤¿¤á¤ËɬÍ×

¡¡¤³¤ì¤Ï

¡ãSubscribe ¤Î¾ì¹ç¡ä
        // ¹¶·â¥Ü¥¿¥ó¤Î¾õÂÖ¤ò¹¹¿·¤¹¤ë¥¹¥È¥ê¡¼¥à(¡ù¡¡¤¤¤Þ¤Þ¤Ç Update ¤Ç½èÍý¤·¤Æ¤¤¤¿ÆâÍÆ)
        currentATB
            .Select(atb => atb >= attackThreshold)
            .Subscribe(isInteractable => attackButton.interactable = isInteractable)  // ¤³¤ÎÉôʬ¤òSubscribeToInteractable¤ÇÂåÍѤ·¤Æ¤¤¤ë
            .AddTo(this); // ¥¹¥È¥ê¡¼¥à¤òÇË´þ¤¹¤ë¤¿¤á¤ËɬÍ×

¡¡¤ÈƱ¤¸¤Ç¤¹¡£


»²¹Í¥µ¥¤¥È
Qiita @RyotaMurohoshi ÍÍ
UniRx¤Ç¥È¥°¥ë¤Î¥ª¥ó¡¦¥ª¥Õ¤ÎÊѹ¹¤ËϢư¤·¡¢¥Ü¥¿¥ó¤ÎÍ­¸ú¡¦Ìµ¸ú¤òÊѲ½¤µ¤»¤ë



¡¡¤³¤ì¤é¤Î¥¹¥È¥ê¡¼¥à¤òAddTo¥á¥½¥Ã¥É¤ÇATBController¤ËÂФ·¤Æ¹ØÆɤ·¡¢GameObject¤¬ÇË´þ¤µ¤ì¤¿¤È¤­¤Ë¥¹¥È¥ê¡¼¥à¤âÇË´þ¤µ¤ì¤ë¤è¤¦¤Ë¤·¤Æ¤¤¤Þ¤¹¡£



¡¡¤³¤Î¤è¤¦¤Ë UniRx¤ò»ÈÍѤ¹¤ë¤³¤È¤Ç¡¢ATB¥·¥¹¥Æ¥à¤Î¼ÂÁõ¤¬´Êñ¤Ë¤Ê¤ê¡¢¥³¡¼¥É¤¬¤è¤ê¥·¥ó¥×¥ë¤Ë¤Ê¤ê¤Þ¤¹¡£
UniTask¤ò»ÈÍѤ¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¤¬¡¢¤³¤Î¾ì¹ç¤ÏATBÃͤβóÉü¤Ê¤É¡¢°ìÄê´Ö³Ö¤Ç¼Â¹Ô¤µ¤ì¤ë½èÍý¤Ë¸ÂÄꤷ¤Æ»ÈÍѤ¹¤ë¤³¤È¤¬°ìÈÌŪ¤Ç¤¹¡£

¡¡¤³¤³¤Ç¤Î½ÅÍפÊÅÀ¤Ï¡¢¥¹¥È¥ê¡¼¥à¤ò³èÍѤ·¤Æ³Æµ¡Ç½¤ò¼ÂÁõ¤·¤Æ¤¤¤ë¤³¤È¤Ç¡¢¥³¡¼¥É¤ò´Ê·é¤«¤Äʬ¤«¤ê¤ä¤¹¤¯¤·¤Æ¤¤¤ë¤³¤È¤Ç¤¹¡£
¥Ç¡¼¥¿¤Îή¤ì¤òÌÀ³Î¤Ë¤·¡¢¥³¡¼¥É¤ÎÆɤߤ䤹¤µ¤äÊݼéÀ­¤ò¸þ¾å¤µ¤»¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£


½èÍý¤ÎÃÖ¤­´¹¤¨


¡¡UniRx ¤Ë¤Ï¿¤¯¤Î¥Õ¥¡¥¯¥È¥ê¡¦¥á¥½¥Ã¥É¤¬ÍÑ°Õ¤µ¤ì¤Æ¤¤¤ë¤¿¤á¡¢Æ±ÍͤνèÍý¤ò¡¢Ê£¿ô¤Î½ñ¤­Êý¤Ç¼ÂÁõ½ÐÍè¤Þ¤¹¡£

¡¡°Ê²¼¤Ï Observable.EveryUpdate() ¤ÎÉôʬ¤ò Observable.Interval() ¤ÇºîÀ®¤·¤¿¾ì¹ç¤Î¥±¡¼¥¹¤Ç¤¹¡£
½èÍý¤ÎÆâÍƤÏƱ¤¸µ¡Ç½¤È¤·¤Æ¼Â¹Ô¤µ¤ì¤Þ¤¹¡£


    ¡¡¡¡// Interval() ¤ò»È¤Ã¤Æ¡¢1¥Õ¥ì¡¼¥à¤´¤È¤ËATB¤ò²óÉü¤¹¤ë¥¹¥È¥ê¡¼¥à
¡¡¡¡¡¡¡¡Observable
    ¡¡¡¡¡¡¡¡.Interval(TimeSpan.FromSeconds(1f / recoveryRate))
    ¡¡¡¡¡¡¡¡.Where(_ => CurrentATB.Value < maxATB)
    ¡¡¡¡¡¡¡¡.Subscribe(_ => {
        ¡¡¡¡¡¡¡¡var delta = 1f / recoveryRate;
        ¡¡¡¡¡¡¡¡CurrentATB.Value = Mathf.Clamp(CurrentATB.Value + delta, 0f, maxATB);
    ¡¡¡¡¡¡¡¡})
    ¡¡¡¡¡¡¡¡.AddTo(this);

¡¡¤³¤³¤Ç¤Ï Observable.Interval ¤ò»È¤Ã¤Æ¡¢°ìÄê»þ´Ö¤´¤È¤Ë¥¹¥È¥ê¡¼¥à¤òȯ¹Ô¤·¤Æ¤¤¤Þ¤¹¡£

¡¡TimeSpan.FromSeconds(1f / recoveryRate) ¤Ç¡¢1Éäò recoveryRate ¤Ç³ä¤Ã¤¿»þ´Ö´Ö³Ö¤Ç¥¹¥È¥ê¡¼¥à¤òȯ¹Ô¤·¤Þ¤¹¡£
¤½¤Î¸å¡¢ Where ¥ª¥Ú¥ì¡¼¥¿¤Ç CurrentATB ¤ÎÃͤ¬ maxATB ̤Ëþ¤Ç¤¢¤ë¾ì¹ç¤Ë¥¹¥È¥ê¡¼¥à¤òÄ̲ᤵ¤»¡¢Subscribe ¤ÇATBÃͤò²óÉü¤µ¤»¤Æ¤¤¤Þ¤¹¡£

¡¡¤³¤³¤Ç¤Ï¡¢²óÉüÎ̤ò 1f / recoveryRate ¤Ç·×»»¤·¡¢ Mathf.Clamp ¥á¥½¥Ã¥É¤ò»ÈÍѤ·¤Æ¡¢ATBÃͤ¬ºÇÂçÃͤòĶ¤¨¤Ê¤¤¤è¤¦¤Ë¤·¤Æ¤¤¤Þ¤¹¡£



¡¡£±²ó¤ÎÀâÌÀ¤òÆɤó¤À¤À¤±¤Ç¤ÏÍý²ò¤ò¤¹¤ë¤³¤È¤¬Æñ¤·¤¤ÆâÍƤǤ¢¤ë¤¿¤á¡¢
¼ÂºÝ¤Ë½èÍý¤ò½ñ¤¤¤Æ¡¢Æ°¤«¤·¤Æ¤ß¤ë¤è¤¦¤Ë¤¹¤ë¤È¤è¤¤³Ø½¬¤Ë¤Ê¤ê¤Þ¤¹¡£



¡¡°Ê¾å¤Ë¤Ê¤ê¤Þ¤¹¡£

¡¡Â³¤¤¤Æ¡¢¥¯¥é¥¹Æâ¤Î½èÍý¤òʬ³ä¤·¡¢MVP¥Ñ¥¿¡¼¥ó¤Ë¤è¤ë¼ÂÁõ¤ò¹Ô¤¤¤Þ¤¹¡£

¡¡¼¡¤Ï ¥¤¥Ù¥ó¥È¶îÆ°·¿½èÍý¤ÎºîÀ®Îã­£ ¤Ç¤¹¡£

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


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

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

Menu



´ðÁÃ

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

private



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

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