[Unity Editor]將Animation Clip嵌入Animator Controller

參考文章:
Unity中將Animation Clip嵌入Animator Controller的方法

??我要做這個(gè)工具的原因,跟參考文章類(lèi)似,偶然發(fā)現(xiàn)項(xiàng)目中有的Clip跟Controller是一個(gè)整體,這種方式比較方便管理簡(jiǎn)單動(dòng)畫(huà),所以搜了下創(chuàng)建方案。
??這里又造輪子,主要是拓展功能與修復(fù)參考文章的Bug,代碼都在下面,拓展的內(nèi)容是:

  • 增加刪除某個(gè)內(nèi)嵌Clip的功能
  • 修復(fù)Bug:參考文章中,Clip內(nèi)嵌到Controller后,Controller中動(dòng)畫(huà)狀態(tài)Motion并沒(méi)有跟Clip關(guān)聯(lián)起來(lái)
  • 性能小優(yōu)化:內(nèi)嵌過(guò)程中,沒(méi)必要重新導(dǎo)入每個(gè)Clip,再最后執(zhí)行一次即可(因?yàn)槊看沃匦聦?dǎo)入的都是Controller)
[MenuItem("Assets/Anime/Nest Clips in Controller")]
public static void NestAnimClips()
{
    AnimatorController ctrl = Selection.activeObject as AnimatorController;
    if (null == ctrl) return;

    AnimationClip[] clips = ctrl.animationClips;
    for (int i = 0; i < clips.Length; ++i)
    {
        AnimationClip clip = clips[i];
        var assetPath = AssetDatabase.GetAssetPath(clip);
        if (assetPath.EndsWith(".anim"))
        {
            AnimationClip newClip = Object.Instantiate(clip);
            newClip.name = clip.name;
            AssetDatabase.AddObjectToAsset(newClip, ctrl);
            AssetDatabase.DeleteAsset(AssetDatabase.GetAssetPath(clip));
            ReplaceStateMotion(ctrl, clip, newClip);
        }
    }
    AssetDatabase.SaveAssets();
}

[MenuItem("Assets/Anime/Remove Nest Clip")]
public static void RemoveNestAnimClip()
{
    AnimationClip clip = Selection.activeObject as AnimationClip;
    if(clip == null) return;
    string ctrlPath = AssetDatabase.GetAssetPath(clip);
    // 保證只移除嵌套的clip,否則會(huì)導(dǎo)致動(dòng)畫(huà)狀態(tài)錯(cuò)亂
    if(!ctrlPath.EndsWith(".controller")) return;

    AssetDatabase.RemoveObjectFromAsset(clip);
    Object.DestroyImmediate(clip);
    AssetDatabase.SaveAssets();
}


/// <summary>
/// 替換動(dòng)畫(huà)控制器中使用的Clip
/// </summary>
public static void ReplaceStateMotion(AnimatorController ctrl, AnimationClip oldClip, AnimationClip newClip, bool replaceAll=false)
{
    foreach (AnimatorControllerLayer layer in ctrl.layers)
    {
        foreach (ChildAnimatorState childState in layer.stateMachine.states)
        {
            if (childState.state.motion == oldClip)
            {
                ctrl.SetStateEffectiveMotion(childState.state, newClip);
                if (!replaceAll) return;
            }
        }
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 用到的組件 1、通過(guò)CocoaPods安裝 2、第三方類(lèi)庫(kù)安裝 3、第三方服務(wù) 友盟社會(huì)化分享組件 友盟用戶(hù)反饋 ...
    SunnyLeong閱讀 15,192評(píng)論 1 180
  • 前言 在游戲開(kāi)發(fā)過(guò)程中,動(dòng)畫(huà)是一個(gè)不可或缺的環(huán)節(jié),沒(méi)有動(dòng)畫(huà)變換的人物并不能帶給玩家很好的代入感,而Unity作為一...
    戴珍珠耳釘?shù)纳倥?/span>閱讀 4,868評(píng)論 0 3
  • 漸變的面目拼圖要我怎么拼? 我是疲乏了還是投降了? 不是不允許自己墜落, 我沒(méi)有滴水不進(jìn)的保護(hù)膜。 就是害怕變得面...
    悶熱當(dāng)乘涼閱讀 4,480評(píng)論 0 13
  • 感覺(jué)自己有點(diǎn)神經(jīng)衰弱,總是覺(jué)得手機(jī)響了;屋外有人走過(guò);每次媽媽不聲不響的進(jìn)房間突然跟我說(shuō)話,我都會(huì)被嚇得半死!一整...
    章魚(yú)的擁抱閱讀 2,392評(píng)論 4 5
  • 夜鶯2517閱讀 128,155評(píng)論 1 9

友情鏈接更多精彩內(nèi)容