关于Unity中Mecanim动画的动画状态代码控制与代码生成动画控制器
對于多量的、復雜的、有規律的控制器使用代碼生成
?
?
動畫狀態代碼控制
1:每個動畫狀態,比如進入狀態,離開狀態, 等都有可能需要代碼來參與和處理,比如,進入這個動畫單元后做哪些事情,來開這個動畫單元后做哪些事情,為了解決這個問題,unity允許每個動畫單元來綁定一個腳本代碼,這個腳本代碼必須繼承于StateMachineBehaviour;
2: 可以在動畫狀態的Add Behaviour上添加掛載一個腳本到動畫狀態;
3: StateMachineBehaviour主要接口:
(1)OnStateEnter: 當動畫開始播放的時候被調用;
(2)OnStateExit: 當動畫結束播放的時候被調用;
(3)OnStateMove: 當動畫被移動的時候調用;
(4)OnStateIK: 當動畫觸發逆向運動學時調用此方法;
(5)OnStateUpdate: 每幀都會被調用;
?
動畫狀態代碼控制案例
1.創建Unity工程和文件目錄
2.導入資源文件包body_anim.unitypackage(第58)
3.打開Models文件夾,點擊模型Boy,設置Rig---->Animation Tyoe---->Humanoid(人形動畫)
4.配置Avatar
5.把模型Boy拖進場景中,會自己掛載一個Animator的組件
6.在res文件夾下創建一個動畫控制器Create---->Animator Controller,叫做anim_ctrl,雙擊打開,可以用鼠標中鍵按下拖動背景
7.把Assets\Animations\AnisForFight的Boy@ForwardKick.FBX直接拖進Animator視圖中的狀態機中,設置為默認,再連接一條線到Exit
8.把anim_ctrl關聯到Boy模型的Animator組件的Controller
9.運行,角色會不停地踢腿,現在我們要給它加一個代碼控制
10點擊狀態機里面的ForwardKick,右邊屬性面板下有一個Add Behaviour,點擊創建一個新的腳本叫anim_test。
11.這時候anim_test腳本文件在文件目錄的外面,我們可以把它拖進scripts文件夾
打開腳本anim_test
using System.Collections; using System.Collections.Generic; using UnityEngine;public class anim_test : StateMachineBehaviour {//layerIndex就是動畫所在的層,Base Layer層的layerIndex是0//要獲得其他節點的組件都可以像MonoBehaviour那樣做// OnStateEnter is called when a transition starts and the state machine starts to evaluate this stateoverride public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) {Debug.Log("OnStateEnter");}//每一幀都執行// OnStateUpdate is called on each Update frame between OnStateEnter and OnStateExit callbacksoverride public void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) {Debug.Log("OnStateUpdate");}// OnStateExit is called when a transition ends and the state machine finishes evaluating this stateoverride public void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) {Debug.Log("OnStateExit");}//下面兩個用的不多// OnStateMove is called right after Animator.OnAnimatorMove(). Code that processes and affects root motion should be implemented here//override public void OnStateMove(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) {////}// OnStateIK is called right after Animator.OnAnimatorIK(). Code that sets up animation IK (inverse kinematics) should be implemented here.//override public void OnStateIK(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) {////} }?
?
代碼生成動畫控制器
1:10個狀態,每2個狀態之間需要建立兩兩的聯系,那么這個動畫控制器就會有100個過渡條件,那么這個時候最好的方式是代碼自動的生成動畫控制器;
2: 擴展編輯器,來動態生成這個動畫控制器,不用手動的去修改;
3: 擴展編輯器的相關的API:
(1)創建一個動畫控制器:createAnimationControllerAtPath(“path”);
(2)獲取動畫狀態機: AnimatorStateMachine controller.layers[index].stateMachine;
(3)設置默認的動畫狀態: stateMachine.defaultState
(4)加載AnimationClip: AssertDatabase.LoaderAssetAtPath(“path”, typeof(AnimationClip))
As AnimationClip;
(5)為每個狀態指定動畫:state.motion = animclip;
(6)AnimController.AddParameter(名字, AnimationParamsType);
(7)添加一個過渡: AddTransition(dst_state, false);
(8)過渡添加一個條件: trans.AddCondition();
(9)最后一個添加exit state: AddExitTransition(); 制定輸出動畫;
?
?
代碼生成動畫控制器案例
1.先導入動畫資源包anims.unitypackage(第58)到Assets\Animations目錄下,里面有十個動畫
2.擴展編輯器,新建一個Editor文件夾,在Editor目錄下創建一個腳本叫CreateAnimCtrl
打開CreateAnimCtrl
using UnityEngine; using System.Collections; using UnityEditor; using UnityEditor.Animations;public class CreateAnimCtrl : MonoBehaviour {[MenuItem("Assets/Create/CreateAnimCtrl")]//添加了一個菜單欄,可以在最上面菜單欄點擊Assets/Create發現多了一個CreateAnimCtrl// 執行函數,點擊Assets/Create/CreateAnimCtrl會執行的函數static void Run() {Debug.Log("Run called");// Step1: 生成我們的動畫控制文件;這個操作等于右鍵Create---->Animator Controller到Assets/res目錄下,名字叫code_anim.controllerAnimatorController ctrl = AnimatorController.CreateAnimatorControllerAtPath("Assets/res/code_anim.controller");// Step2 獲取我們的動畫狀態機;AnimatorStateMachine state_machine = ctrl.layers[0].stateMachine;// 創建我們的動畫狀態;先創建一個數組,里面可以放10個動畫狀態AnimatorState[] state = new AnimatorState[10] ;for (int i = 0; i < 10; i++) {state[i] = state_machine.AddState("state" + i);//狀態機添加動畫狀態// 這個語句相當于把Assets\Animations\AnisWithNum目錄下的一個一個的可執行動畫文件關聯到對應的動畫狀態的Motion屬性// as 強轉類型過去,是C#的語法AnimationClip anim = AssetDatabase.LoadAssetAtPath("Assets/Animations/AnisWithNum/Ani" + i + ".FBX", typeof(AnimationClip)) as AnimationClip;state[i].motion = anim;}// 兩兩添加過渡;for (int i = 0; i < 10; i++) {for (int j = 0; j < 10; j++) { // i --> j 的transform// 創建每個動畫過渡的控制變量,等于在Animator面板的Parameters面板下的參數添加條件變量,是開關類型的變量,這個變量就是只要選中就會執行ctrl.AddParameter(i + "switch" + j, AnimatorControllerParameterType.Trigger);// end //兩兩動畫狀態之間添加過渡,等于在狀態機那個圖里面選擇一個動畫狀態然后右鍵Make TransitionAnimatorStateTransition trans = state[i].AddTransition(state[j], false);//給每個過渡添加條件,等于在過渡的屬性面板下面的Condition屬性點擊+號,默認是0,就是關閉的狀態trans.AddCondition(AnimatorConditionMode.If, 0, i + "switch" + j);}}// end // 設置一個默認動畫狀態,把第0個動畫狀態設置為默認動畫狀態;state_machine.defaultState = state[0];} }3.點擊Assets/Create/CreateAnimCtrl,自動生成動畫控制器且配置好了。最后把code_anim.controller關聯到Boy模型的Animator組件的Controller屬性中。
?
轉載于:https://www.cnblogs.com/HangZhe/p/7264411.html
總結
以上是生活随笔為你收集整理的关于Unity中Mecanim动画的动画状态代码控制与代码生成动画控制器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [ACM] hdu 1228 A+B (
- 下一篇: 搭配飞行员 dinic