项目实训----Unity多人游戏开发----第五篇

人物控制之动画系统

综述

在上两篇中,我们主要讲述了角色控制的几种方式。本次我们就人物控制后,需要的动画进行阐述人物移动的动画如何进行控制。

项目场景:

提示:主要是针对第一个游戏的动画来探讨动画系统:

动画控制器
动画控制参数

以上两个图主要是涉及动画的执行流程以及控制条件。对于人物刚开始进入保持一个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控制动画的一种方式(也是最为常见的一种方式),处理简单,逻辑清晰。

猜你喜欢

转载自blog.csdn.net/qq_53259920/article/details/125124398
今日推荐