zoukankan      html  css  js  c++  java
  • 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 这个动作。

    来看看效果

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

  • 相关阅读:
    在浏览器地址栏输入URL,按下回车后究竟发生了什么?
    企业内部DNS跨国配置案例
    Cobbler批量部署CentOS
    入侵检测工具之RKHunter & AIDE
    SSH服务端配置、优化加速、安全防护
    数据传输的加密过程
    mysql怎么让一个存储过程定时执行
    MYSQL中replace的用法
    eclipse 插件
    MySQL定时执行脚本(计划任务)命令实例
  • 原文地址:https://www.cnblogs.com/lancidie/p/5819545.html
Copyright © 2011-2022 走看看