Unity3d 换装 之 模型动画分离

在手游中换装成了越来越不可缺的一个功能,毫无疑问各式各样的时装为游戏增添了不同的色彩。

对于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 这个动作。

来看看效果


我们的主角就这样跑起来了。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值