Unity 从零开始的2D游戏开发 —— [Animator] 使用动画状态机制作简单动画

       动画是一个2D游戏里面必不可少的一部分,使用动画可以实现很多意想不到的功能,除了常规的人物动画,还可以实现一些周期性的运动。接下来会尝试实现一个非帧动画,一个帧动画。


一、非帧动画:通过改变位置或拉伸实现的简单动画

非帧动画一般用于制作人物的移动,以及其他的简单动画,是通过周期的改变物体位置或者拉伸的动画,这种动画需要人物的每部分是分开来组装的,简单的可分为四肢身体和头,复杂的连脚指头都会分开。分开之后通过改变位置或拉伸某个部位,利用Unity自带功能,只要我们设定好一个部位的起点和终点,动画机会帮我们自动模拟出这一过程,实现一个简单的动画。

先在坐标“Add Property”加入想要控制的变量,如果要控制拉伸,那就把Scale加入进来,如果是位置就把Position加入进来,这里我用的是Scale来示例。

之后在时间轴选定时间,改变物体的Scale之后,点击时间轴左边的红框内的按钮,把改动加入到动画里。然后点击左上角的小黑三角形,就可以在scene界面预览到动画的效果了。注意一定要先选时间轴再调整物体的位置大小,否则会改变原来物体的位置。

 


 

二、帧动画:通过改变Sprite的动画

       帧动画可以用来制作一些复杂的动画,比如人物的攻击动画之类的。帧动画不需要人物部位是分开的,可以通过直接修改整体的造型来改变人物的动画,不过帧动画耗费的美术资源较多,比较一个动画少则需要几帧,多则十几帧原画,耗费的资源非常巨大。不过帧动画也常被用来制作一些非人的动画,比如像史莱姆啊这种用普通的改变位置拉伸很难表现出来,但是用帧动画可以画出来比较简单。

帧动画的制作也非常简单,只需要将图片资源从资源管理器直接拖到时间轴对应位置就可以了。

不过帧动画的制作还有另一种方法,因为一般只是修改Sprite就够了,所以也可以用代码来制作帧动画。

 

IEnumerator TestForBlog_Zhidai()
    {
        while(true)
        {
            yield return new WaitForSeconds(0.2f);

            sr.sprite = newsprite;

            yield return new WaitForSeconds(0.2f);

            sr.sprite = oldsprite;

        }
        yield return 0;
        
    }

这里使用一个协程来制作一个0.4s无限循环的帧动画,通过改变SpriteRenderer的Sprite属性来制作动画。

    StartCoroutine("TestForBlog_Zhidai");
    StopCoroutine("TestForBlog_Zhidai");

然后可以用以上第一行代码启动协程启动动画,用第二行代码结束协程退出动画。

这样一个用代码制作的简单帧动画就完成了,不过因为代码制作的帧动画并不能接受动画机的一些参数设置,所以一般用第一种方式来制作,说到动画机,下面就要介绍动画机的基本用法。


三、动画机的基本用法和界面介绍

这里创建了两个动画walk、Slim,但是除了这两个动画之外还有3个,下面就简单说一下这三个的功能

(1)Any State:任意动画,即该层动画里任意的一个动画

(2)Entry:入口,可等同于main函数,是一个动画机的入口,与之连接的是默认动画

(3)Exit:退出,退出该层动画机,可等同于函数中的return

了解了以上三个之后,就大致明白了动画机的基本组成,我们先右键把Slim设置为默认动画,即动画机的入口,一般是一个空动画,然后右键点击Make Transition设置一个传递到walk,这代表着可以从默认动画转移到walk动画,然后从walk也设置一个传递到默认动画。

到这里如果我们什么都不做运行的话,就可以看见两个动画互相转换,这是因为我们没有设置转移条件,我们先点击右上角的+号,添加一个控制变量进来,变量为bool类型,命名为isMoving,逻辑上,当isMoving为真时,应该从默认动画转移为walk动画,为假时反之。

为了实现这种功能,点击从Slim->walk的箭头,会出现如上界面,然后点击红框里的+号添加转移条件,把isMoving添加进来,设置为true,同样的,另一个箭头,把isMoving添加进去,设置为假,这样两个箭头的转移条件就都设置完毕了。

这样一个简单的动画机就设置完毕了,之后我们只需要在代码中控制变量的值就可以实现动画的切换了。

if (rig.velocity.x != 0)
        {
            animator.SetBool("isMoving", true);
        }
        else
        {
            animator.SetBool("isMoving", false);
        }

在这里检测刚体的速度是否为0来反映目标是不是在移动,获取物体的animator组件,通过set参数来控制变量,最后控制动画的转移。

在动画机中除了bool还有float,int以及trigger,trigger是一个触发器,经常用来控制攻击的动画,一旦触发,他会执行一次动画之后重新置假。


本篇到此为止,动画机是unity的难点之一,除了要了解动画机的基本操作,还得使用代码进行控制,本篇博客旨在入门2D动画的基础,动画机还有很多设置可供大家了解和学习。

 

 

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值