Kirisame1969の魔法屋
首页项目归档照片墙音乐灵境说说杂谈友链关于
封面

我要成为Unity糕手——VER.002

写作时间:2026-06-16 14:33:58
# 我要成为unity糕手
# 精灵图
# 动画

精灵图

把单张图片切分为多张图片

在unity中有时在选择素材时会遇到保存为单张图片的动画等等,我们可以使用unity自带的方法,来把一张图片切分成多张精灵单元图。

点击目标文件,在检查器中找到sprite模式,切换为“多个”。

点击右下方的Sprite Editor,打开对应窗口后,点击左上角的“切片”,其中的类型不选“自动”,而是改为Grid by cell size,即单元格大小。

填写每个单元格大小后(如在教程中使用的图片的长宽都为192),点击切片并应用更改,即可获得切分出的多张图片。

像素模糊与颜色失真问题

如果像素图片放大后感觉模糊,则应该设置图片的过滤模式。其中,默认的”双线性“设置能使得像素之间的边变得平滑,但也会使得图像看起来有些模糊。

点击图片,在检查器中选择将过滤模式改为点(无过滤器)即可。

如感觉颜色有些失真,则可以在下方的类似表格的区域中选择“格式”,并修改它为RGBA 32 bit即可。

动画

添加基础动画

当我们需要一个动画效果时,我们首先需要在窗口下找到animation。打开窗口后创建文件,将我们做好的动画多选并拖入其中。

‍

初始的动画一般的播放速度很快,我们可以拖动右侧区域中带有菱形的条状物来延长时间,直到合适。

有时我们会发现,最后一帧动画只持续了很短时间就被重置,这时可以将第一帧动画复制至最后构成循环,来修复这种情况。

‍

当我们需要为同一个对象创建多个动画时,在层级视图里选中对象后,点击window中的animation,在左上角的preview下方会有一个列表,显示所有这个对象的动画。我们可以在这里创建新动画。

切换动画

添加一个另外的动画的过程与添加基础的动画的过程无异,需要考虑的是如何在两者间切换。

一般来讲,你需要在满足一些条件的情况下才需要切换显示的动画,比如一个角色从站立的状态切换到行走的状态,这个切换需要玩家在“移动”才会触发,而玩家停止移动时,则应该从行走状态切换至站立状态。

要实现这个,就需要使用到动画控制器,它的实现类似于状态机。

‍

以从站立与行走动画的切换为例:

选中对应的游戏物体,打开动画器,我们可以看到它所拥有的所有动画,它们通常以块的形式可视化地表现出来。
默认的动画状态显示为橙色,我们可以随时右键某个块来选择切换默认动画状态。
右键后“创建过渡”,再选择另一个块,就会在两个动画状态中建立起联系。
我们可以在左侧选择参数,来创建一些可以被动画器识别的参数。

‍

例如,可以创建两个float参数horizontal和vertical,它们的初始值为0。

‍

选中表示过渡的箭头,在Conditions一栏中可以添加触发过渡的条件。

‍

例如,一个站立->行走过渡的条件是变量horizontal > 0.1(横向移动),另一个条件则是变量vertical > 0.1,这两个条件一旦有一个为真,就会触发动画,故需要创建两个独立的过渡。
而行走->站立过渡的条件是角色不动,切换站立的条件就需要两个变量同时满足<0.1的条件。

‍

要在程序中修改这两个参数以控制动画,我们就需要引入动画相关的变量对象。

我们可以使用如下代码来创建一个Animator对象,它用来管理这个物体相关的动画,在编辑器内需要把物体相关的动画组件拖入对应槽位中。

// 创建一个Animator类型的公共变量,名为anim
public Animator anim;

在以上的例子中,我们可以这样编写控制那两个参数的代码:

    void FixedUpdate()
    {
        // 控制玩家移动相关的变量,检测玩家的按键输入
        float horizontal = Input.GetAxis("Horizontal");
        float vertical = Input.GetAxis("Vertical");
        
        //将指定的参数(传入方法的第一个字符串)设置为指定变量(第二个变量)
        anim.SetFloat("horizontal" , horizontal);
        anim.SetFloat("vertical" , vertical);
        ...
    }

实际上,使用上述的代码会出现玩家控制的只有向右和向上时播放动画的情况。
这是由于我们设置的条件只有如”horizontal>0.1“时才触发移动动画,而当向左或向下移动时,这些变量是负数。
我们可以使用Mathf.Ads()来解决。

    anim.SetFloat("horizontal" , Mathf.Abs(horizontal));
    anim.SetFloat("vertical" , Mathf.Abs(vertical));

翻转动画与贴图

据说要实现这个功能有至少三种方法,但这里只讲一种。

局部缩放。

在Transform组件中,我们只需要将物体的”缩放“中的x轴设为-1即可实现左右翻转。

这段代码可以表示“缩放”中的x值,但只能读取,不允许修改。这可以帮助判断在哪些情况下可以执行翻转。

transform.localScale.x

要想修改这个值,只能改变整个向量。

transform.localScale = new Vector3 
(transform.localScale.x * -1,
transform.localScale.y,
transform.localScale.z);

当然我们在这个例子中,需要按照需要的情况进行修改,那就需要if语句或方法等发力了。

录制动画

有时,一些简单的动画也需要我们自己录制,例如缩放等等...
依然打开动画面板,选择录制按钮,拖动进度条来表示这一帧内物体的行为。
当你在外面修改你所录制的物体的Transform时,它可以记录你的操作,从而在动画播放时复现这些变化。

例如,如果我们想做为血量显示的文本制作一个简单的受击后缩放的动画,我们可以在第二帧直接修改物体的缩放大小,在第三帧恢复。

‍

动画状态机

我们在制作了动画后,一般不能直接使用。除了在动画器内直接拉取代表过渡的箭头以外,还可以通过代码方法直接让动画跳到某一个状态。

public Animator healthTextAnim;
healthTextAnim.Play("TextUpdate");

如上,可以操控动画器的状态直接转换为TextUpdate。

在这个例子中,TextUpdate是一个文本弹跳动画,它应该只播放一次。
这时应该找到这个动画对应的文件的检查器下,找到Loop time选项并取消勾选。
当然,在动画器页面内我们还是要设置动画播放完后的去向的。这里使得其在播放完毕后过渡到ldle状态了。

avatar

Kirisame1969

软件工程在读小登,正在学习C#与神秘Unity魔法

RECOMMENDED

我要成为Unity糕手——VER.001

2026-06-06 20:24:14

Table of Contents