前言
前几天从书上学习到了GUI的方式实现2D人物的动画播放和移动,可能是由于书太旧了,书中并没有提到用Sprite来实现这个功能,这次周末就对Sprite进行小小的摸索,并写下了这个Demo。
1、 创建工程
创建一个Unity2D工程,在Project视图下新建两个Folder,一个是用来存放图片的资源文件夹Resources,另一个是用来存放脚本文件的Script文件夹。
2、加载图片资源
1、导入图片资源
在Resources目录下道路图片资源(在Resources目录下鼠标右键选择Import new Asset,然后选择要导入的图片即可)。我导入的资源是从网上下载下来的。
2、切割图片
选中图片,然后在Inspector视图中修改Sprite Model为multiple,然后选择Sprite Editor来切割图片。
在Sprite Editor界面中选择slice,然后在type当中选择grid,最后修改pixel size即可点击Slice来切割。
切割完成后点击apply应用,这时我们的图片就会被切割好了。可以在Project视图中观察到图片被切割完成
3、代码实现
3.1 新建脚本文件
在script中新建脚本hero_script.cs文件
3.2 加载图片资源
使用ArrayList来存放,4个不同方向的移动的Sprite。具体代码为:
using UnityEngine;
using System.Collections;
public class hero_script : MonoBehaviour {
//存放Sprite的anim
ArrayList anim = new ArrayList();
//用于存放加载的资源
Sprite[] s;
int rows = 4;
int cols = 3;
//存放获取SpriteRender组件,Sprite将被赋值在该组件的Sprite属性上
SpriteRenderer spRenderer;
// Use this for initialization
void Start () {
//加载资源
s = Resources.LoadAll<Sprite> ("hero");
//将图片资源按组存放到anim中
for (int i=0; i<rows; i++) {
ArrayList list = new ArrayList();
for (int j=0; j<cols; j++) {
list.Add(s[i*cols+j]);
}
anim.Add(list);
}
//获取spriteRenderer组件
spRenderer = GetComponent<SpriteRenderer> ();
//开始的时候让他加载s[0]图片
spRenderer.sprite = s[0];
}
// Update is called once per frame
void Update () {
}
}
这时候运行,sprite就会加载hero_0图片了,不过在运行前我们要先将脚本绑定Sprite。下面是运行的效果图:
3.3 获取键盘的输入
修改Update()函数,使用Input.GetKey来获取键盘的输入,具体代码为:
void Update () {
if (Input.GetKey (KeyCode.DownArrow)) {
//按住向下箭头按键
} else if (Input.GetKey (KeyCode.LeftArrow)) {
//按住向左箭头按键
} else if (Input.GetKey (KeyCode.RightArrow)) {
//按住向右箭头按键
} else if (Input.GetKey (KeyCode.UpArrow)) {
//按住向上箭头按键
}
}
3.4 加载动画
我这里选择按照书上的加载GUI动画的方式来加载动画。具体代码如下以向下移动为例:
if (Input.GetKey (KeyCode.DownArrow)) {
//按住向下箭头按键
//将其他三个位置初始化为0
leftFrame = 0;
upFrame = 0;
rightFrame = 0;
//加载向下的图片资源
ArrayList moveDown = (ArrayList)anim[0];
spRenderer.sprite = (Sprite)moveDown[downFrame];
//制作成动画
time += Time.deltaTime;
if(time >= 1.0/fps){
downFrame++;
time = 0;
if(downFrame >= moveDown.Count){
downFrame = 0;
}
}
}
这部分代码实现了就可实现2D人物动画的播放了
3.5人物移动
通过调用transform的Translate函数来实现sprite移动,注意Vector2只有向上和向右方向,如果要使用向下和向左方向可以使用-Vector2.down和-Vector2.right来实现,这里以向下为例子修改之前的代码。
if (Input.GetKey (KeyCode.DownArrow)) {
//按住向下箭头按键
//将其他三个位置初始化为0
leftFrame = 0;
upFrame = 0;
rightFrame = 0;
//加载向下的图片资源
ArrayList moveDown = (ArrayList)anim[0];
spRenderer.sprite = (Sprite)moveDown[downFrame];
//人物向下移动
transform.Translate(-Vector2.up*Time.deltaTime);
//制作成动画
time += Time.deltaTime;
if(time >= 1.0/fps){
downFrame++;
time = 0;
if(downFrame >= moveDown.Count){
downFrame = 0;
}
}
}
这部分代码实现了就可以实现人物的移动了
总结
由于接触Unity时间不长,加上书比较旧,这次的代码是修改Texture2D的代码,以后如果发现更好用的方法会及时的更新。