创建动画控制器和实现人物随机运动功能

创建动画控制器操作步骤如下:
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的顺时针方向还是逆时针方向。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值