在手游中換裝成了越來越不可缺的一個功能,毫無疑問各式各樣的時裝為游戲增添了不同的色彩。
對於2D手游,或許是更換對應的序列幀,也或許是如同3D手游一般,更換模型動畫。
對於游戲中的人物,一般分為頭、上身、下身、武器四大部分就可以了。所以在游戲中,我們把這四部分單獨做四個模型動畫,然后動態拼接為一個整體,達到換裝的效果。
然后根據動畫制作人員的喜好 又有兩種方式來拼接:
1、每個身體部位自帶動畫數據
2、每個身體部位不帶動畫數據,動畫數據單獨提取出來
我們這里介紹第二種。
對於我們這種每一個動作的單獨一個動作數據的方式,要怎么拼合到一個動畫數據。Unity官方文檔有介紹 - 分割動畫
- http://game.ceeger.com/Manual/Splittinganimations.html

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

把每一個動作的動畫數據都單獨提取出來,然后匯總到warrior這一個文件中。
讓我們來看看如何加載這些動畫數據和各個部位到游戲中。
把四個部位的模型拖到Scene中,可以看到拼成了一個完整的人物

但是沒有動作效果,因為這些只是模型骨頭,但是沒有動作數據,從右邊的紅框就看出來。
所以我們需要把動作數據加入到模型中。

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

下面讓我們通過代碼來把動作和模型數據加載進來。
首先加載進來模型
- using UnityEngine;
- using System.Collections;
- using System.Collections.Generic;
- public class LoadTest : MonoBehaviour {
- // Use this for initialization
- void Start () {
- GameObject head = Instantiate(Resources.Load("anim/character/warrior/fashion/head_1")) as GameObject;
- GameObject jack = Instantiate(Resources.Load("anim/character/warrior/fashion/jacket_1")) as GameObject;
- GameObject pant = Instantiate(Resources.Load("anim/character/warrior/fashion/pants_1")) as GameObject;
- GameObject weapon = Instantiate(Resources.Load("anim/character/warrior/fashion/warrior_10l")) as GameObject;
- }
- // Update is called once per frame
- void Update () {
- }
- }
然后加載進來動畫數據:
- using UnityEngine;
- using System.Collections;
- using System.Collections.Generic;
- public class LoadTest : MonoBehaviour {
- // Use this for initialization
- void Start () {
- //加載模型;
- GameObject head = Instantiate(Resources.Load("anim/character/warrior/fashion/head_1")) as GameObject;
- GameObject jack = Instantiate(Resources.Load("anim/character/warrior/fashion/jacket_1")) as GameObject;
- GameObject pant = Instantiate(Resources.Load("anim/character/warrior/fashion/pants_1")) as GameObject;
- GameObject weapon = Instantiate(Resources.Load("anim/character/warrior/fashion/warrior_10l")) as GameObject;
- //加載動作數據;
- Animation mation = Resources.Load("anim/character/warrior/warrior", typeof(Animation)) as Animation;
- //獲取所有的動作;
- List<string> animList = new List<string>();
- foreach (AnimationState state in mation)
- {
- Debug.Log(state.name);
- animList.Add(state.name);
- //添加到四個部位;
- head.animation.AddClip(mation.GetClip(state.name),state.name);
- jack.animation.AddClip(mation.GetClip(state.name), state.name);
- pant.animation.AddClip(mation.GetClip(state.name), state.name);
- weapon.animation.AddClip(mation.GetClip(state.name), state.name);
- }
- head.animation.Play("run");
- jack.animation.Play("run");
- pant.animation.Play("run");
- weapon.animation.Play("run");
- }
- // Update is called once per frame
- void Update () {
- }
- }
並且播放run 這個動作。
來看看效果

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