Unity3d 換裝 之 模型動畫分離


在手游中換裝成了越來越不可缺的一個功能,毫無疑問各式各樣的時裝為游戲增添了不同的色彩。

對於2D手游,或許是更換對應的序列幀,也或許是如同3D手游一般,更換模型動畫。

 

對於游戲中的人物,一般分為頭、上身、下身、武器四大部分就可以了。所以在游戲中,我們把這四部分單獨做四個模型動畫,然后動態拼接為一個整體,達到換裝的效果。

 

然后根據動畫制作人員的喜好 又有兩種方式來拼接:

1、每個身體部位自帶動畫數據

2、每個身體部位不帶動畫數據,動畫數據單獨提取出來

 

我們這里介紹第二種。

對於我們這種每一個動作的單獨一個動作數據的方式,要怎么拼合到一個動畫數據。Unity官方文檔有介紹 - 分割動畫

 

[html]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. http://game.ceeger.com/Manual/Splittinganimations.html  


 

 

 

來看我們實際項目中的Project視圖:

 

把每一個動作的動畫數據都單獨提取出來,然后匯總到warrior這一個文件中。

 

讓我們來看看如何加載這些動畫數據和各個部位到游戲中。

 

把四個部位的模型拖到Scene中,可以看到拼成了一個完整的人物

 

但是沒有動作效果,因為這些只是模型骨頭,但是沒有動作數據,從右邊的紅框就看出來。

所以我們需要把動作數據加入到模型中。

點擊右邊的小圓點,在彈出的動畫列表中選擇動畫,比如我選擇的 run ,為四個部位的模型都選擇run。再運行,這是就有了動作。我們的主角在跑動。

 

下面讓我們通過代碼來把動作和模型數據加載進來。

 

首先加載進來模型

 

[html]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. using UnityEngine;  
  2. using System.Collections;  
  3. using System.Collections.Generic;  
  4.   
  5. public class LoadTest : MonoBehaviour {  
  6.   
  7.     // Use this for initialization  
  8.     void Start () {  
  9.         GameObject head = Instantiate(Resources.Load("anim/character/warrior/fashion/head_1")) as GameObject;  
  10.         GameObject jack = Instantiate(Resources.Load("anim/character/warrior/fashion/jacket_1")) as GameObject;  
  11.         GameObject pant = Instantiate(Resources.Load("anim/character/warrior/fashion/pants_1")) as GameObject;  
  12.         GameObject weapon = Instantiate(Resources.Load("anim/character/warrior/fashion/warrior_10l")) as GameObject;  
  13.     }  
  14.       
  15.     // Update is called once per frame  
  16.     void Update () {  
  17.       
  18.     }  
  19. }  


然后加載進來動畫數據:

 

 

[html]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. using UnityEngine;  
  2. using System.Collections;  
  3. using System.Collections.Generic;  
  4.   
  5. public class LoadTest : MonoBehaviour {  
  6.   
  7.     // Use this for initialization  
  8.     void Start () {  
  9.   
  10.         //加載模型;  
  11.         GameObject head = Instantiate(Resources.Load("anim/character/warrior/fashion/head_1")) as GameObject;  
  12.         GameObject jack = Instantiate(Resources.Load("anim/character/warrior/fashion/jacket_1")) as GameObject;  
  13.         GameObject pant = Instantiate(Resources.Load("anim/character/warrior/fashion/pants_1")) as GameObject;  
  14.         GameObject weapon = Instantiate(Resources.Load("anim/character/warrior/fashion/warrior_10l")) as GameObject;  
  15.   
  16.         //加載動作數據;  
  17.         Animation mation = Resources.Load("anim/character/warrior/warrior", typeof(Animation)) as Animation;  
  18.   
  19.         //獲取所有的動作;  
  20.         List<stringanimList = new List<string>();  
  21.         foreach (AnimationState state in mation)  
  22.         {  
  23.             Debug.Log(state.name);  
  24.             animList.Add(state.name);  
  25.   
  26.             //添加到四個部位;  
  27.             head.animation.AddClip(mation.GetClip(state.name),state.name);  
  28.             jack.animation.AddClip(mation.GetClip(state.name), state.name);  
  29.             pant.animation.AddClip(mation.GetClip(state.name), state.name);  
  30.             weapon.animation.AddClip(mation.GetClip(state.name), state.name);  
  31.         }  
  32.   
  33.         head.animation.Play("run");  
  34.         jack.animation.Play("run");  
  35.         pant.animation.Play("run");  
  36.         weapon.animation.Play("run");  
  37.   
  38.   
  39.     }  
  40.       
  41.     // Update is called once per frame  
  42.     void Update () {  
  43.       
  44.     }  
  45. }  


並且播放run 這個動作。

 

來看看效果

 

我們的主角就這樣跑起來了。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM