您好,登錄后才能下訂單哦!
Unity4.X中添加的新的動畫系統取代了原來3.X的舊的動畫系統,新動畫系統Mecanim也是官方推薦的,使得我們寫較少的代碼來實現連續的動畫效果。
使用播放play()或淡入淡出播放CrossFade()
例如:
animation.Play("name");
animation.CrossFade("name");
也可以做成隊列動畫,然后播放,例如:
animation.PlayQueued("name");
animation.CrossFade("name1");
代碼實現倒序播放
animation.Play(clip1);
animation[clip1].speed = animationspeed * -1.0;
老的動畫系統要實現一個連續的隊列動畫,是要通過代碼來進行邏輯控制,而在新的動畫系統中,要實現這一功能將非常方便。例如要根據玩家連續點擊按鈕的次數來實現一系列動作的組合動畫。
例如:
站立動畫->***1。。。***N->站立動畫
這之間可以有N個連續動畫的組合,可以根據用戶點擊按鈕的頻率來判斷執行到第幾個連續的動畫。
如圖,一般導入的動畫模型都是原始模型沒有動畫,然后是動畫模型,每一個動畫模型都依賴原始模型,命名后面+@name,對應的狀態動畫。
unity4.X版本還保留了原始動畫系統,將模型拖放到Hierarchy視圖中沒有Animation組件而是Animator組件。如果你還想用老的動畫系統,就要切換動畫的類型Rig->Animation Type->Legacy
如果我們要讓模型改成新動畫系統的類型,我們最好用工具,讓程序來批量改變模型的類型,建議放在Editor下。
using UnityEditor;
public class MyEditor : AssetPostprocessor {
public void OnPreprocessModel()
{
ModelImporter modelImporter = (ModelImporter)assetImporter;
modelImporter.animationType = ModelImporterAnimationType.Human;
}
}
然后將模型拖放Project下,會發現模型的類型會自動修改成Humanoid格式,這種格式一般是人物模型選擇該格式。
創建模型的匹配骨骼文件,點擊Configure可以預覽骨骼。
節約資源起見,其他模型就由這個avatar copy一下即可。
Project->Create->AnimatiorController,然后講模型的Animator下的Controller屬性賦值這個動畫控制器
然后打開菜單欄的Window->Animator,將動畫文件拖放到Animator中,***箭頭代表根動畫,右擊選擇Set As Default可以設置為根動畫,選擇Make Transition可以連接下一個動畫節點。
每一條連接線都是一個狀態,可以通過左下角的Parameters面板添加Bool變量來控制連接線是否連通,從而來改變模型的動畫。
設置連接線的連通條件,點擊某一條線,然后在Inspector->Conditions選擇Parameters里面的Bool值,并且設置它的默認連通狀態是ture還是false。
代碼實現人物從等到狀態、跑步狀態、行走狀態的兩兩狀態切換:
using UnityEngine;
using System.Collections;
//Created By Aladdin http://blog.csdn.net/dingxiaowei2013/article/details/36911203
public class AladdinScript : MonoBehaviour {
public Transform transform;
//GUILabel
public GUIContent[] GUIContents;
//動畫控制器
private Animator animator;
//當前狀態
private string currentState = "";
//獲取動畫控制器
void Start () {
animator = transform.GetComponent<Animator>();
}
void OnGUI()
{
GUILayout.BeginVertical("box");
for(int i = 0;i<GUIContents.Length;i++)
{
//如果點擊了某個狀態的按鈕
if (GUILayout.Button(GUIContents[i]))
{
currentState = GUIContents[i].text;
}
AnimatorStateInfo stateInfo = animator.GetCurrentAnimatorStateInfo(0);
//從Wait->Walk
if (stateInfo.IsName("Base Layer.wait") && currentState.Equals("Walk"))
{
animator.SetBool("WaitToWalk", true);
}
//從Walk->Wait
else if (stateInfo.IsName("Base Layer.walk") && currentState.Equals("Wait"))
{
animator.SetBool("WaitToWalk", false);
}
//從Wait->Run
else if (stateInfo.IsName("Base Layer.wait") && currentState.Equals("Run"))
{
animator.SetBool("WaitToRun", true);
}
//從Run->Wait
else if (stateInfo.IsName("Base Layer.run") && currentState.Equals("Wait"))
{
animator.SetBool("WaitToRun", false);
}
//從Walk->Run
else if (stateInfo.IsName("Base Layer.walk") && currentState.Equals("Run"))
{
animator.SetBool("WalkToRun", true);
}
//從Run->Walk
else if (stateInfo.IsName("Base Layer.run") && currentState.Equals("Walk"))
{
animator.SetBool("WalkToRun", false);
}
}
}
}
運行效果圖如上圖所示。
歡迎關注我的微博
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。