综述
在上两篇中,我们主要讲述了角色控制的几种方式。本次我们就人物控制后,需要的动画进行阐述人物移动的动画如何进行控制。
项目场景:
提示:主要是针对第一个游戏的动画来探讨动画系统:
以上两个图主要是涉及动画的执行流程以及控制条件。对于人物刚开始进入保持一个idel的静止状态,我们需要进行一个判断,通过按键判断是否需要执行移动动画,上面有四个变量,分别控制不同的转换,第一个是速度,第二个是判断是否在地面上,第三个是是否跳跃,第四个是是否死亡。
描述
在该角色中,我们使用了移动加速和跳跃以及下坠的动画,这就需要保证他们的一致性,需要保证条件能够正常转换,以下是一些判断条件
Animator anim; //动画
start中
rb = GetComponent<Rigidbody2D>();
update中
isOnGround = Physics2D.OverlapCircle(groundCheck.transform.position, checkRadius, platform);//判断是否在地上(在平台上)
anim.SetBool("isOnGround", isOnGround);
关于移动动画,使用一个float值进行管理,控制是否切换移动动画或者跑步动画,或者保持静止动画。
rb.velocity = new Vector2(xVelocity * speed, rb.velocity.y);
anim.SetFloat("speed", Mathf.Abs(rb.velocity.x));//跑动动画
执行跳跃动画,在OnCollisionEnter2D的方法中,我们需要判断玩家能够执行跳跃的条件,第一个是要在地面上,第二个就是按下w键,也可以是在一个fan的地面上可以自动执行跳跃。只有这两种情况,才会跳跃。否则不会跳跃。如果和一个标签为“Fan”的东西碰撞了,那玩家保持原有水平方向的速度的同时获得一个向上的10float的速度。
if (other.gameObject.CompareTag("Fan"))
{
rb.velocity = new Vector2(rb.velocity.x, 10f);
}
up = Input.GetAxis("Vertical");
if (up > 0.1 && isOnGround && !other.gameObject.CompareTag("Fan")) //判断是否在地面上,否则不能跳跃
{
rb.velocity = new Vector2(xVelocity * speed, yVelocity * 6.0f);
anim.SetFloat("up", up);//跳跃动画
Debug.Log(up);
}
完成受伤的操作,需要进行一个触发器的判断,使用istrigger来进行判断是否达到死亡条件。该死亡条件是触碰到尖刺物体,人物执行死亡动画。
if (other.gameObject.CompareTag("Spike")) //碰撞到一个标签为spike的物体、铁刺、在unity场景中可以看到TopSpikes内的idle,选中idle就看到inspector里显示着tag:spike
{
anim.SetTrigger("dead"); //触发dead的动画
//PlayerDead();
//playerDead = true;
}
解决方案:
对于动画的执行,可能存在延迟动画的现象,我们采用关闭退出时间的方式来实现动画的切换:
扫描二维码关注公众号,回复: 15117388 查看本文章
如图所示,将hasExitTime勾选去掉。这样动画的切换更加快速。不会造成动画的延迟现象。
总结
本次主要讲述了人物控制方面的一些变量,如果执行的逻辑,以及遇到的一些问题,通过本次学习,主要了解了unity控制动画的一种方式(也是最为常见的一种方式),处理简单,逻辑清晰。