Mecanim动画系统 - 使用Blend Trees控制角色动作

来源:互联网 发布:软件项目研究开发方法 编辑:程序博客网 时间:2024/05/23 00:09

http://www.narkii.com/club/thread-305557-1.html

在上一个教程里面我们对于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(); animator = GetComponent(); 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

0 0