第一次接触Unity,并且跟着视频资料做出了第一款2D像素游戏,因为还有很多不懂的地方,以及在学习过程中感觉有待优化的地方,所以想要通过这篇文章对自己进行一个总结,内容其实都是写给以后的自己。😜
在学习过程中呢,有收获,也遇到问题,这些呢,有可以分为编写代码类,和Unity使用类的
毕竟是初学,感觉还是收获满满的,在这里会选出个人感觉很实用很关键的方法,或者是在之后Unity学习过程中重复使用的方面,所以大多是很基本的知识,以扎实的过程记录。
这是一款简单的2D像素横板游戏,可以收集物品,消灭敌人,在移动上实现站立,跑动,下蹲,跳跃。
Unity使用
1.Tilemap
- 场景中的Tilemap如果有缝隙,调整Grid的CellSize,把X和Y都改成0.99
- 如果想实现,地图上有的元素,例如草,标识牌等不需要碰撞体,那么可以创建多个Tilemap,分别画出地形,以及丰富地图的元素,前者正常添加Tilemap Collider2D,后者就不需要。
- 实现单向平台。新建Tilemap,画出希望的单向平台,添加Tilemap Collider2D和Platform Effector 2D组件,同时勾选上Tilemap Collider2D中的Used By Effector
2.Animation
- 添加组件Animator -> 创建AnimationController,拖动添加到Animator -> 打开Animation窗口,Create -> 拖动动画素材到在Animation窗口下,Smaples 设置动画速率 -> 若只执行一次动画,则点击动画,勾选Loop Time
- 动画与动画之间的转换,去掉Has Exit Time(如果勾选了这一项,在动画转换时会等待当前动画播放完毕之后才转换到下一个动画,在这里是立即转换,所以不勾选),Transition Duration过度持续时间 (过度有多长)设置成 0
3.Cinemachine
- 添加插件window-PackageManager-Cinemachine,
Dead Zone:图中最中间的矩形,锁定的人物会以一个黄点标记出,最终黄点会稳定在这个区域内
Soft Zone:中部蓝色的区域,人物移动到这个区域内,镜头会缓慢跟随移动,尽量使人物回到中间的Dead Zone - 镜头的移动,不能超过地图的边界。对背景添加碰撞器:Polygon Colider2d (多边形),勾选isTriger防止角色和背景碰撞,摄像机添加扩展:Add Extension-Cinemachine Confiner,填入Polygon
4.收集物品
- 2D Objec -> Sprite,修改Tag为收集物品的Tag,添加Box Collider 2D,勾选上is Trigger在代码中识别,如果任务触碰的碰撞器的标签是收集物品,则销毁游戏项目:Destroy(collision.gameObject);
5.消灭敌人
- 与收集物品同理,需要添加消灭敌人的条件,即踩到敌人头上,(处在下落状态,碰到碰撞器的标签是敌人),在这里实体化一个Enemy类,调用里面的JumpOn()函数,播放敌人死亡的音效,打开死亡的开关,播放死亡动画,在动画的最后加入事件帧,在调用函数,销毁该敌人的游戏项目
6.角色摩擦
- 因为创建了两个碰撞器,上部Box Collider 2D,下部Circle Collider 2D,如果是只有上部的碰撞器和地面的碰撞器接触,在给一个方向的力,就会有摩擦力。例如下图
所以需要新建一个物理材质Create -> Material,将其中的摩擦Friction设置为0,并添加到Box Collider 2D中
6.UI
- 包括开始菜单,游戏暂停菜单,音量音效滑动条,编写脚本,挂载到Canvas上,比如按钮,On Click选择点击后的函数,在Menu中找到编写的函数
public void PauseGame()
{
pauseMenu.SetActive(true);
//时间比例
Time.timeScale=0f;
}
- 再比如音量的滑动条,修改最大和最小值[-80,0], Value Changed选择改变的值,在Menu中的Dynamic float选择编写的函数,这样改变的值就是当前Inspector中的Value
public void SetVolume(float value)
{
audioMixer.SetFloat("MainVolume",value);
}
7.AI
- 仅实现了敌人在规定范围内的活动。以青蛙为例,青蛙会在规定好的左右范围内进行反复运动,具体实现是给青蛙对象添加左右两个Object作为节点,当青蛙移动超过左右结点时,则会进行转向。
8.Audio Source
新建GameObject,重命名为SoundManager
- BGM,添加模块Audio Source,将选定的BGM拖入AudioClip;在Project下新建AudioMixer;选择AudioSource的Output为Matser(新建的AudioMixer会自创建);打开AudioMixer窗口,选中Master,右键Volume,选择Expose ‘Volume (of Master)’ to script将该值修改为代码可以调用的参数,在Exposed Parameters中可以右键重命名该变量
- 音效,添加模块Sudio Source,用来统一管理所有人物音效(受伤,跳跃,收集物品),编写脚本,添加各种音效为AudioClip,编写播放对应音效的函数,因为这是不同的脚本,为了函数调用的方便,将类实例化,就可以用实体直接访问类中的函数。
public static SoundManager instance;
public void Awake()
{
instance=this;
}
例如:人物脚本中调用音效
SoundManager.instance.CollectionAduio();
接着是在Audio Mixer中新建Groups,选择为音效的Output
9.2D光效
使用的是2018版本,如果是高版本的可以使用Universal RP
- 首先是需要为地图添加材质,使地图变暗,可以接受并衍射光,这样添加光源之后,就可以实现照亮的效果,以地图为例,在Tilemap Renderer中可以选择预置的Default-Diffuse
- 对于我们操控的人物,收集物品,敌人等,这些每次添加的2D项目渲染出来都是一个Sprites。需要新建材质,Creat -> Material -> Shader -> Sprites -> Diffuse 新建完成。拖进Sprites Renderer中的Material中,这样添加光源之后,人物等也会被照亮。
- 如果有的光源失效,在Project Settings -> Quality -> Rendering ->Pixel Light Count 控制光源的数量,可以适当调整
C#代码
1.Update()和FixedUpdate()
- FixedUpdate,是在固定的时间间隔执行(0.02s),不受游戏帧率的影响,通常在处理Rigidbody等物理有关的
- Update,是在每次渲染新的一帧时会调用,这个更新的频率和当前设备的性能有关以及被渲染的物体,这样同一游戏在不同的机器上效果不一样。
2.跳跃(可适用多数2D横版游戏)
using UnityEngine;
public