Unity 2D 学习手札(八)Sprite 人物的走动

本文详细介绍了如何在Unity中使用2D Sprite动画实现角色的四个方向移动。通过分解图片资源,创建Sprite对象并编写ManController脚本来控制角色动画和移动速度,实现了角色在不同方向上的流畅移动。

前言

想让一个人物能在画面上依指示向四个方向(上、下、左、右)走动,如下图:
在这里插入图片描述

图檔制作

为了能上下左右的走动,必须先准备四个方向的动画。下图来自FeralFantom’s Entry
在这里插入图片描述
这是一张 576 x 256 像素的图,把它导入项目的 Assets/Resources/man 中,然后用 Sprite Editor 切成每张 64 x 64 像素的图片。
在这里插入图片描述
每个方向有九张,一共有 36 张。
在这里插入图片描述
如上图,点图右边的三角形部分,可展开如下图:
在这里插入图片描述

创建 Sprite

依次单击〝GameObject → 2D Object → Sprite〞创建一个空的 Sprite 对象,并命名为〝Man〞,然后为此对象添加一个脚本 (ManController)。

ManController 的设计

完整代码如下:

public class ManController : MonoBehaviour {
    public float speed;           // 移动的速度
    public float framesPerSec;    // 一秒钟显示的动画张数
    public int  direction;        // 人物的方向

    private SpriteRenderer m_spriteRender;
    private Sprite[] arySprite;
    private int m_nLength;    //一组动画的张数
    private int m_nStart;     //目前方向开始的编号
    //-----------------------------------------------------------
    void Start ()
    {
        m_spriteRender = GetComponent<SpriteRenderer>();
        arySprite = Resources.LoadAll<Sprite>("man/man");
        m_nLength = arySprite.Length / 4;
        
        SetDirection(direction);
    }
    //-----------------------------------------------------------
    void Update ()
    {
        int index = (int)(Time.time * framesPerSec) % m_nLength;
        m_spriteRender.sprite = arySprite[m_nStart + index];

        Vector3 te = transform.position;
        float dx = speed * Time.deltaTime;
        switch (direction)
        {
            case 0: te.y += dx; break;
            case 1: te.x -= dx; break;
            case 2: te.y -= dx; break;
            case 3: te.x += dx; break;
        }
        transform.position = te;
    }    
    //-----------------------------------------------------------    
    public void SetDirection(int value)
    {
        direction = value;
        m_nStart = m_nLength * direction;
    }
}

m_nLength 变量是纪录一组动画的张数。LoadAll 会全部加载到 arySprite 中,因为有四个方向,所以平均为 arySprite.Length / 4。

SetDirection() 是控制行走的方向,value = 0 表向上,1 表向左,2 表向下,3 表向右。m_nStart 表示这个方向的动画最小的编号值,即 0, 9, 18, 27。

在 Update() 中,根据 framesPerSec 来更换图片,然后根据 speed 来更改位置,当方向是上或下时,更改 y 值,左或右则更改 x 值。

外部的控制

如下图,一秒位移 0.2 单位、九张图,起始方向为向上。
在这里插入图片描述
四个 button 的点击就对应到 SetDirection()。
在这里插入图片描述

结语

事实上,这张图的设计,最左边的那一格是站立的图案,如果加在走动的动画中,播放时会觉得怪怪的,理论上要扣除,所以 Update() 中要如下修改:

int index = (int)(Time.time * framesPerSec) % (m_nLength-1);
m_spriteRender.sprite = arySprite[m_nStart + 1 + index];

参考资料:
Creating 2D animated sprites using Unity 4.3

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值