- 最后登录
- 2024-11-17
- 注册时间
- 2012-8-10
- 阅读权限
- 100
- 积分
- 74994
  
- 纳金币
- 59338
- 精华
- 28
|
pstatus"> 本帖最后由 艾西格亚 于 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的动画控制。
如图所示,这是在运行后士兵模型的idle动作:
接下来,我们需要对几段准备导入的动画进行设置,选择Original_Character > Swat@rifle_run文件,在Rig模式下将Animation Type 更换为Humanoid,Avatar Definition设置为Copy From Other Avatar,在Source栏位里面将设置好的SwatAvatar添加进来。
在Animations的设置内勾选Loop Pose, Root Transform Rotation > Bake into Pose与Root Transform Position(Y) > Bake into Pose、Based Upon 分别设置为Body Orientation与Original,然后按下Clamp Range完成此段动作的分割,最后按下Apply完成设置即可。
接着将以下的几个动画文件也做出与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,如图所示,添加角色控制器后在士兵模型上多了一个绿色的胶囊物件。
由于默认的胶囊控制器位置与角色的高度是不匹配的,所以需要进行几个数值的调整,如图所示,将Center Y值设置为0.9的高度,Radius与Height分别设置为0.34与1.79的数值。
在调整数值后,现在角色上面的胶囊控制器已经处在一个正确的位置。
在Project目录内选择swatController01,按下Ctrl +D 复制后将名称更换为swatController02,然后双击此文件打开Animator设置窗口,在空白处点右键选择Create State > Empty创建一个新的State后并更名为Move,如图所示:
双击Move进入编辑模式,按下右下角的+号新增三个Blend Tree,然后将这三个Blend Tree分别命名为StrafeLeft、WalkRun、StrafeRight。
在Animator窗口左下方按+号新增三个Float,分别将其名称更换为xSpeed、zSpeed与Speed,如图所示:
选择WalkRun,按下+号选择Add Motion Field新增五个动作栏位,同时将Parameter更换为zSpeed,表示WalkRun里面的动作设置是对z轴的方向进行判断,然后将Parameter栏位下的两边数值改为-2与2,如图所示:
在新增的五个栏位里分别将run backwards、walking backwards、rifle aiming idle、walking与waklking backwards添加进来,如图所示:
添加后的WalkRun具备了五个动作的设置,Blend Tree要做的就是让这些动作在转换时能以平滑的过渡方式处理,而不是直接从某一个动作直接跳到另一个,否则角色在移动过程中会出现很不自然的现象。
接着在StrafeLeft里面新增三个Motion Field,Parameter设置为xSpeed, 两边的数值为-2与0,然后将strafe、strafe Left与rifle aiming idle添加到这三个栏位。
在StrafeRight里面同样的新增三个Motion Field、Parameter设置为xSpeed, 两边的数值为0与2,然后将rifle aiming idle、strafe right、strafe 2添加到这三个栏位。
Blend Trees的动作设置完成后,接着需要进行Idle与Move的Transition(融接),这里要做的是一个判断的设置,选择Idle,按下右键选Make Transition,然后连接到Move。点选Idle与Move的连接线使其成为蓝色的设置状态。
将Conditions的条件更换为Speed,Greater 01的设置,表示角色的移动数值大于0.1时就切换为Move的动作状态,如图所示:
选择Move,按下右键选Make Transition连接到Idle,再点选连接线使其成为蓝色的设置状态。
将条件的设置更换为Speed , Less 01,表示角色的移动速度小于0.1时就切换到Idle的状态。
完成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脚本拖曳到士兵模型即可。
按下Play进行士兵模型的动作测试,用来WASD控制士兵的移动方向,如配合Shift与Alt键则会做出不同程度的加速效果。
更多的Unity技术交流与分享请加入:纳金网Unity论坛专属交流群 - 218689657
|
|