2D游戏导入的图片,Texture Type会默认变为 Sprite(2D and UI)
,此时可以直接将其拖拽进场景成为GameObject;也可创建一个空物体,手动添加Sprite Renderer
组件。
Sprite 属性
- Sprite Mode:Single(默认)。Multiple(包含多个精灵,可分割或动画)。
注意,2D纹理本身不是精灵,其下附属的展开内容才是精灵。 - Pixels Per Unit:Unity场景里每个格子对应图片中多少像素。
Tilemap(瓦片地图)
该功能依赖包管理器中安装2D Tilemap Editor
包。
将场景平面划分为网格状,并在网格上绘制内容。
瓦片地图
- 创建瓦片地图 Hierarchy - Create - 2D Object - Tilemap - Rectangular
- 创建调色板 Window - 2D -Tile Palette(打开调色板窗口) - Create New Palette
将精灵/瓦片拖拽入调色板(一个调色板里可以容纳多个),资源管理器会自动创建瓦片文件。 - 蘸取调色板中的格子,即可在场景中刷涂。刷涂部分的内容会自动加入第一步创建的瓦片地图。
拆分瓦片集
拆分后可以让 2D Texture 下出现多个 Sprite(制作动画也需要该操作)
- 选中一个Sprite - Sprite Mode - Multiple
- Sprite Editor - slice
其中 Automatic 会根据透明像素自动分割,也可以手动在画面中拖拽出绿框进行分割
为 Tilemap 设置碰撞
- 方法1:在需要存在碰撞的位置创建空物体,并为其添加Collider组件
- 方法2:为Tilemap 添加 Tilemap Collider 2D(瓦片碰撞)组件和 Composite Colloder 2D (复合碰撞体)组件
前者会让该Tilemap中所有Collider Type
为Sprite
(默认值)的瓦片都具有碰撞效果(对于不想碰撞的瓦片,可以选中其瓦片源文件,将Collider Type
改为None
)
后者会合并前者中的多处碰撞以减少优化性能(因此会自动额外添加刚体组件)。且添加后还需要勾选前者的Used by Composite
选项才能生效。
精灵平铺
2D物体-》Sprite Renderer组件-》Draw Mode
- Simple:默认值,强行拉伸
- Sliced:根据九宫格切片,中间部分拉升,四角不变
- Tiled:根据九宫格切片,中间部分重复平铺,四角不变
当启用 Sliced / Tiled 时
会多出Width、Height属性,此时应使用 Rect Tool(快捷键T
)而非 Scale Tool 进行大小拖拽。
九宫格切片可在Sprite Editor
中拖动绿线调整(默认在四边)。
Tile Mode:
- Continuous:默认,精灵会均匀重复
- Adaptive:重复部分仅在精灵的尺寸达到 Stretch Value 时才进行重复
2D物体的渲染层级
Sprite Renderer 组件 - Additional Settings - Order in Layer
数字越大渲染越晚(表现为覆盖在最高层)Edit - Project Settings - Graphic - Camera Settings - Tranparency Sort Mode
可用于控制相同 layer 时渲染的先后顺序
若选为 Custom Axis 则按照 Tranparency Sort Axis 渲染。可实现随着物体移动,根据坐标位置不同产生不同的优先级
可通过Sprite Renderer 组件 - Sprite Sort Point
切换中心点或轴心点来进行坐标位置比较
其中轴心点(Pivot)的位置默认在中心点(Center),可以在精灵的设置(Sprite Editor)中修改,拖拽蓝色圆圈或直接设置均可。
动画
Unity动画有自己的状态机,而非直接通过脚本控制。
1. 为游戏对象添加 Animator 动画组件
可将动画分配给场景中的游戏对象,比老版本的Animation
组件更方便。
2. Assets->右击->Create->Animator Controller 创建动画控制器
可根据当前游戏对象的状态控制播放/切换对应的动画(也称为动画状态机)。
3. Window->Animation->Animation 打开动画窗口
注意:后续操作需要在Hierarcy中选中游戏对象后,再在动画窗口中编辑。
Preview也是点动画窗口中的时间点,Scene里的对象发生改变
4. 选中带有Animator组件并配置好Animator Controller的游戏对象,在动画窗口左上角下拉框中创建/切换动画.anim
文件(也称AnimationClip文件)
即一个Controller对应多个AnimationClip
5. 操作时间轴
可以通过鼠标框选选中时间轴中多个关键帧,然后拖动以等比拉伸时间
- 点击
Add Peoperty
,可以选择该物体已有组件的某个属性,并在时间轴上设置关键帧 - 点击录制按钮,然后直接在对应帧进行游戏对象的修改操作,并自动记录
- 将资源中的精灵拖拽进时间轴(本质是改变了
Sprite Renderer
组件Sprite
属性)
6. Window->Animation->Animator 打开动画控制器窗口
可以将.anim
动画文件拖拽以添加进动画控制器窗口
从Entry出发的为必播动画(default),可通过右键设置。
- Layers:动画层级,用于处理多个动画同时生效(如边跑边射击)时的优先级
- Parameters:用于控制多个动画状态之间切换的变量
在不同节点之间通过连线(Make Transition),表示可切换关系。
可以通过代码修改状态机变量,当连线的检查器中Conditions
设置的变量条件满足时,就会切换到相应的动画:
private Animator animator;
animator = GetComponent<Animator>();
animator.SetInteger("变量名", -1);
////Trigger触发器和布尔值不同,动画执行完成后会自动重置为false。也可以通过ResetTrigger手动重置
animator.SetTrigger("变量名");
animator.ResetTrigger("变量名");
- Has Exit Time:动画状态满足切换条件时,是否保留之前动画一段时间
勾选时,Exit Time
设置生效 - Transition Duration:动画切换时的过渡时间。设置为0则直接切换。
混合树(Blender Tree)
动画控制器中一种特殊的节点,可以按不同程度组合动画。
如:一个站立混合树可以当speed>0时进入走路混合树,再根据direction在走路状态树中切换为不同朝向的走路动画。
在动画控制器窗口中,右击->Create State->From New Blend Tree,双击新创建的混合树节点进行配置
- Blend Type:决定有几个参数控制动画切换
组合出一个坐标系,并添加Motion(动画),将触发离红点坐标最近的动画
设置循环动画
- 方法1:选中
.anim
文件(即AnimationClip文件),在其Inspector中勾选Loop Time
。则之后进入该状态后,只要状态不离开,就会反复播放 -
方法2:在动画控制器窗口中,复制一个动画,使其互相指向
粒子系统
Hierarchy > Effects > Particle System
用于制作烟雾、火焰、爆炸、雨雪等特效
注意各模块中带下三角的属性,都可以切换成固定值或区间随机值等
用贴图制作烟雾特效
设置烟雾贴图
Particle System 组件 > Texture Sheet Animation 模块
Mode:Sprites
选择烟雾的精灵。如有多个精灵随机出现,则点击加号添加精灵,并切换 Frame Over Time 和 Start Frame 为 Random Between Two Constants ,数值为 0~n(即上述添加精灵数组的index)。设置烟雾形状
Particle System 组件 > Shape
Angle 设置发射角度设置粒子行为
Particle System 组件 > Particle System 主模块
Looping:重复播放
Start Lifetime:粒子存活时间
Start Speed:粒子速度
Start Size:粒子大小
Simulation Space:Local 则跟随当前物体。World 则已发出的粒子独立运动,不随 Particle System 物体移动。-
设置粒子渐变消失
Particle System 组件 > Color Over Lifetime 模块
选中右上角的标记,设置 Alpha 为 0
设置粒子渐变变小
Particle System 组件 > Size Over Lifetime 模块设置粒子发射频率
Particle System 组件 > Emission 模块
开始/结束粒子发射
private ParticleSystem smokeEffect;
smokeEffect = GameObject.Find("Particle System").GetComponent<ParticleSystem>();
smokeEffect.Stop();//不再生成新的粒子
smokeEffect.Play();//继续发射粒子
// Destroy(smokeEffect);//直接销毁所有粒子