2D贴图绘制方式有两种,第一种由 GUI 绘制,第二种是将贴图以材质的形式绘制在游戏对象中。
GUI绘制
在屏幕中绘制一张静态贴图,需要使用 GUI.DrawTexture() 方法,该方法原型如下:
GUI.DrawTexture(位置, 图片对象, 缩放模式, 是否开启图片混合模式, 图片缩放宽高比);
例如:GUI.DrawTexture(new Rect(100,100,120,120), texSingle, ScaleMode.StretchToFill, true, 0);
第一个参数表示图片绘制的区域,第二个参数表示绘制图片的对象,第三个参数表示图片缩放模式,第四个参数表示是否开启图片混合模式,第五个参数表示图片缩放宽高比。
示例1
分别读取单个图片与多个图片,并且将加载的图片绘制在屏幕当中。
一定要将加载的图片保存在“Assets”下的“Resources”文件夹(自己创建一个)中,否则的话程序将无法识别。
其中 Resource.Load()方法 和 Resource.LoadAll()方法的参数均为资源文件夹的完整路径,但是前者返回的是读取的资源对象,后者返回的是资源数组对象。
两者读取的都是“Resources”文件夹的对象
Resources.Load(string path) ; //加载储存在Resources文件夹中path处的资源,加载单一的贴图资源。
Resources.Load(string path ,Type type) ; //加载储存在Resources文件夹中path处的资源,只返回type的物体。
Resources.LoadAll(string path) ; //加载Resources文件夹中的path文件夹或者文件中的所有资源。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class toPictrue : MonoBehaviour {
private Texture2D tex; //贴图
private Object[] texs; //贴图数组
void OnGUI()
{
if(GUI.Button(new Rect(10,10,100,50),"加载一张贴图"))
{
if(tex == null)
{
//加载一张贴图
tex = (Texture2D)Resources.Load("single/0");
}
}
if(GUI.Button(new Rect(10,160,100,50),"加载一组图片"))
{
if(texs == null)
{
//加载一组贴图
texs = Resources.LoadAll("textures");
}
}
if(tex != null)
{
//绘制贴图
GUI.DrawTexture(new Rect(110,10,120,120),tex,ScaleMode.StretchToFill,true,0);
}
if(texs != null)
{
for(var i = 0;i<texs.Length;i++)
{
GUI.DrawTexture(new Rect(110+i*120,160,120,120),(Texture)texs[i],ScaleMode.StretchToFill,true,0);
}
}
}
}
运行结果:点击“加载一张贴图”按钮会显示上面那一张图,点击“加载一组图片”按钮会把指定文件夹的图片全部显示
绘制动画
帧动画绘制原理:首先需要一组帧动画资源,然后在屏幕中设定一个显示区域,接着将动画的每一帧图片按照固定的时间在这个区域顺序切换,实现动画的播放。
使用程序将动画资源存储在动画数组中,然后设定刷新时间,每次刷新动画时将在原有显示区域中绘制下一帧图片,到了最后一帧则从第一帧重新开始。
示例2
下图是“Assets”文件夹里的资源。
人物行走循环动画已经在屏幕中播放,并且播放帧数的序列号以标签的形式绘制在屏幕中
示例中,将播放动画的功能封装在 DrawAnimation() 方法中,该方法第一个参数表示动画资源数组对象,第二个参数表示动画的显示区域。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class E3_06 : MonoBehaviour {
private Object[] anim; //动画数组
private int nowFram; //帧序列
private int mFrameCount; //动画帧的总数
private float fps = 5; //限制一秒多少帧
private float time = 0; //限制帧的时间
void Start () {
//得到帧动画中的所有图片资源
anim = Resources.LoadAll("WalkingCartoons");
//得到该动画共有多少帧
mFrameCount = anim.Length;
}
void OnGUI()
{
//绘制帧动画
DrawAnimation(anim, new Rect(50, 80, 32, 48));
}
void DrawAnimation(Object[] tex,Rect rect)
{
//绘制动画信息
GUILayout.Label("当前动画播放:第"+nowFram+"帧");
//绘制当前帧
GUI.DrawTexture(rect,(Texture)tex[nowFram],ScaleMode.StretchToFill,true,0);
//计算限制时间
time += Time.deltaTime;
//超过限制帧则切换图片
if(time >= 1.0 / fps)
{
nowFram++; //帧序列切换
time = 0; //限制帧清空
if(nowFram >= mFrameCount)
{
nowFram = 0;
}
}
}
}
运行结果: