纳金网

标题: Mecanim动画系统 - 使用Blend Trees控制角色动作 [打印本页]

作者: 艾西格亚    时间: 2013-10-4 18:27
标题: Mecanim动画系统 - 使用Blend Trees控制角色动作
本帖最后由 艾西格亚 于 2013-10-9 08:15 编辑

在上一个教程里面我们对于Unity 4自带的Mecanim动画系统已经有了初步的认识,相信很多朋友看过教程后也会发现,原来Mecanim的操作竟然是如此的容易,只需简单的几个步骤就可以将角色的动画复制到其他物件,而这个骨架复制功能在以往是必须借由其他3D软件制作后才能导入Unity使用。

请参考 :五分钟了解Mecanim角色动画系统 - http://www.narkii.com/club/thread-305414-1.html

在第二阶段的教程里面,我们将延续上个教程的动作导入,在模型上面结合更多的动画与脚本的编写,让场景里面的角色真正的动起来。

安装附件的资源包后,将士兵模型(Swat)导入,目前在这个模型上面只有一个idle的基本动画,在Animator的组件里面可以查看到Controller使用的是swatController01的动画控制。

1.jpg

2.jpg

如图所示,这是在运行后士兵模型的idle动作:

3.jpg

接下来,我们需要对几段准备导入的动画进行设置,选择Original_Character > Swat@rifle_run文件,在Rig模式下将Animation Type 更换为Humanoid,Avatar Definition设置为Copy From Other Avatar,在Source栏位里面将设置好的SwatAvatar添加进来。

4.jpg

在Animations的设置内勾选Loop Pose, Root Transform Rotation > Bake into Pose与Root Transform Position(Y) > Bake into Pose、Based Upon 分别设置为Body Orientation与Original,然后按下Clamp Range完成此段动作的分割,最后按下Apply完成设置即可。

5.jpg

接着将以下的几个动画文件也做出与Swat@rifle_run相同的设置:Swat@run_backwards、 Swat@strafe、Swat@strafe_2、Swat@strafe_left、Swat@strafe_right、Swat@walking、与Swat@walking_backwards。

设置完成动画文件之后,需要对士兵模型进行角色控制器的添加,方法是Component > Physics> Character Controller,如图所示,添加角色控制器后在士兵模型上多了一个绿色的胶囊物件。

6.jpg

由于默认的胶囊控制器位置与角色的高度是不匹配的,所以需要进行几个数值的调整,如图所示,将Center Y值设置为0.9的高度,Radius与Height分别设置为0.34与1.79的数值。

7.jpg

在调整数值后,现在角色上面的胶囊控制器已经处在一个正确的位置。

8.jpg

在Project目录内选择swatController01,按下Ctrl +D 复制后将名称更换为swatController02,然后双击此文件打开Animator设置窗口,在空白处点右键选择Create State > Empty创建一个新的State后并更名为Move,如图所示:

9.jpg

双击Move进入编辑模式,按下右下角的+号新增三个Blend Tree,然后将这三个Blend Tree分别命名为StrafeLeft、WalkRun、StrafeRight。

10.jpg

在Animator窗口左下方按+号新增三个Float,分别将其名称更换为xSpeed、zSpeed与Speed,如图所示:

11.jpg

选择WalkRun,按下+号选择Add Motion Field新增五个动作栏位,同时将Parameter更换为zSpeed,表示WalkRun里面的动作设置是对z轴的方向进行判断,然后将Parameter栏位下的两边数值改为-2与2,如图所示:

12.jpg

在新增的五个栏位里分别将run backwards、walking backwards、rifle aiming idle、walking与waklking backwards添加进来,如图所示:

13.jpg

添加后的WalkRun具备了五个动作的设置,Blend Tree要做的就是让这些动作在转换时能以平滑的过渡方式处理,而不是直接从某一个动作直接跳到另一个,否则角色在移动过程中会出现很不自然的现象。

14.jpg

接着在StrafeLeft里面新增三个Motion Field,Parameter设置为xSpeed, 两边的数值为-2与0,然后将strafe、strafe Left与rifle aiming idle添加到这三个栏位。

16.jpg

在StrafeRight里面同样的新增三个Motion Field、Parameter设置为xSpeed, 两边的数值为0与2,然后将rifle aiming idle、strafe right、strafe 2添加到这三个栏位。

17.jpg

Blend Trees的动作设置完成后,接着需要进行Idle与Move的Transition(融接),这里要做的是一个判断的设置,选择Idle,按下右键选Make Transition,然后连接到Move。点选Idle与Move的连接线使其成为蓝色的设置状态。

18.jpg

19.jpg

将Conditions的条件更换为Speed,Greater 01的设置,表示角色的移动数值大于0.1时就切换为Move的动作状态,如图所示:

20.jpg

选择Move,按下右键选Make Transition连接到Idle,再点选连接线使其成为蓝色的设置状态。

21.jpg

将条件的设置更换为Speed , Less 01,表示角色的移动速度小于0.1时就切换到Idle的状态。

22.jpg

完成Blend Tree的设置后,最后就是增加一个动作控制的脚本,这里我们用的是C#来写入角色需使用的脚本内容:

using UnityEngine;
using System.Collections;

public class BasicController02 : MonoBehaviour {

    private Animator animator;
    private CharacterController controller;
    public float transitionTime = 0.25f;
   
    void Start () {
    controller = GetComponent<CharacterController>();
    animator = GetComponent<Animator>();
        if(animator.layerCount >= 2)
        animator.SetLayerWeight(1, 1);
    }
   
    void Update () {
        float accelerator = 1.0f;
        if(controller.isGrounded){
            if (Input.GetKey (KeyCode.RightShift) ||Input.GetKey
    (KeyCode.LeftShift) ){
            accelerator = 2.0f;
            } else if(Input.GetKey (KeyCode.RightAlt) ||Input.
    GetKey (KeyCode.LeftAlt) ){
            accelerator = 1.5f;
        } else {
            accelerator = 1.0f;
        }
        float h = Input.GetAxis("Horizontal");
        float v = Input.GetAxis("Vertical");
        float xSpeed = h * accelerator;
        float zSpeed = v * accelerator;
        animator.SetFloat("xSpeed", xSpeed, transitionTime,
            Time.deltaTime);
        animator.SetFloat("zSpeed", zSpeed, transitionTime,
            Time.deltaTime);
        animator.SetFloat("Speed", Mathf.Sqrt(h*h+v*v),
            transitionTime, Time.deltaTime);
        
        }


选择士兵模型,在Controller的栏位里面添加之前设置好的swatController02,然后将写好的BasicController脚本拖曳到士兵模型即可。

23.jpg

按下Play进行士兵模型的动作测试,用来WASD控制士兵的移动方向,如配合Shift与Alt键则会做出不同程度的加速效果。

24.jpg
25.jpg
26.jpg

更多的Unity技术交流与分享请加入:纳金网Unity论坛专属交流群 - 218689657


Original_Character.zip

15.04 MB, 下载次数: 4706


作者: 狂风大尉    时间: 2013-10-4 20:29
不错的混合式动画流程,谢谢了
作者: may    时间: 2013-10-4 21:44
不错的教程分享
作者: ku    时间: 2013-10-4 22:49
不错的混合式动画流程
作者: Sora    时间: 2013-10-4 22:52
這系統真的好用呢!
作者: 王者再临    时间: 2013-10-5 19:38
很不错的教程,谢谢了!
作者: ZackD    时间: 2013-10-6 14:26
Controller是只能用在两足的模型吧?如果是类似机器人的结构?
作者: may    时间: 2013-10-7 10:15
ZackD 发表于 2013-10-6 14:26
Controller是只能用在两足的模型吧?如果是类似机器人的结构?

估计不能直接套用在非标准的两足模型上
作者: animan    时间: 2013-10-7 21:04
谢谢分享。。。。
作者: cgjch8    时间: 2013-10-8 10:00
不错不错, 欢迎继续
作者: 烟雨    时间: 2013-10-13 02:11
很实用的教程,谢谢了!
作者: nightquasher    时间: 2013-10-13 09:04

很不错的教程,谢谢分享
作者: 狂风大尉    时间: 2013-10-18 20:38
很不错的系列,支持一下
作者: HIDEOKOJIMA    时间: 2013-10-18 21:11
感覺非常實用~
作者: 幸福小猪    时间: 2013-10-28 10:12
感谢楼主分享~
作者: zhangzhen551    时间: 2013-11-17 19:15
我先说下,我设置出来,Threshold这个值设定不了,一直在自动修改,怎么办啊!
作者: zhangfr    时间: 2013-11-18 17:12
讲的很详细啊 楼主幸苦了
作者: cgjch8    时间: 2013-11-18 20:16
这个很不错
作者: 梦魇    时间: 2013-11-19 11:57
不错的教程 先保存着!
作者: aaa120456    时间: 2013-11-19 16:20
这个太厉害了,学习了!!!
作者: crystal7090    时间: 2013-11-19 22:23
不错不错
作者: 张动画    时间: 2013-12-3 13:56
不错的教程分享
作者: xielei69    时间: 2013-12-9 13:33
非常实用
作者: xielei69    时间: 2013-12-11 10:46
很好的教程,谢谢了
作者: fatfatbo    时间: 2013-12-28 16:36
最近在试验那几个2D blend type
作者: selfcom    时间: 2013-12-28 23:52
双击Move进入编辑模式,这一步卡住了,是在inspector面板还是animator面板增加Blend Tree啊
作者: hahahuohuo    时间: 2014-2-20 15:40
请问这个城市环境包在哪里下的,很不错的样子
作者: thebat    时间: 2014-3-21 18:16
为啥只能左右移动不能前后移动啊
作者: 13370104690    时间: 2014-4-11 10:48
多谢楼主分享!!!
作者: 13370104690    时间: 2014-4-11 10:48
多谢楼主分享!!!
作者: kimhwoarang    时间: 2014-4-11 13:42

作者: carefreeq    时间: 2014-9-14 11:48
这个教程有问题,,我照着做会出问题,MOVE的节点,进去最好通过速度判断跑和走的2个节点,然后再在2个节点里面,建立前后左右的节点,再通过X,Z来判断。   如果按教程走的话,动画节点会出问题
作者: 龙影太子    时间: 2014-10-16 14:31
谢谢楼主分享
作者: 龙影太子    时间: 2014-10-16 15:13
谢谢分享,受益很多
作者: spencergong    时间: 2014-11-22 09:53
非常详细呀
作者: oelongeo    时间: 2014-11-22 14:46
非常棒的教程! 学习了
作者: fy0010    时间: 2014-11-26 14:43
Blend tree 的Move那块设置会出问题啊。。。
当Speed达到1的时候,始终会有一个子Blend tree不可使用。
作者: l洛绍川    时间: 2014-12-3 10:18
虽然帖子很久远了,但是我还是想问下楼主关于WalkRun的动画设置,为啥有两个walkingbackwards,难道不应该有个Run吗?虚心求教,希望解惑!
作者: xizhenlong    时间: 2015-1-21 16:31
楼主讲的很清晰 很明了
作者: EnjoyHua    时间: 2015-6-1 14:48
学习了!谢啦
作者: lc10278    时间: 2015-8-31 16:31
感觉素材很吊了,下来试试看




欢迎光临 纳金网 (http://go.narkii.com/club/) Powered by Discuz! X2.5