Unity 游戏入门 九、 精灵动画 Sprite Animation

2023-11-17

1.Animator

为了在游戏对象上有动画,需要添加一个组件Animator。

在工程窗口中,双击Robot  预制体。

如图所示,添加Animator组件。

2.Creating a New Controller

在工程窗口Animator文件夹中,右击新建Robot脚本,并应用到Animator上。

点右上角保存按钮。

3.动画Animations

为了在Unity Editor中建立动画,可以使用Animation window,在预制体中选择Robot ,点Window > Animation > Animation。

出现“To begin animating [Prefab/GameObject name], create an Animation Clip”, 点Create。

在Animations 文件夹中,建立RobotLeft.anim动画片段。

如上图,左边为动画属性,右边为动画 的关键帧。

4.修改精灵Changing a Sprite

在Art > Sprites > Characters中,可以找到MrClockworkSheet 。在单个图片中可以找到多个精灵。

按住shift键不放,选择MrClockworkWalkSides1,MrClockworkWalkSides2,MrClockworkWalkSides3,MrClockworkWalkSides4。将这些拖到动画窗口中。

点play看下效果。

设置Samples 为4,以使精灵运行正常。

5.建立一个动画 Creating an Animation

在上图左边点击Create New Clip,名为Right_Run,选择Animation 文件夹。

重新创建Left animation,并将四个精灵拖上去,并设置Samples 为4。点增加属性,从Sprite Renderer找到Flip X。

勾选上属性选项,

重复操作建立running up和running down。

6.建立一个脚本  Building the Controller

在工程窗口中,选中Robot预制体,点Windows > Animation > Animator。

上图左边中的层用于3D动画,参数用于向脚本传递信息。

动画状态机是动画的所有状态图,可以从一种状态转到另一个状态。

另一种方式是混合树,可以通过参数从一种状态转到另一种状态。可以通过方向参数来控制动画。

7.使用混合树 Using a Blend Tree

删除所有动画,右击Create State > From New Blend Tree,创建Blend Tree。

双击Blend Tree,点Blend Tree结点,打开如下图。

修改Blend Type类型为2D Simple Directional。

8.Parameters Move X and Move Y

在动画窗口中,点击参数。

点float类型Move X,和Move Y。点混合树视图,显示如下:

点右上角的加号,点Add Motion Field ,增加4个点,并调整它们的位置。

  • Left : Pos X = -0.5 Pos Y = 0,Right: Pos X = 0.5 Pos Y = 0,Up: Pos X = 0 Pos Y = 0.5,Down: Pos X = 0 Pos Y = -0.5

调整后的图为

图像代表着混合,每个点代表一个片断,红点代表参数所给的位置前、后、左、右。

9.将参数发送给Animator脚本 Sending parameters to the Animator Controller

打开EnemyController 脚本,增加

Animator animator;

通过

animator.SetFloat("Move X", 0);
animator.SetFloat("Move Y", direction);

给Animator 传送方向。

10.设置主要脚色的动画  Setting Animation for the Main Character

在Ruby预制体中,增加Animator 组件,并指定Animation 文件夹中的动画Animator 组件的动画。现在Ruby的动画类似于下图。

在图上,精灵有三种状态:移动Moving、静止Idle、和其他物体有冲突时Hit。白色的代表了状态的转换。双击白线,可以看到如下的状态转换图。

上图中的Has Exit Time不有被选中。这意味着移动动画不会等到完成状态机变为空闲动画之前,它会立即更改。

最重要的最下面的Conditions 。如果没有它的话,转变将会在动画的最后发生。

11.修改代码如下Modifying the RubyController Script

1 增加Animator变量

2增加Vector2 变量 lookDirection 并初始化为 (1,0),里面有两个方向参数Look X 和a Look Y。

3 通过animator.SetTrigger("Hit");触发点击动画。

12.完整的脚本如下 Check Your Scripts

public class RubyController : MonoBehaviour
{
    public float speed = 3.0f;
    
    public int maxHealth = 5;
    public float timeInvincible = 2.0f;

    public int health { get { return currentHealth; }}
    int currentHealth;
    
    bool isInvincible;
    float invincibleTimer;
    
    Rigidbody2D rigidbody2d;
    float horizontal;
    float vertical;
    
    Animator animator;
    Vector2 lookDirection = new Vector2(1,0);
    
    // Start is called before the first frame update
    void Start()
    {
        rigidbody2d = GetComponent<Rigidbody2D>();
        animator = GetComponent<Animator>();
        
        currentHealth = maxHealth;
    }

    // Update is called once per frame
    void Update()
    {
        horizontal = Input.GetAxis("Horizontal");
        vertical = Input.GetAxis("Vertical");
        
        Vector2 move = new Vector2(horizontal, vertical);
        
        if(!Mathf.Approximately(move.x, 0.0f) || !Mathf.Approximately(move.y, 0.0f))
        {
            lookDirection.Set(move.x, move.y);
            lookDirection.Normalize();
        }
        
        animator.SetFloat("Look X", lookDirection.x);
        animator.SetFloat("Look Y", lookDirection.y);
        animator.SetFloat("Speed", move.magnitude);
        
        if (isInvincible)
        {
            invincibleTimer -= Time.deltaTime;
            if (invincibleTimer < 0)
                isInvincible = false;
        }
    }
    
    void FixedUpdate()
    {
        Vector2 position = rigidbody2d.position;
        position.x = position.x + speed * horizontal * Time.deltaTime;
        position.y = position.y + speed * vertical * Time.deltaTime;

        rigidbody2d.MovePosition(position);
    }

    public void ChangeHealth(int amount)
    {
        if (amount < 0)
        {
            animator.SetTrigger("Hit");
            if (isInvincible)
                return;
            
            isInvincible = true;
            invincibleTimer = timeInvincible;
        }
        
        currentHealth = Mathf.Clamp(currentHealth + amount, 0, maxHealth);
        Debug.Log(currentHealth + "/" + maxHealth);
    }
}

动画片段是进行动画的部分。通过状态机来表示动画之间的关联。通过Animator 来在控制器中进行动画的演示。下一章将进行发射炮弹的演示。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Unity 游戏入门 九、 精灵动画 Sprite Animation 的相关文章

随机推荐

  • Java线程池面试题整理总结【实习打卡01】

    ThreadLocal GC 之后 key 是否为 null 不一定 1 当使用new ThreadLocal lt gt set s 定义threadlocal时 没有在栈中声明一个变量指向他 那他就是只被弱引用 在gc后 那这个thre
  • 获取微信小程序码实例,建议拿到字节流后可以base64编码再上传图片,得到图片地址进行使用

    接口调用凭证 access token public static String postToken String appId String appKey throws Exception String requestUrl https a
  • 【无人车】用于无人地面车辆的路径跟踪算法(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码实现 1 概述 无人驾驶技术是当前社会的热门技术之一 无人
  • 【Unity&UGUI&Shader】创建材质球Material&代码控制更换物体材质球

    UGUI Unity Graphical User Interface 简称 UGUI 又称图形用户接口 如何创建材质球 NGUI Next generation GUI 下一代图形用户接口 Assets Create Material如下
  • 泛型,序列化

    何为泛型 1 JDK1 5以后推出的一种新的参数化的类型 2 通常可以理解为一种一种编译类型 在运行时无效 3 类型生活中的标签 为什么使用泛型 1 约束类中属性类型 方法参数类型 方法返回值类型 2 提高运行时性能 List s new
  • 西门子PLC的TCP通讯(不同项目下)②--TRCV_C指令

    西门子PLC的TCP通讯 不同项目下 TRCV C指令 上期主要了解了TSEND C指令的各项参数的意义 隐藏参数LEN等可以默认 本期将了解另一个配套组合指令块TRCV C 这是个接收指令块 大概呢跟发送指令TSEND C差不多 1 0
  • pinia的基本使用

    npm install pinia 安装pinia import createPinia from pinia app use createPinia main js中使用pinia 新建一个store文件夹 类似于vuex src sto
  • 前端技术搭建扫雷小游戏(内含源码)

    The sand accumulates to form a pagoda 写在前面 功能介绍 页面搭建 样式设置 逻辑部分 写在前面 上周我们实通过前端基础实现了贪吃蛇游戏 今天还是继续按照我们原定的节奏来带领大家完成一个游戏 功能也比较
  • Python机器学习笔记:深入理解Keras中序贯模型和函数模型

    先从sklearn说起吧 如果学习了sklearn的话 那么学习Keras相对来说比较容易 为什么这样说呢 我们首先比较一下sklearn的机器学习大致使用流程和Keras的大致使用流程 sklearn的机器学习使用流程 from skle
  • Linux下minicom的配置和使用方法

    安装配置minicom lsmod grep usbserial 如果直接使用串口线 而没有用到USB转串口设备 此步可以跳过 如果有usbserial 说明系统支持USB转串口 安装minicom Fedora自带有minicom 此步可
  • shell 守护进程之 mongodb

    场景 因为某些原因 mongodb 挂掉了 需要重启 思路 写个守护进程脚本 每分钟查看mongodb状态 这里查看mongodb进程是否存在 如果挂掉就重启 执行 1 创建sh文件 mkdir p data wwww guard mong
  • it技术交流社区与学习资料的网站大全

    点击上方蓝字 优派编程 选择 加为星标 第一时间关注原创干货 对国内技术社区 博客园 https www cnblogs com 掘金 https juejin cn 思否 https segmentfault com 开源中国 https
  • Ubuntu18.04升级到20.04

    升级方式 命令行升级 正常情况下使用如下命令即可 sudo do release upgrade 当提示如下错误信息时 得先升级本地软件包 Please install all available updates for your rele
  • 区块链的简单实现

    区块链的简单实现 什么是区块链 块结构 创世区块 hash 验证块的有效性 记录数据 从其他节点接收一个块 编写测试代码 测试结果 完整代码 什么是区块链 一个维护着一个持续增长的有序数据记录列表的这么一个分布式数据库 下面我将简单用nod
  • 玩转X-CTR100 l STM32F4 l U-Blox NEO-6M GPS卫星定位-nmealib解码库移植解码

    我造轮子 你造车 创客一起造起来 塔克创新资讯 塔克社区 www xtark cn 塔克博客 www cnblogs com xtark 本文介绍X CTR100控制器 扩展GPS卫星定位模块 型号为GY GPS6MV2 使用U BLOX
  • 数据库连接自动断开:CJCommunicationsException

    报错信息 com mysql cj exceptions CJCommunicationsException The last packet successfully received from the server was 99 117
  • JavaSE基础知识(个人总结)

    声明 1 本文为我的个人复习总结 并非那种从零基础开始普及知识 内容详细全面 言辞官方的文章 2 由于是个人总结 所以用最精简的话语来写文章 3 若有错误不当之处 请指出 基础 杂记 JRE JVM 常用类库 JDK JRE 诸多工具 如j
  • vue 循环遍历 搜寻资料

    写vue 循环遍历的 大全例子解释 转载连接 https www cnblogs com xulei1992 p 6015416 html https www jqhtml com 49765 html https blog csdn ne
  • mysql truncate语句_MySQL DELETE语句和TRUNCATE TABLE语句的区别

    在MySQL数据库中 DELETE语句和TRUNCATE TABLE语句都可以用来删除数据 但是这两种语句还是有着其区别的 下文就为您介绍这二者的差别所在 MySQL DELETE语句和TRUNCATE TABLE语句功能相似 但是二者究竟
  • Unity 游戏入门 九、 精灵动画 Sprite Animation

    1 Animator 为了在游戏对象上有动画 需要添加一个组件Animator 在工程窗口中 双击Robot 预制体 如图所示 添加Animator组件 2 Creating a New Controller 在工程窗口Animator文件