Unity3D腳印6——模型動畫

原地址:http://www.cnblogs.com/ybgame/archive/2013/02/21/2920009.htmlhtml

 

如何導入一個模型,導入的模型在unity3d的project面板中是怎樣顯示的?包含什麼內容?如何加載到場景中?怎樣去控制它?模型和動畫之間的關係?web

 
 
 
 
【模型導入】:
 
Unity能夠讀取fbx,dae,3ds,dxf,obj等格式的文件,能夠在這裏找到FBX導出器,

http://usa.autodesk.com/fbx/算法


每個被導入的項目中的模型,都包含下面這些東西:
 
Meshes 網格,每一個模型都是由無數的三角面組合而成
 
相關選項:
Scale Factor 縮放係數 調整模型的比例
Use File Units 使用此文件單位 只適用於3dsMax文件,啓用時1Max=1Unity,不然1釐米Max=1Unity
Mesh Compression 網格壓縮 在差別容許的範圍內,儘可能調高這個值
Mesh Optimization 網格優化 決定網格中的三角形排列順序
Generate Colliders 生成碰撞體 是否生成網格碰撞體
Swap UVs 交換UV 當有光照貼圖的物體的UV通道不正確時啓用此選項
Generate Lightmap UVs 產生光照貼圖UV 爲光照貼圖建立第二個UV通道
 
Normals & Tangents 法線和切線,這主要是用來描述三角面朝向用的,能夠應用在裁切(只顯示正面,不顯示背面)光照上
 
相關選項:
Normals 法線 默認導入法線,可選Calculate根據平滑度計算法線,也可禁用
Tangents 切線 當啓用法線時,切線纔有做用,默認爲自動計算,能夠選擇導入和禁用
Smoothing Angle 平滑角 設置邊角的平滑程度,用來切分法線貼圖切線?
Split Tangents 分離切線 若是您的網格上的接縫破壞了法線貼圖光照,啓用此選項。這一般只適用於角色
 
Materials 材質,主要是描述顏色,在各類光照效果下的顯示,以及上面的貼圖!
 
相關選項:
Import Materials 導入材質 禁用則全部材質爲漫反射
Material Naming 材質命名 貼圖名,材質名,模型-材質名等等命名方式
Material Search 材質搜索 決定如何根據材質命名查找已有的材質
 
Animations 動畫,若是這個文件附帶了動畫的話,能夠在這裏看到
 
相關選項:
Generation 生成 控制動畫的導入,以及動畫存儲的位置(Root仍是Node)
Bake Animations 烘焙動畫 用於使用了IK的動畫
Animation Wrap mode 動畫循環模式 
Split Animations 分割動畫
Anim.Compression 動畫壓縮的方法
Anim.Compression.Errors 當壓縮關鍵幀的時候,設置偏差控制
 
須要注意的是!咱們導入的模型,並不包含貼圖,要導入一個模型須要同時導入模型材質用到的貼圖! u3d搜索貼圖的規則是模型所在路徑下的Textures文件夾,而後逐步搜索上級目錄的Textures文件夾,搜索不到就進行全局搜索(慢,並且當兩張紋理同名的話,可能會找錯)
 
每個導入的材質,Unity使用下列規則:
 
1. 若是禁用了導入材質選項,全部材質默認爲漫反射材質
2. 根據材質名設置爲Unity的材質名
3. 在已有的材質中尋找名字相同的材質
4. 找到該材質則直接賦給對象,不然生成新的材質
 
Unity提供了兩種碰撞器,一種Mesh Colliders 網格碰撞器,能夠精確地檢測碰撞,而Primitive Colliders 原始碰撞器,雖然沒有前者精確,但效率高不少,應該儘可能使用這種

若是你有一個從高精度多邊形版本生成的帶法線貼圖的角色,你應該以180度的平滑角度(Smoothing angel)導入此角色的遊戲質量版本。這將防止因爲切線切割在光照中產生的奇怪的接縫。若是在應用了這些設置後仍然存在接縫,啓用在UV接縫處分割切線選項(Split tangents across UV seams)。編輯器

【動畫導入】ide

Maya的.mb,.ma文件,Cinema 4D的c4d文件和fbx文件都支持導出動畫,當咱們導入這些模型的時候,能夠順帶導入動畫
 
1.分割動畫 使用動畫分割導入動畫,全部的動做都放在同一個模型中,最爲節省資源,導入模型的時候,分割動畫會被自動導入,能夠在拆分動畫表中看到全部的動畫片斷
 
2.@動畫 建立單獨的模型文件,並按照"模型名"@"動畫名".fbx這樣的格式命名,導入模型文件時,Unity會自動導入該模型相關的動畫文件,在導出這樣的文件時,單獨導出模型,另外再導出全部動做的剪輯。
 
3.反向動力學 設置烘焙IK和仿真箱????
 
【動畫腳本】
 

若是想播放一個簡單的動畫,可使用Animation.Play;
若是想在動畫之間交叉淡入,可使用Animation.CrossFade;
若是想改變更畫模式(循環,一次,乒乓),能夠改變更畫導入設置裏面的動畫幀的WrapMode,或者在運行時改變AnimationState.wrapMode的值;
AnimationState能夠用於改變更畫的層,修改播放速度,而且直接控制融合與混合。工具

動畫疊加,混合,分層等等——參考u3d的hello world——angrybots
 
Animation是一個組件,能夠被添加到GameObject上,當咱們把腳本掛載到一個GameObject上的時候,能夠經過animation成員變量來訪問掛載在它身上的動畫,動畫的方法有這些
動畫融合:
    用於確保角色的平滑動畫,當咱們在遊戲中要從一個動畫過渡的另一個動畫,咱們不但願這兩個動做之間是忽然跳轉,而但願平滑地過渡。
 
    咱們使用CrossFade("animate name")來平滑地切換到另一個動畫( 這中間多是作了一個補間動畫
 
動畫層:
    層容許羣組動畫和優先級別,動畫之間的過渡,能夠用CrossFade或者指定手工融合權重來自動處理動畫的權重,當兩個動畫的權重都是100%,Unity生成最終動畫會規格化權重,這意味着二者都佔50%的權重,但在考慮優先級的狀況下,須要設置哪一個動畫的權重更高,還要確保權重之和爲100%,使用層的話會容易不少。
 
    要作到這點最簡單的方法是在射擊時簡單的保持行走和空閒動畫,而後咱們須要確保射擊動畫比空閒和行走動畫在更高的層。這意思是射擊動畫將首先接收融合權重。行走和空閒動畫僅當射擊動畫不使用融合權重100%時,接收權重。所以,交叉淡入淡出射擊動畫時,權重將從0開始很短期內變爲100%,在開始時步行和空閒層仍然會收到融合權重,但當射擊動畫徹底切入時,它們再也不接收權重,這正是咱們所須要的!
 
複製代碼
 1 function Start () {
 2    // Set all animations to loop
 3    animation.wrapMode = WrapMode.Loop;
 4    // except shooting
 5    animation["shoot"].wrapMode = WrapMode.Once;
 6 
 7    // Put idle and walk into lower layers (The default layer is always 0)
 8    // This will do two things
 9    // - Since shoot and idle/walk are in different layers they will not affect
10    //   each other's playback when calling CrossFade.
11    // - Since shoot is in a higher layer, the animation will replace idle/walk
12    //   animations when faded in.
13    animation["shoot"].layer = 1;
14 
15    // Stop animations that are already playing
16    //(In case user forgot to disable play automatically)
17    animation.Stop();
18 }
19 
20 function Update () {
21    // Based on the key that is pressed,
22    // play the walk animation or the idle animation
23    if (Mathf.Abs(Input.GetAxis("Vertical")) > 0.1)
24       animation.CrossFade("walk");
25    else
26       animation.CrossFade("idle");
27 
28    // Shoot
29    if (Input.GetButtonDown ("Fire1"))
30       animation.CrossFade("shoot");
31 } 
複製代碼

 

Animation Playback and Sampling 動畫播放和取樣:
    取樣這個詞可能不大好理解,取樣在Unity裏面是涉及到渲染的一個術語,就是對像素取樣來進行綜合運算,咱們的動畫是在不斷運動的,將動畫當前的運動狀態提取出來,並渲染到屏幕上,這是我理解的取樣。
    咱們在3ds Max或者Maya等模型編輯工具中編輯一個動畫,咱們按照某個幀速率(FPS)來建立這個動畫,在動畫被導入到U3D的時候,這個幀速率也會被導入,因此會跟編輯器的速率保持一致。

    但咱們遊戲的運行幀速率並不穩定,可能有硬件的緣由或者要渲染的對象,處理的邏輯複雜度不同,而致使的幀速率不穩定,若是咱們按照它設定的幀率來播放,動畫就會一卡一卡的。Unity是在變化的幀頻中對動畫進行取樣,而不在製做時的幀頻。3D電腦圖形動畫不是由分散的動畫組成,而是連續的曲線。這些曲線可讓咱們在任什麼時候間點取樣,而不僅是對應某一個原始幀的時間點。這樣當咱們的電腦比較快的時候,動畫將會更加地平滑和流暢。
    對於大多數的實際應用,事實上Unity對變化幀速的採樣不是咱們須要關切的,然而,若是你的某個遊戲邏輯依賴於動畫變換或屬性的動畫在一個很是特殊的配置,那必須知道這一點。例如,若是有一個動畫是把一個物體30幀內從0旋轉到180度,想從代碼中知道當它已達到了一半,你不能寫一段條件語句來檢查如今旋轉值是否是90度。由於 
Unity 依照遊戲的變化速率來對動畫取樣,它可能在旋轉快到90度時進行取樣,或恰好過90度的時候取樣。當在一個動畫指定一個點到達時,須要通知, 應該使用AnimationEvent來代替。
    還要注意的變化幀速率採樣的結果,一個使用WrapMode.Once模式播放的動畫的採樣不必定是精確的最後一幀。在遊戲中頗有多是恰好結束前的某一幀,在下一幀時間可能超過動畫的長度,因此它被禁用,而再也不採樣。若是須要動畫的最後一幀取樣精確,你可使用WrapMode.ClampForever。 
如在這種狀況下,動畫在這種狀況下,動畫將保持無限取樣最後一幀,直到你中止動畫。
 
【動畫視圖】
 
 
按下Ctrl+6,能夠彈出動畫編輯視圖,選擇Hierarchy面板上的任意對象,能夠編輯它們的動畫。
 
 
詳情參考 動畫視圖  http://game.ceeger.com/Manual/Animation.html
相關文章
相關標籤/搜索