Unity笔记(十)——SpriteRenderer精灵渲染器、SpriteAtlas精灵图集、瓦片地图代码控制、动画系统
写在前面:
写本系列(自用)的目的是回顾已经学过的知识、记录新学习的知识或是记录心得理解,方便自己以后快速复习,减少遗忘。这里只有代码相关部分,没有面板部分。
一、SpriteRenderer精灵渲染器
所有2D游戏的游戏资源,都是通过Sprite Renderer让我们看到的。
1、2D对象的创建
共有3种创建方式:
1、直接拖入Sprite图片:直接将图片从Project窗口中拖到Hierarchy中即可。
2、右键创建:在Hierarchy窗口处右键->选择2D object->选择Sprites即可。创建出的对象没有关联精灵图片,需要进行关联后才能显示图片。
3、空物体添加脚本:创建空物体,添加Sprite Renderer脚本后关联图片即可。
2、代码相关
面板上的参数不再赘述。如果需要用代码创建2D对象,需要先创建一个空物体,并为空物体添加Sprite Renderer脚本:GameObject obj = new GameObject();
SpriteRenderer sr = obj.AddComponent<SpriteRenderer>();
而后就可以通过sr.sprite来关联图片。sr.可以点出一系列面板参数进行修改。例如,.name可以获得文件名,.flipX可以进行水平翻转。
如果想要获取图集中的某个图片,只能先将整个图集加载出来,然后通过索引获取图片:
void Start()
{GameObject obj = new GameObject();SpriteRenderer sr = obj.AddComponent<SpriteRenderer>();sr.sprite = Resources.Load<Sprite>("dead1");//加载图集Sprite[] sprs = Resources.LoadAll<Sprite>("RobotBoyIdleSprite");sr.sprite = sprs[10];sr.flipX = true;print(sprs[10].name);
}
二、SpriteAtlas精灵图集
1、精灵图集制作
精灵图集中的图片经常会通过代码加载到场景中,因此可以直接将精灵图集创建到Resources文件夹中。在Project窗口Resources文件夹处右键选择Create—>2D—>Sprite Atlas,即可创建一个空图集。
点击空图集,在Inspector窗口的Objects for Packing,即可在其中添加图片,如下例所示:
添加完成后点击下方的Pack Preview就创建好了精灵图集。
2、代码加载精灵图集
如下,使用SpriteAtlas spriteAtlas = Resources.Load<SpriteAtlas>("myAtlas");,在括号中传入自己创建的图集名字,例如这里是"myAtlas",即可导入图集。导入图集后,可以直接通过spriteAtlas.GetSprite("dead1"),在括号中传入图集中对应图片的名字来获得对应图片,这里的名字是"dead1"。
void Start()
{GameObject obj = new GameObject();SpriteRenderer sr = obj.AddComponent<SpriteRenderer>();SpriteAtlas spriteAtlas = Resources.Load<SpriteAtlas>("myAtlas");sr.sprite = spriteAtlas.GetSprite("dead1");
}
三、瓦片地图代码控制
1、创建瓦片地图
在Project窗口右键—>Create—>2D—>Tile Palette—>Rectangular即可创建一个方形瓦片调色板,创建完成后拖拽至Game窗口处方便编辑:
将需要绘制的瓦片资源拖进调色板窗口并保存:
在Hierarchy窗口右键—>2D objects—>Tilemap—>Rectangular创建方形瓦片地图:
选择对应瓦片进行吸色,切换画笔,即可直接在场景(方形瓦片地图)中进行简单的场景绘制:
这样就创建好了一个瓦片地图。
2、代码相关
(1)关联对象
如果需要通过代码控制瓦片地图,可以创建三个public对象并关联:
Tilemap:瓦片地图
Grid:网格
TileBase:瓦片基类/瓦片,可以关联一个具体的瓦片对象
public Tilemap map;
public Grid grid;
public TileBase tileBase;
(2)API
清空瓦片地图:map.ClearAllTiles();
获取指定坐标格子:map.GetTile(new Vector3Int(0, 0, 0)),这里获取的是坐标(0,0,0)处的瓦片对象。如果没有对象,返回null。
这是此时坐标0,0,0处的瓦片:
void Start()
{TileBase tmp = map.GetTile(new Vector3Int(0, 0, 0));print(tmp);
}
设置/删除瓦片:可以通过SetTile()来设置瓦片。括号内传入的第一个参数为需要设置瓦片的位置,第二个参数传入需要在该位置设置的瓦片。传入null相当于删除瓦片。
也可以使用map.SetTiles()来批量设置瓦片,需要传入数组。
void Start()
{//设置删除瓦片map.SetTile(Vector3Int.zero, tileBase);map.SetTile(new Vector3Int(1, 0, 0), null);//map.SetTiles()
}
运行前:
运行后:
替换瓦片:map.SwapTile(tmp, tileBase),第一个参数是被替换的瓦片,第二个传入的是用来替换的瓦片。
世界坐标转格子坐标:grid.WorldToCell(),参数传入世界坐标
void Start()
{TileBase tmp = map.GetTile(new Vector3Int(0, 0, 0));map.SwapTile(tmp, tileBase);//世界坐标转格子坐标,传入世界坐标作为参数//grid.WorldToCell();
}
四、动画系统
1、代码控制老动画系统
(1)创建动画
在场景中创建一个3D立方体,并为其添加Animation脚本,Unity就会认为此时你使用的是老动画系统:
在上方栏Window—>Animation—>Animation打开动画窗口,并将其拖至Game界面。选择你创建的立方体Cube,即可点击Create为其创建动画:
此时创建了动画1,点击右侧下三角即可继续创建动画,这里创建了三个动画1、2、3。
此时Animation脚本窗口就会同步信息:
这里的Animation是默认播放的动画。Play Automatically如果勾选了,动画就会在开始运行时自动播放,反之只能代码控制播放。点击按钮开始制作动画:
例如,在1s处将Cube的位置从0,0,0改为0,5,0。选中1s处,修改Transform信息即可。其他动画例如旋转修改Rotation即可。点击播放可以预览动画。
这样就完成了动画制作。
(2)代码相关
播放指定动画:animation.Play("1");括号内传入的是需要播放的动画名。
淡入播放:animation.CrossFade("3");括号内传入的是需要播放的动画名,会让动画切换时不那么生硬,有过渡。
前一个播放完再播下一个:animation.PlayQueued("2");括号内传入的是需要播放的动画名,不会打断前一个动画的播放。
private Animation animation;void Start()
{animation = this.GetComponent<Animation>();
}void Update()
{//播放动画if(Input.GetKeyDown(KeyCode.Alpha1)){animation.Play("1");}if(Input.GetKeyDown(KeyCode.Alpha2)){animation.Play("2");}//淡入播放if(Input.GetKeyDown(KeyCode.Alpha3)){animation.CrossFade("3");}//前一个播放完再播下一个if(Input.GetKeyDown("4")){animation.PlayQueued("2");}}
停止播放所有动画:animation.Stop()
判断动画是否在播放:animation.IsPlaying("1")
设置动画播放模式如循环播放:animation.wrapMode = WrapMode.Loop
void Update()
{//停止播放所有动画animation.Stop();if(animation.IsPlaying("1")){}animation.wrapMode = WrapMode.Loop;
}
还可以点击如下按钮为关键帧添加事件。
可以设置的参数有很多,int、float、bool、GameObject等都可以。
public void AnimationEvent(int i)
{print("动画事件触发");
}
//暂时了解即可
//设置层级
animation["1"].layer = 1;
//设置权重
animation["1"].weight = 1;
混合模式,叠加or混合
animation["1"].blendMode = AnimationBlendMode.Additive;
//设置混组相关骨骼信息
//animation[""].AddMixingTransform();
2、代码控制新动画系统
(1)创建动画
首先在场景中创建一个物体,打开Animation窗口。直接选中物体进行动画创建。这样创建出的就是新动画系统。动画的制作和老动画制作无异。
创建多个动画后,Window—>Animation—>Animator中可以编辑动画播放顺序、播放条件等。其中,绿色的方块代表进入动作,红色为退出。黄色是默认动作,可以进行更换。灰色的是其他动作。在对应方块上右键—>Make Transtion,并点击想要切换的动作,即可创建图中红框所示箭头。这里创建了两个。
点击Parameters,可以创建参数,用于动画切换,这里创建了bool参数:
点击想要设置参数的箭头,就可以进行动作切换条件设置。取消勾选Has Exit Time可以让动作切换更加迅速。在Conditions处点击加号,可以添加切换条件,这里设置为,当bool为true时,从动作1切换到动作2。
(2)代码相关
可以使用SetFloat("参数名",数值);来设置指定参数的值。可以使用animator.GetFloat("参数名")来得到对应参数。
animator.Play("动画名");可以直接切换到对应动画。如下:
private Animator animator;void Start()
{animator = this.GetComponent<Animator>();//切换条件animator.SetFloat("",1.2f);animator.SetInteger("", 5);animator.SetBool("", true);animator.SetTrigger("");//获得条件animator.GetFloat("");animator.GetInteger("");animator.GetBool("");//直接切换动画,一般不用animator.Play("");
}void Update()
{if(Input.GetKeyDown(KeyCode.A)){animator.SetBool("change", true);}if(Input.GetKeyDown(KeyCode.S)){animator.SetBool("change", false);}
}
3、2D序列帧动画
(1)代码制作
代码制作2D序列帧的思路是:关联2D序列帧需要用到的所有图片,每隔一定的时间间隔:如1/60s就更换一张图片。
//代码制作序列帧动画
public Sprite[] sprs;private SpriteRenderer sr;
private float time;
private int nowIndex;
void Start()
{sr = this.GetComponent<SpriteRenderer>();sr.sprite = sprs[nowIndex];
}void Update()
{time += Time.deltaTime;if(time>=0.03){nowIndex++;if (nowIndex >= sprs.Length)nowIndex = 0;sr.sprite = sprs[nowIndex];time = 0;}
}
(2)Animator制作
选中2D序列帧精灵图片,拖入至Animation窗口:
即可创建序列帧动画。拖动红框中的按钮,即可改变序列帧变化快慢。