创建动画控制器操作步骤如下:
1)新建一个Animator Controller,并拖到Player对象上。由于在本场景中将通过动画来控制角色的运动,所以需要勾选Animator Controller组件的Apply Root Motion选项
2)在Parameters中添加如下参数:
1.表示速度的float型参数speed;
2.表示角色运动方向的float型变量Direction
3.表示角色是否处于跳跃状态的bool型变量Jump
4.表示角色是否处于到招呼的bool型变量Hi
3)在Base Layer中新建一个空的动画状态(右键监视框。create empty),重命名为Idle,设置其motion属性为IdleShort,并勾选Foot IK选项
4)在Base Layer中新建一个Blend Tree类型的状态,重命名为Run,并进行双击编辑
选择Parameter为Direction,并设置范围为(-1,1),保持勾选Automate Thresholds选项,然后在Motion列表依次添加RunLeft,Run,RunRight三个动画片段。
5)在Animator编辑器中返回到Base Layer动画层,添加Jump动画片段(把jump拖到监视框就自动生成状态)
6)创建状态间的Transitions(右键状态,MakeTransition):
1.当角色从状态Idel到Run,Speed>0.1,去除HasExitTime项的勾选。反过来就Speed<0.1,去除HasExitTaime勾选。
2.当角色从Run到Jump,,Jump为true,去除HasExitTime选项;;反过来则保留默认条件,即ExitTime为0.9
3.创建HHi状态:在Animator编辑器中新建一个动画层Arm Layer,并在该层上创建Empty和Wave状态,wave状态的motion属性为动画片段Wave
1.角色从状态Empty过度到Wave的条件为参数Hi等于true,同时取消勾选HasExitTime选项
2.反过来保持默认条件,ExitTime的值等于093
学会以上创建后可以试着实现以下功能
人物随机运动
代码如下:
public float AvatarRange=25;
private Animator avatar;
private float SpeedDampTime=.25f;
private float DirectionDampTime=.25f;
private Vector3 TargetPosition=new Vector3(0,0,0);
void Start()
{
avatar=GetComponent<Animator>();
}
void Update()
{
if(avatar)
{
int r=Random.Range(0,50);
avatar.SetBool("Jump",r==20);
avatar.SetBool("Div",r==30);
if(Vector3.Direction(TargetPosition,avatar.rootPosition)>5)
{
animator.SetFloat("Speed",1,SpeedDampTime,Time.deltaTime);
Vector3 curentDir=avatar.rootRotation*Vector3.forward;
Vector3 wantedDir=(TargetPosition-avatar.Position).normalized;
if(Vector3.Dot(curentDir.wantedDir)>0)
avatar.SetFloat("Direction",Vector3.Cross
(avatarDir,wantedDir).y,DirectionDampTime,Time.deltaTime);
else
avatar.SetFloat("Direction",Vector3.Cross(currentDir,wantedDir).y>0?1:-1,DirectionDampTime,Time.deltaTime);
}
else
{
avatar.SetFloat("Speed",0,SpeedDampTime,Time.deltaTime);
if(avatar.GetSpeed("Speed"<0.01f))
TargetPosition=new Vector3(
Random.Range(-AvatarRange,AvatarRange),0,Random.Range(-AvatarRange,AvatarRange));
}
}
}
这里涉及到两个函数,分别使Vector3.Cross和Vector3.Dot。
Vector3.Dot 点积
其中这里Vector3.Dot(a,b)代表b对于a在什么角度,当Vector3.Dot(a,b)>1时代表小于90度,当Vector3.Dot(a,b)<1时代表大于90度。
Vector3.Cross 叉积
叉积的定义: c =a x b 其中a,b,c均为向量。即两个向量的叉积得到的还是向量!
我们可以使用叉积的正负值来判断向量a,b的相对位置,即向量b是处于向量a的顺时针方向还是逆时针方向。