当前位置: 首页 > news >正文

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窗口:

即可创建序列帧动画。拖动红框中的按钮,即可改变序列帧变化快慢。

http://www.dtcms.com/a/431647.html

相关文章:

  • 广州做礼物的网站扁平化企业网源码win8风格精简化源码asp带后台企业网站
  • C#基础09-面向对象关键字
  • 增长超人网站建设价格教育培训网站建设
  • 互联网项目各阶段数据驱动与AI技术的深度运用策略
  • 网站开发语言php5.1做网站客户总是要退款
  • 天津网站推广方法html购物网页设计报告
  • 奉贤青岛网站建设网站迭代
  • 高唐企业建网站服务商短租网站那家做的好处
  • GD32 I2C外设详介绍
  • 【C++】C++的多态是个啥,咋用的?
  • 【Linux 系统】进程状态
  • 搜索引擎网站排行榜广州seo优化公司排名
  • 【强化学习】#8 DQN(深度Q学习)
  • 【原创】SpringBoot3+Vue3学生信息管理系统
  • Linux查看日志方法
  • 个人签名设计网站服装网站策划设计
  • 《Span-based Localizing Network for Natural Language Video Localization》
  • VRRP上行逃生:两种核心方案详解
  • 方法的调用:递归
  • 设计师常用的灵感网站做网站怎么盈利
  • 工程承包网站哪个好?临汾工程建设招标投标网站
  • 从新疆油田数据采集器,看Digi ZigBee模块在石油行业上的应用
  • C语言指针与字符串详解
  • 全长抗体表达:从载体策略到产业化,如何实现高活性抗体的高效生产?
  • 0.3 神经网络学习率、激活函数、损失函数
  • 最全的ppt模板网站舆情监测系统永久免费
  • MySQL通过二进制日志恢复数据
  • 建立网站专业公司吗wordpress 换主题问题
  • 高功耗显卡装机实战:电源 / 机箱 / 主板兼容问题全解析与解决方案
  • Java 性能监控与分析工具