四、人物动画代码控制

一、连接动画控制器

1、人物基本状态


待机;奔跑

二者之间切换需要一个Bool值(run)

当run为真时,进入奔跑状态;当run为假时,退回待机状态

2、使用代码控制

1、原理

在人物移动代码上,按下一个移动按键,则进行移动动画播放
松开移动按键,取消动画播放。

2、代码

public void Move()
{
	//获取水平和垂直
	InputH = Input.GetAxis("Horizontal");
	InputV = Input.GetAxis("Vertical");
	Direction = new Vector3(InputH, 0, InputV);

	if (Direction.magnitude>=0.1f)//检测是否有玩家输入
	{
		//动画
		Animator1.SetBool("Run",true);


		移动
		//Controller1.Move(Direction*MoveSpeed*Time.deltaTime);

		//计算目标角度
		float TargetAngle = Mathf.Atan2(Direction.x, Direction.z) * Mathf.Rad2Deg
			+ Camera1.transform.eulerAngles.y;//弧度值转为角度值
											  //平滑角度过渡
		float Angle = Mathf.SmoothDampAngle(this.transform.eulerAngles.y, TargetAngle,
			ref TurnSmooth, TurnTime);
		//设置角色旋转
		this.transform.rotation = Quaternion.Euler(0, Angle, 0);
		//计算新的移动方向
		
		Vector3 MoveDirection = Quaternion.Euler(0, TargetAngle, 0) * Vector3.forward;
		
		//移动角色
		Controller1.Move(MoveDirection * MoveSpeed * Time.deltaTime);
	}
	else
	{
		//动画部分
		Animator1.SetBool("Run", false);
	}
	
}

3、动画根运动

使用动画根运动,会导致人物在位移时出现闪现情况
取消勾选根运动,使用代码控制移动

注:使用动画根运动会平滑的进行过渡;但并不是所有的动画都支持根运动;

如果支持,动画在预览时,会出现一定的位移;

如果不支持,动画在预览时,会在原地进行动画播放

解决方法:

将人物身上的动画控制器移至人物的父物体上;

使Ucc和动画控制器和人物脚本在同一物体上挂载;

即可实现使用根运动进行动画播放;

注:如果Ucc和动画控制器不在一个物体上,动画在根运动时会出现UCC与人物模型脱离

二、人物连招

1、实现连招

原理:设置一个计数器,由0~3,一共四个动画,依次计数器加一,进行连招动画播放

瑕疵:播放完一个动画后,下一次进行攻击播放的动画是依然是原来的下一个

解决:计数器清零一下‘

public void DoAttack()
{
	if (Input.GetKeyDown(KeyCode.Mouse0))
	{
		//普通攻击播放动画
		if (ComboNum == 0)
		{
			Animator1.CrossFade("combo1", 0.1f);//跳转CrossFade
			
		}
		else if (ComboNum==1)
        {
			Animator1.CrossFade("combo2", 0.1f);//跳转CrossFade
			
		}
		else if (ComboNum == 2)
		{
			Animator1.CrossFade("combo3", 0.1f);//跳转CrossFade
			
		}
		else
		{
			Animator1.CrossFade("combo4", 0.1f);//跳转CrossFade
			
		}
		//普通攻击连段
		if (ComboNum < 3)
		{
			ComboNum = ComboNum + 1;
		}
		else
		{
			ComboNum = 0;
		}
		
	}
}

将计数器自增放置在if循环外面;

如果每一次都增加一次自增,会使时间复杂度提高

三、断点调试

在VS中下一个断点,选择附加到Unity中

unity中会弹出Debug页面,选择调试Debug,unity页面右下角标志会改变

执行至此页面,会抛出这行

并且显示在哪里调用

四、switch代码替换if else代码

五、普通攻击间隔

如果连点过快会导致人物攻击动画鬼畜

解决方法:

设置一个Bool值,写一个方法,将Bool设置为false;并且延迟执行此方法,实现攻击连贯

初始设置为:未处于攻击间隔

在一个if循环结束后,将状态设置为处于攻击状态;此时无法进入下一个if循环

写一个方法(攻击结束)

在循环中,延迟执行此方法

注:Invoke中第一个参数为name类型,第二个是赋值后的延迟时间

public void AttackEnd()
{
	ISAttacking = false;
}

六、终止攻击动画

1、问题

此时攻击效果为:播放第一第二段动画后,隔一段时间,应该为重新播放第一段动画

但此时为继续播放第三个动画,需要对代码进行修改

2、解决

设置一个攻击的连段时间=》3秒后归为第一个动画

写一个延迟清空攻击的方法

/// <summary>
/// 延迟清空攻击连段
/// </summary>
public void DelayAttackNum()
{
	ComboNum = 0;
}

在循环中进行调用Invoke;但此时会导致一个线程的等待时间未结束,另一个延迟开始

因此需要使用延迟清空方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值