U3D角色动画

版权声明:本文为博主原创文章,转载请注明出处http://blog.csdn.net/blues1021。 https://blog.csdn.net/Blues1021/article/details/78162091

1.角色

导入角色控制器资源,有第一人称和第三人称prefab及移动组件。
1)基本的CharacterController
3D角色的旋转跟着鼠标轴旋转。
CharacterController move移动,tr.Rotate旋转和OnControllerColliderHit 碰撞处理。
Input.GetAxis("Mouse X") 屏幕上从左往右是正值,从右往左是负值。
Input.GetAxis("Mouse Y") 从下往上是正值(希望向天空,所以绕x取负),从上往下是负值(希望向地下,所以绕x去正)
if (axes == RotationAxes.MouseXAndY)
{
float rotationX = transform.localEulerAngles.y + Input.GetAxis("Mouse X") * sensitivityX;
rotationY += Input.GetAxis("Mouse Y") * sensitivityY;
rotationY = Mathf.Clamp (rotationY, minimumY, maximumY);
transform.localEulerAngles = new Vector3(-rotationY, rotationX, 0);
}
var directionVector = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));
motor.inputMoveDirection = transform.rotation * directionVector;
motor.inputJump = Input.GetButton("Jump");
controller = GetComponent (CharacterController);
controller.Move(moveDistance);
tr.Rotate(0, yRotation, 0);
function OnControllerColliderHit (hit : ControllerColliderHit) {
}
var slopeSpeedMultiplier : AnimationCurve = AnimationCurve(Keyframe(-90, 1), Keyframe(0, 1), Keyframe(90, 0));
var movementSlopeAngle = Mathf.Asin(movement.velocity.normalized.y) * Mathf.Rad2Deg;
var maxSpeed *= movement.slopeSpeedMultiplier.Evaluate(movementSlopeAngle);

A CharacterController allows you to easily do movement constrained by collisions without having to deal with a rigidbody.
A CharacterController is not affected by forces and will only move when you call theMove funtion. It will then carry out the movement but be constrained by collisions.
角色往下掉,添加collider底,在CharacterController中调整y值和height值,可以保证不会往下掉。

2.mecanim动画(avatar映射拖动,IK子到父/Apply root motion, 混合树参数)

人形角色的简易的工作流程和动画创作能力,avatar的创建和肌肉的定义和调整。
支持动画重定向将一个动画从一个角色模型应用到另一个角色模型上。
animation clip动画和过渡的预览能力, animator复杂动画交互的可视化的编辑工具。
通过不同逻辑控制身体不同部位运动的能力。

主要是导入设置,状态机,混合树的编辑,代码的控制。
网格模型(法线和纹理),关节层级和关节动画信息,网格模型和关节层级关联起来称为蒙皮。
导入时候:分为已分解的动画,未分解的动画(需要按+指定start end帧数)。点击模型文件或点击动画文件可以进行编辑。或将动画片段拖入到animate controller中进行编辑。
avatar:
创建动画的基本步骤就是将用户导入的模型的骨架结构和mecanim预定义的简单人形骨架结构的映射,该映射称为avatar, 因为是编辑动画基于骨骼绑定识别,识别了以后才能进行动画的编辑。
设置Rig为humanoid,匹配关键骨骼匹配成功后有configure打勾显示,点击可以进行配置。需要调节非关键骨骼mapping和肌肉信息需要手动调整,configure没有匹配成功也要手动调整avatar,scene视图中将显示模型骨骼,肌肉和动画信息。
avatar mapping设置:骨骼实心是必选的骨骼,虚心是非必选骨骼。骨骼命名要一致,方便识别。
用左下角的Mapping和Pose命令:
得到模型原始姿势Pose->Sample Bind Pose。
基于原始姿势创建一个骨骼映射Mapping->Automap。
强制模型接近T-Pose姿势Mapping->Enforce T Pose。
如果还是不行,可以自己拖动场景中的hierarchy下模型节点,如LeftLeg到avatar中预定义的骨骼位置
左下的Mapping,有save和load菜单,可以对 avatar mapping匹配文件保存为.ht文件,可以加载进来,避免重新拖拽映射(例如对于某个动画师用他习惯的命名方式制作的动画)。
Muscles选项卡,U3D通过肌肉来限定不同骨骼的运动范围,其实调整的是骨骼的运动范围,可以直接使用reset也可以单独调整每根骨骼的运动范围。

Animation选项卡中可以增加Clips调整帧数位置(拖拽绿色则是循环前后姿势旋转位置匹配),在Mask中humanoid中点击某个模块那么该动画clip会屏蔽掉,方便角色持有道具的动画需求(红色则是被屏蔽的部分)。可以保存.mask公用。也可以开启和关闭IK功能(IK是反向动力学是从子物体驱动父物体的变换,确保所有父物体节点在正确的位置,unity pro版本设置了人形avatar才支持
http://blog.csdn.net/yupu56/article/details/53382046例如握住物体,角色跟随物体运动。

导入的角色模型有:模型和avatar, animator, animation clips, charactor controller等。
角色重定向,在都是人形模型动画前提下,在一个模型中引用另外一个模型的controller资源。

普通生物动画类型,可以指定root,root用来建立多个animation clip之间的关系和混合,还可以用来区分骨骼动画和根节点运动具有重要意义(用OnAnimationMove进行控制)。

Scene中:
Animator组件引用动画控制器/avatar/root motion,包含状态机,混合树和脚本用的Events。
(1) 如果【Apply Root Motion】选中:则角色在原地跑步,且Transform中的值没有任何变化
( 2) 如果【Apply Root Motion】选中:则角色在场景中跑步,且Transform中的值跟随变化 
cull mode用base on rendereds是在角色看不见时候,只有根节点运动,其它节点不运动,有利于提高性能。
Animator窗口中:
Animator controller参数,动画状态包括速度和animation clip引用(可以通过导入的模型文件下animation页签进行处理),IK设置。过渡条件如果是时间那么0.9是前面动画播放到90%时候进行切换,如果是其它过渡条件在代码中设置即可进行切换。拖动两个动画之间的重叠区域来调节两个动画的过渡情况
animator中的参数,除了可以用来做动画的过渡条件参数,也可以用来做其它的用途(如速度,方向等)。

混合树,一个动画状态,可以混合多个animation clip作为一个动画状态,例如混合倾倒和跑步得到角色绕圈跑步的动画效果。双击混合树状态进入编辑,可以指定blend type(1D是一个参数,2D是两个参数一般指运动方向), 控制参数,增加需要混合的多个animation clip引用,拖动红线控制混合比例参数,点击下方的播放预览效果,得到自己需要的控制参数后保存或在代码中调用改变即可。

实践:模型的动画导入需要在资源视图中选中模型进行编辑;animation controller是要手动在project资源视图中创建的; 混合树的threshold中的值可以通过去选automate threshold进行编辑。
animator.SetBool("Jump", false);
animator.SetBool("Hi", !animator.GetBool("Hi"));
animator.SetFloat("Speed", h*h+v*v);
animator.SetFloat("Direction", h, DirectionDampTime, Time.deltaTime);
animator.SetTrigger("xxx", true);

或:
privateint jump = Animator.StringToHash("Jump");
privateint runState = Animator.StringToHash("Base Layer.Run");
_animator.SetTrigger(jump); // 通过id而不是字符串可以提高性能
在Unity5.0中,我们可以给Animator Controller中的每个State添加脚本了,类似于专门用于GameObject的MonoBehavior,State可以添加State Machine Behavior,也可以在动画层上添加
publicclass StateScript : StateMachineBehaviour
{
}
unity5中还可以设置动画的过渡是否可以中断,是否可以直接跳转到下一个状态还是要等待播放完毕。
层级控制是为了使用avatar mask的,层级weight是类似混合的动画的效果。
AnimatorStateInfo stateInfo = animator.GetCurrentAnimatorStateInfo(0);
if (stateInfo.IsName("Base Layer.Run"))
{
默认的Base Layer必须为1。如果设置为0则当前层的动画不会播放,1则会播放,0-1之间会采用类似融合的情况来播放动画,比如之前的招手的例子,如果设置为0.5则招手动画播放时手部只会抬到脖子附近。
动画混合方式:
  • Override:覆盖,表示当前层的动画会覆盖掉其它层的动画,比如招手播放时右手就不能播放其它的动画了;
  • Additive:添加,表示当前层的动画的量添加到其它层的动画,比如招手播放时,手部奔跑或站立的甩动也会保留;
Sync是同步复制其它层的效果。
使用动画片断混合和动画层混合结合avatar mask可以做出复杂的动画效果

动画重定向效果,拖入一个新的模型,然后选中导入为humanoid类型,创建编辑其avatar。将之前编辑好的controller拖入角色的animator controller组件中,就可以进行动画文件的复用

avatar是模型骨骼和引擎预定义骨骼之间的映射指定。IK是动画clip由子到父的顺序进行插值运算。混合树是多个动画clip之间进行混合(组合)为一个动画。动画层次是为了在不同avatar mask下的动画或在不同的层之间进行动画的混合(组合)。动画重定向是动画控制器的重用,前提是avatar骨骼绑定类似所以一定是人形动画,主要是动画状态过渡条件,混合树,动画层次的复用,不同人形模型可以有自己的avatar,动画层级的avatar mask应该是公用的。

没有更多推荐了,返回首页