¡¡º£²óÄɲä·¤¿ SetUpAnimation ¥á¥½¥Ã¥ÉÆâ¤Ç¤ä¤Ã¤Æ¤¤¤ë¤³¤È¤Ç¤¹¤¬¡¢¤³¤ì¤Ï¡¢²¼µ¤Î¥Þ¥Ë¥å¥¢¥ë¤ò¸«¤Æ¤¤¤¿¤À¤¯¤È²Ä»ë²½¤Ç¤¤Þ¤¹¡£
¥¤¥ó¥¹¥Ú¥¯¥¿¡¼¤ÇÀßÄê¤Ç¤¤ë¤³¤È¤ò¡¢
¥²¡¼¥àÆâ¤Ç¥é¥ó¥¿¥¤¥à¤ËÀ©¸æ¤¹¤ë¤¿¤á¡¢¥¹¥¯¥ê¥×¥È¤òÍøÍѤ·¤ÆƱ¤¸¤³¤È¤ò¤·¤Æ¤¤¤ë¥¤¥á¡¼¥¸¤Ç¤¹¡£
¡¡
Unity ¸ø¼°¥Þ¥Ë¥å¥¢¥ë
Animator Override Controller
¡¡¤½¤ì¤Ç¤Ï½èÍý¤ÎÆâÍƤò£±¹Ô¤º¤ÄÆɤ߲ò¤¤¤Æ¤¤¤¤Þ¤¹¡£
overrideController = new AnimatorOverrideController();
overrideController.runtimeAnimatorController = anim.runtimeAnimatorController;
¡¡¿·¤·¤¯ AnimatorOverrideController ¤Î¥¤¥ó¥¹¥¿¥ó¥¹¤òºîÀ®¤·¡¢¤½¤Î runtimeAnimatorController ÊÑ¿ô¤Ë¡¢¸½ºß¤Î AnimatorController ¤Î runtimeAnimatorController ÊÑ¿ô¤òÂåÆþ¤·¤Æ¤¤¤Þ¤¹¡£
¤³¤ì¤ÏÀè¤Û¤É¤Î¥Þ¥Ë¥å¥¢¥ë¤ò¸«¤Æ¤¤¤¿¤À¤¯¤È¤ï¤«¤ë¤Î¤Ç¤¹¤¬¡¢
¾å½ñ¤¤¹¤ëÊý¤Ë¤â¸½ºß¤ÈƱ¤¸¾ðÊó¤òÂåÆþ¤·¤Æ¤ª¤¯É¬Íפ¬¤¢¤ë¤¿¤á¤Ç¤¹¡£
anim.runtimeAnimatorController = overrideController;
¡¡¸½ºß¤Î AnimatorController ¤Î runtimeAnimatorController ¤ËÂФ·¤Æ¿·¤·¤¯ºîÀ®¤·¤¿ AnimatorOverrideController ¤òÂåÆþ¤·¤Æ¹¹¿·¤·¤Þ¤¹¡£
¤³¤Î»þÅÀ¤Ç¡¢°ìö¡¢¤Þ¤Ã¤¿¤¯Æ±¤¸ÆâÍƤξðÊó¤Ç¹¹¿·¤¬Æþ¤ê¤Þ¤¹¡£
¡¡¤³¤Î½èÍý¤ò¹Ô¤Ã¤Æ¤ª¤¯¤³¤È¤Ç¡¢AnimatorController ¤¬ºÆÀ¸½èÍý¤ò¹Ô¤¦¤È¤¡¢AnimatorOverrideController ¤ÎÀßÄê¤òÍøÍѤ¹¤ë¤³¤È¤¬¤Ç¤¤ë¾õÂ֤ˤʤê¤Þ¤¹¡£
AnimatorStateInfo[] layerInfo = new AnimatorStateInfo[anim.layerCount];
¡¡AnimatorStateInfo ·¿¤ÎÇÛÎó¤òÍÑ°Õ¤·¡¢anim.layerCount ÊÑ¿ô¤À¤±Í×ÁÇÈÖ¹æ¤ò¼èÆÀ¤·¤Æ¤ª¤¤Þ¤¹¡£
¡¡´ðËÜŪ¤Ë anim.layerCount ¤ÎÃÍ¤Ï 1 ¤Ç¤¹¡£ÆâÍƤȤ·¤Æ¤Ï BaseLayer(¤¤¤Ä¤â¥¹¥Æ¡¼¥È¤òÅÐÏ¿¤·¤Æ¤¤¤ë¾ì½ê) ¤Î¾ðÊó¤Ë¤Ê¤ê¤Þ¤¹¡£
³Îǧ¤¹¤ë¤¿¤á¤Ë¤Ï¡¢11¹ÔÌÜ¤Ë Debug.Log("LayerCount : " + anim.layerCount ); ¤òÆþ¤ì¤Æ¤ß¤ë¤Èʬ¤«¤ê¤Þ¤¹¡£
¡¡²¿¤«ÆâÉôŪ¤Ê¾ðÊó¤ò²Ä»ë²½¤·¤Æ³Îǧ¤·¤¿¤¤¤È¤¤Ë¤Ï¡¢Debug ¥¯¥é¥¹¤Î Log ¥á¥½¥Ã¥É¤ò³èÍѤ·¤Æ¤ß¤Æ¤¯¤À¤µ¤¤¡£
for (int i = 0; i < anim.layerCount; i++)
{
//GetCurrentAnimatorStateInfo¤ÇAnimator¤Î¸½ºß¤Î¾õÂÖ¤«¤é¥Ç¡¼¥¿¤ò¼èÆÀ¤¹¤ë¡£Î㤨¤Ð¡¢Â®ÅÙ¡¢Ä¹¤µ¡¢Ì¾Á°¡¢¤½¤Î¾¤ÎÊÑ¿ô¤Ê¤É
layerInfo[i] = anim.GetCurrentAnimatorStateInfo(i);
}
¡¡GetCurrentAnimatorStateInfo ¥á¥½¥Ã¥É¤ò¼Â¹Ô¤¹¤ë¤³¤È¤Ç Animator ¤Î¸½ºß¤Î¾õÂÖ¤ò¼èÆÀ¤Ç¤¤Þ¤¹¡£
¤½¤ì¤òÍÑ°Õ¤·¤Æ¤ª¤¤¤¿¶õ¤Î¾õÂ֤ΠlayerInfo ÇÛÎó¤ËÂåÆþ¤·¤ÆÊÝ»ý¤·¤Æ¤ª¤¤Þ¤¹¡£
¡¡BaseLayer ¤·¤«¤Ê¤¤¾ì¹ç¡¢layerCount ÊÑ¿ô¤Ï 1 ¤Ê¤Î¤Ç¡¢¤³¤Î¥ë¡¼¥×¤Ï1²ó¤À¤±½èÍý¤ò¹Ô¤¤¤Þ¤¹¡£
¡¡for ʸ¤Ï¡¢¼Â¿ôÃͤËÃÖ¤´¹¤¨¤Æ¹Í¤¨¤ë¤ÈÍý²ò¤¬¿¼¤Þ¤ê¤Þ¤¹¡£
¡¡º£²ó¤Î½èÍý¤Ï¡¢²¼µ¤Î¤è¤¦¤Ê½èÍý¤Ç¤¹¤Î¤Ç
layerInfo[i] = anim.GetCurrentAnimatorStateInfo(i);
¡¡¤³¤Î i ÊÑ¿ôÉôʬ¤ò¼Â¿ôÃͤˤ·¤ÆÃÖ¤´¹¤¨¤Æ¹Í¤¨¤Æ¤ß¤Æ¤¯¤À¤µ¤¤¡£
layerInfo[0] = anim.GetCurrentAnimatorStateInfo(0);
¡¡¤è¤Ã¤Æ¡¢¼ÂºÝ¤Ë¤Ï¤³¤Î¤è¤¦¤Ê¡¢layerInfo[0] ¤ÎÍ×ÁǤȤ·ÂåÆþ½èÍý¤¬¹Ô¤ï¤ì¤Æ¤¤¤ë¤³¤È¤¬Ê¬¤«¤ê¤Þ¤¹¡£
overrideController[overrideClipName] = this.charaData.charaAnim;
¡¡overrideController ÊÑ¿ô¤Ï Animator ¥¯¥é¥¹¤¬ÍÑ°Õ¤·¤Æ¤¤¤ë Dictinary ·¿¤ÎÊÑ¿ô¤Ç¤¹¡£
Key ¤Ï string ·¿¤ÇÄêµÁ¤µ¤ì¤Æ¤¤¤Þ¤¹¤Î¤Ç¡¢Ê¸»úÎó¤ÎÃͤò»ØÄꤹ¤ë¤³¤È¤Ç Value ¤ÎÃͤò¹¹¿·¤Ç¤¤Þ¤¹¡£
¡¡º£²ó¤Ï string ·¿¤Î overrideClipName ÊÑ¿ô¤òÄêµÁ¤·¤Æ¤¢¤ê¤Þ¤¹¤Î¤Ç¡¢¤³¤ÎÃͤò Key ¤È¤·¤Æ»ØÄꤷ¡¢
this.charaData.charaAnim ÊÑ¿ô¤Î¾ðÊó¤ò Value ¤È¤·¤ÆÂåÆþ½èÍý¤·¤Æ¤¤¤Þ¤¹¡£
¡¡¤³¤Î½èÍý¤Ë¤è¤ê¡¢overrideController ¤ËÀßÄꤷ¤Æ¤¤¤ë¥¢¥Ë¥á¤Î¾ðÊó¤ò¡¢º£²óÍøÍѤ¹¤ë¥¥ã¥éÀìÍѤΥ¢¥Ë¥á¤Î¾ðÊó¤Ë¹¹¿·¤·¤Þ¤¹¡£
anim.runtimeAnimatorController = overrideController;
¡¡Àè¤Û¤É overrideController ¤ÎÆâÍƤò¹¹¿·¤·¡¢¸½ºßÍøÍѤ·¤Æ¤¤¤ë¥¥ã¥é¤Î¥Ç¡¼¥¿¤Î¥¢¥Ë¥á¾ðÊó¤Ë¹¹¿·¤·¤ÆÃÖ¤´¹¤¨¤¿¤Î¤Ç¡¢
¤½¤ì¤òºÆÅÙ¡¢runtimeAnimatorController ¤ËŬÍѤ·¡¢¹¹¿·¤·¤¿¥¢¥Ë¥á¤Î¾ðÊó¤òÀßÄꤷ¤Þ¤¹¡£
¡¡overrideController ¤Ë¾ðÊó¤òÀßÄꤷ¤¿¤À¤±¤Ç¤ÏÈ¿±Ç¤µ¤ì¤Ê¤¤¤¿¤á¡¢ÀßÄê¸å¡¢¤³¤Î¹¹¿·¤Î½èÍý¤ò¹Ô¤¦¤³¤È¤ÇÈ¿±Ç¡¦Å¬ÍѤµ¤ì¤Þ¤¹¡£
anim.Update(0.0f);
¡¡¤³¤Î Update ¥á¥½¥Ã¥É¤Ï Animator ¥¯¥é¥¹¤ËÍÑ°Õ¤µ¤ì¤Æ¤¤¤ë¥á¥½¥Ã¥É¤Ç¤¹¡£(Ä̾ï¤Î Update ¥á¥½¥Ã¥É¤Ç¤Ï¤Ê¤¤¡¢¤È¤¤¤¦¤³¤È¤Ç¤¹¤Í)
¥¢¥Ë¥á¡¼¥·¥ç¥ó¤Î¹¹¿·ÀßÄê¤òÈ¿±Ç¤µ¤»¤ë½èÍý¤Ç¤¹¡£¤³¤Î½èÍý¤òÆþ¤ì¤Æ¤ª¤¯¤ÈÀßÄꤷ¤¿¿·¤·¤¤¥¢¥Ë¥á¤¬Â¨ºÂ¤ËŬÍѤµ¤ì¤Þ¤¹¡£
Unity ¥¹¥¯¥ê¥×¥È¡¦¥ê¥Õ¥¡¥ì¥ó¥¹
Animator
for (int i = 0; i < anim.layerCount; i++)
{
anim.Play(layerInfo[i].fullPathHash, i, layerInfo[i].normalizedTime);
}
¡¡¥¢¥Ë¥á¡¼¥·¥ç¥ó¤Î¾õÂÖ¾ðÊó¤ò»ÈÍѤ·¤Æ¡¢¥¢¥Ë¥á¡¼¥¿¡¼¤Î³Æ¥ì¥¤¥ä¡¼¤ÇºÆÀ¸Ãæ¤Î¥¢¥Ë¥á¡¼¥·¥ç¥ó¤òÉü¸µ¤·¤Þ¤¹¡£
¡¡layerInfo[i].fullPathHash ÊÑ¿ô¤Ï¡¢ºÆÀ¸Ãæ¤Î¥¢¥Ë¥á¡¼¥·¥ç¥ó¤Î¥Õ¥ë¥Ñ¥¹¤Î¥Ï¥Ã¥·¥åÃÍ(int ·¿)¤ò¼èÆÀ¤·¡¢
i ÊÑ¿ô¤Ï¥ì¥¤¥ä¡¼¤Î¥¤¥ó¥Ç¥Ã¥¯¥¹(0 ¤Î¾ì¹ç¡¢BaseLayer)¡¢layerInfo[i].normalizedTime ÊÑ¿ô¤Ï¥¢¥Ë¥á¡¼¥·¥ç¥ó¤ÎºÆÀ¸»þ´Ö¤òÀµµ¬²½¤·¤¿ÃÍ(0-1)¤òɽ¤·¤Þ¤¹¡£
¤³¤ì¤é¤Î¾ðÊó¤ò»ÈÍѤ·¤Æ¡¢
³Æ¥ì¥¤¥ä¡¼¤ÇºÆÀ¸Ãæ¤Î¥¢¥Ë¥á¡¼¥·¥ç¥ó¤ò»ØÄꤷ¤¿»þ´Ö°ÌÃÖ¤«¤éºÆ³«¤·¤Þ¤¹¡£
¡¡¥Õ¥ë¥Ñ¥¹¤È¤Ï¥¹¥Æ¡¼¥È¤Î³¬Áع½Â¤¤Î¤³¤È¤Ç¤¹¡£BaseLayer ¤ÎÃæ¤Ë¥¹¥Æ¡¼¥È¤¬Â¸ºß¤·¤Æ¤¤¤Þ¤¹¤Î¤Ç¡¢
´ðËÜŪ¤Ë¤Ï¡¢BaseLayer.Idle ¤È¤¤¤Ã¤¿·Á¤Ç¿Æ»Ò´Ø·¸¤¬¹½ÃÛ¤µ¤ì¤Æ¤¤¤Þ¤¹¡£
¤³¤Î¾ðÊó¤ò¥Ï¥Ã¥·¥åÃͤǤ¢¤ë int ·¿¤ËÊÑ´¹¤·¤¿¤â¤Î¤¬ fullPathHash ÊÑ¿ô¤Ç¤¹¡£
¤³¤³¤Ç»ØÄꤷ¤Æ¤¤¤ë¤Î¤Ï¡¢¸½ºß¡¢¥²¡¼¥à²èÌ̤ǺÆÀ¸¤·¤Æ¤¤¤ë¥¢¥Ë¥á¤Î¥¹¥Æ¡¼¥È¤Î¾ðÊó¤òÀ©¸æ¤¹¤ë¤è¤¦¤Ë¤·¤Æ¤¤¤Þ¤¹¡£
º£²ó¤Î¾ì¹ç¤Ç¤¢¤ì¤Ð¡¢°ÜÆ°ÍѤΥ¹¥Æ¡¼¥È¤ËÂФ·¤ÆÌ¿Îᤷ¤Æ¤¤¤Þ¤¹¡£
¡¡normalizedTime ÊÑ¿ô¤Ï
¥¢¥Ë¥á¤ÎºÆÀ¸»þ´Ö¤ò¥¢¥Ë¥á¡¼¥·¥ç¥ó¤ÎŤµ¤Ç³ä¤ê¡¢0¤«¤é1¤ÎÈϰϤËÀµµ¬²½¤·¤Þ¤¹¡£
Î㤨¤Ð¡¢ºÆÀ¸»þ´Ö¤Î¥È¡¼¥¿¥ë¤¬2ÉäΥ¢¥Ë¥á¤Ç¤¢¤ì¤Ð¡¢¤½¤ì¤¬ºÆÀ¸¤µ¤ì¤Æ¸½ºß1ÉäǤ¢¤ë¤È¤¡¢Àµµ¬²½¤ò¹Ô¤¦¤È 0.5 ¤È¤¤¤¦Ãͤˤʤê¤Þ¤¹¡£
¡¡¤·¤¿¤¬¤Ã¤Æ¡¢¤³¤ÎÉôʬ¤òÈ´¤¯¤È¡¢¥¢¥Ë¥á¡¼¥·¥ç¥ó¤ÎºÆÀ¸°ÌÃÖ¤ä¾õÂÖ¤¬ÊÝ»ý¤µ¤ì¤º¡¢¿·¤·¤¤¥¢¥Ë¥á¡¼¥·¥ç¥ó¤¬ºÇ½é¤«¤éºÆÀ¸¤µ¤ì¤ë¤³¤È¤Ë¤Ê¤ê¤Þ¤¹¡£
¡¡¤³¤³¤Þ¤ÇÀâÌÀ¤ÎÄ̤ꡢ²¼µ¤Î½èÍý¤Ï¤Ê¤¯¤Æ¤â¡¢¥¢¥Ë¥á¤ÎÊѹ¹¼ê³¤¼«ÂΤϽªÎ»¤·¤Æ¤¤¤Þ¤¹¡£
anim.Update(0.0f);
for (int i = 0; i < anim.layerCount; i++)
{
anim.Play(layerInfo[i].fullPathHash, i, layerInfo[i].normalizedTime);
}
¡¡¤¿¤À¤·¡¢¹¹¿·¤·¤¿¥¢¥Ë¥á¤¬¤¹¤°¤ËŬÍѤµ¤ì¤Ê¤«¤Ã¤¿¤ê¡¢ÅÓÃæ¤À¤Ã¤¿¥¢¥Ë¥á¤¬ºÇ½é¤«¤éºÆÀ¸¤µ¤ì¤Æ¤·¤Þ¤¦¤È°ãÏ´¶¤ò´¶¤¸¤Æ¤·¤Þ¤¦¤¿¤á¡¢
¤³¤¦¤¤¤Ã¤¿¤Á¤ç¤Ã¤È¤·¤¿Éôʬ¤¬¼Â¤Ï¥²¡¼¥à¤Î²èÌ̤ǤϤ¹¤´¤¯ÉÔ¼«Á³¤Ë±Ç¤ê¤Þ¤¹¡£
¡¡¤½¤³¤Ç¾åµ¤Î½èÍý¤ò¹Ô¤¤¡¢¥²¡¼¥à²èÌ̤¬¼«Á³¤Ë±Ç¤ë¤è¤¦¤Ë½èÍý¤ò»Ü¤·¤Æ¤¤¤Þ¤¹¡£
µ¤ÇÛ¤ê¤Î¤è¤¦¤Ê¤â¤Î¤Ç¤¹¤¬¡¢¤³¤¦¤·¤¿£±¤Ä£±¤Ä¤Î¾®¤µ¤Ê½èÍý¤¬½ÅÍפǤ¹¡£