unity3d自動(dòng)生成動(dòng)畫(huà)狀態(tài)機(jī)

因項(xiàng)目需要,人物30多個(gè)窗悯,每個(gè)人物動(dòng)畫(huà)以及命名都是一樣区匣。新版的動(dòng)畫(huà)系統(tǒng)Mecanim,支持連線(xiàn)之類(lèi)蒋院,想在新項(xiàng)目中使用亏钩。但是讓策劃一個(gè)個(gè)手動(dòng)去連線(xiàn),設(shè)置觸發(fā)條件太麻煩了也容易出錯(cuò)欺旧。(初步我們有4個(gè)動(dòng)作 "walk", "idle", "attack", "skill"姑丑,四個(gè)動(dòng)作可以直接相互切換)

網(wǎng)上沒(méi)找到類(lèi)似的代碼。辞友。于是寫(xiě)了個(gè)簡(jiǎn)單的插件來(lái)處理栅哀。直接上代碼震肮。。這個(gè)就自動(dòng)連線(xiàn)和設(shè)置里面的條件了留拾。
先搜索整個(gè)目錄下的fbx文件(動(dòng)作和模型做到一起去了)戳晌,然后根據(jù)制定的幾個(gè)動(dòng)作,自動(dòng)生成狀態(tài)機(jī)间驮,包括設(shè)置好觸發(fā)條件躬厌。

Paste_Image.png

自動(dòng)生成的生成的動(dòng)畫(huà)狀態(tài)機(jī)

using UnityEngine;
using System.Collections;
using UnityEditor;
using System.IO;
using System.Collections.Generic;


public class AutoAnimatorCtl : Editor
{
    [MenuItem("test/AutoAnimatorCtl")]
    static void batchAnimatorCtl()
    {
        string dirPath = "Assets/Media/Character/Model/";
        foreach (string path in Directory.GetFiles(dirPath))
        {
            if (System.IO.Path.GetExtension(path) == ".FBX")
            {
                    createAnimatorCtl(path);
            }
        }
    }
    static bool isUniqueState(string str)
    {
        string[] states = { "walk", "idle", "attack", "skill" };
        foreach (string state in states)
        {
            if (str == state)
                return true;
        }
        return false;
    }
    //檢查fbx里面動(dòng)畫(huà)的完整性
    static bool checkFullAnimation(Object[] objs)
    {
        string[] clipName = { "walk", "idle", "attack", "skill" };
        //Object[] objs = AssetDatabase.LoadAllAssetsAtPath(path);
        int num = 0;
        foreach (Object obj in objs)
        {
            if(obj is AnimationClip && isUniqueState(obj.name))
            {
                num = num + 1;
            }
        }
        if (num == clipName.Length)
            return true;
        return false;
    }
    static void createAnimatorCtl(string path)
    {
        path = path.Replace("\\", "/");
        path = path.Replace(".FBX", ".fbx");
        string acPath = path.Replace(".fbx", ".controller");
        string prePath = path.Replace(".fbx", ".prefab");
        Object[] objs = AssetDatabase.LoadAllAssetsAtPath(path);
        var animatorController = UnityEditor.Animations.AnimatorController.CreateAnimatorControllerAtPath(acPath);
        var layer = animatorController.layers[0];
        var anmationStateMachine = layer.stateMachine;
        List<UnityEditor.Animations.AnimatorState> states = new List<UnityEditor.Animations.AnimatorState>();
        foreach (Object obj in objs)
        {
            if (obj is AnimationClip && isUniqueState(obj.name) == true)
            {
                Debug.Log(obj.name + " is clip");
                var state = anmationStateMachine.AddState(obj.name);
                states.Add(state);
                state.motion = obj as Motion;
            }
        }
        animatorController.AddParameter("walk", AnimatorControllerParameterType.Bool);
        animatorController.AddParameter("skill", AnimatorControllerParameterType.Bool);
        animatorController.AddParameter("attack", AnimatorControllerParameterType.Bool);
        animatorController.AddParameter("idle", AnimatorControllerParameterType.Bool);
        
        for(int i = 0; i< states.Count;i++)
        {
            for(int j = 0; j < states.Count; j++)
            {
                if(i != j)
                {
                    var anstateTras = states[i].AddTransition(states[j], false);
                    anstateTras.AddCondition(UnityEditor.Animations.AnimatorConditionMode.If, 0, states[j].name);
                }
            }
            if(states[i].name == "idle")
            {
                anmationStateMachine.defaultState = states[i];
            }
        }
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末马昨,一起剝皮案震驚了整個(gè)濱河市竞帽,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌鸿捧,老刑警劉巖屹篓,帶你破解...
    沈念sama閱讀 221,430評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異匙奴,居然都是意外死亡堆巧,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,406評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門(mén)泼菌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)谍肤,“玉大人,你說(shuō)我怎么就攤上這事哗伯』拇В” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 167,834評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵焊刹,是天一觀的道長(zhǎng)系任。 經(jīng)常有香客問(wèn)我,道長(zhǎng)虐块,這世上最難降的妖魔是什么俩滥? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,543評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮贺奠,結(jié)果婚禮上霜旧,老公的妹妹穿的比我還像新娘。我一直安慰自己儡率,他們只是感情好挂据,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,547評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著喉悴,像睡著了一般棱貌。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上箕肃,一...
    開(kāi)封第一講書(shū)人閱讀 52,196評(píng)論 1 308
  • 那天婚脱,我揣著相機(jī)與錄音,去河邊找鬼。 笑死障贸,一個(gè)胖子當(dāng)著我的面吹牛错森,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播篮洁,決...
    沈念sama閱讀 40,776評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼涩维,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了袁波?” 一聲冷哼從身側(cè)響起瓦阐,我...
    開(kāi)封第一講書(shū)人閱讀 39,671評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎篷牌,沒(méi)想到半個(gè)月后睡蟋,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,221評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡枷颊,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,303評(píng)論 3 340
  • 正文 我和宋清朗相戀三年戳杀,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片夭苗。...
    茶點(diǎn)故事閱讀 40,444評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡信卡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出题造,到底是詐尸還是另有隱情傍菇,我是刑警寧澤,帶...
    沈念sama閱讀 36,134評(píng)論 5 350
  • 正文 年R本政府宣布晌梨,位于F島的核電站桥嗤,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏仔蝌。R本人自食惡果不足惜泛领,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,810評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望敛惊。 院中可真熱鬧渊鞋,春花似錦、人聲如沸瞧挤。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,285評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)特恬。三九已至执俩,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間癌刽,已是汗流浹背役首。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,399評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工尝丐, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人衡奥。 一個(gè)月前我還...
    沈念sama閱讀 48,837評(píng)論 3 376
  • 正文 我出身青樓爹袁,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親矮固。 傳聞我的和親對(duì)象是個(gè)殘疾皇子失息,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,455評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容