教程笔记的对象是b站白熊游戏制作的教程,供本人参考,看完花费两天,在长久吃灰unity之后用这个教程复习了一些基本知识,部分文字取自chatgpt

第一节:控制角色输入输出

当我们要让角色进行移动的时候,我们需要创建一个脚本,通过类似于
moveX = Input.GetAxis(“Horizontal”);
之类的方法来控制角色的移动。

其中horizontal的具体键位可以在unity的Project_Setting当中找到

1741411044692

1741411039173

当我们移动角色的时候,如果使用帧数进行移动,那么极有可能会发生不同配置的电脑移动速度不一致的情况
那么我们会有两种解决方法
1.通过在start()当中设定:
QualitySetting.vSyncCount = 0;
Application.targetFrameRate = 10;
进行游戏的锁定帧数,很多游戏例如黑暗之魂3和血源诅咒都使用了这种设定,但是缺点便是牺牲了上限,同时需要注意的是,在进行锁帧的时候,你需要使用QualitySetting.vSyncCount = 0;来关闭垂直同步。
2.将游戏的底层通过Time.deltaTime来进行设定
通过取现实世界每一帧的时间来设定移动的距离,可以抵消不同帧数之间的移动速度不同问题

第二节:TileMap

Unity 安排了很多种tilemap
具体操作方法:
在层次列表里面创建一个tilemap grid rectangle

1741498223302

在windows-2d-tilemap palette里创建一个tile palette panel,之后创建一个tile,这个tile赋予你需要的sprite,然后将这个tile拖拽到你创建的tile palette当中(注意你必须要自己在tilepale界面里面创建palette才能进行拖拽),之后你就可以进行创作了。

需要注意的几点:
1你创建的tile注意要调整sprite的pixel per unit填充,不然你画出来的tile可能会产生缝隙。
2你创建的tilemap可能会与玩家的图层发生冲突,注意调整图层的优先级
3你创建的tile如果要进行删除,请在palette面板当中选中选择工具,之后选中你要删除的tile,然后在inspector里面进行移除。

1741498113007

Tile分为很多种:
1,ruleTile,先设置你要当作中介的tile sprite,之后可以在下面创建更多的tile,然后进行设置,其中绿色代表可以进行扩张的区域,红色代表不可以进行扩张的区域,之后就可以在tilemap当中进行程序化编辑

1741498304239

2,最简单的tile,如果你将sprite强行拖拽进入tile palette当中,就会产生这种紫色的单个的tile

1741498331979

3,rule override tile,如果你需要进行rule tile生成逻辑上的一一对应,不想再设置生成tile的逻辑,可以使用这种tile

1741498366376

4,advance rule override tile,和上面的tile比较类似,不过可以对每一个tile进行更加详细的设置。

第三节:角色与地图的图层顺序

如果是默认情况下,角色与生成的实体往往遮罩关系混乱,但是调整图层layer又满足不了我们想要的效果

而我们创建的游戏应该随着上下坐标形成遮罩,我们一般取上方为游戏的远景,比如箱子的y坐标在我们的上方,那么我们角色的sprite就应该显示在箱子的上方,反之亦然

我们可以使用这样的方法
1741498765738

1741498915569
1741498936922

可以发现这仍然不够,我们角色在穿越物体的中间时发生了错误,因为我们是以物体的中心点为基准进行判断的。
我们要将场景中的每一个交互物体(包括角色本身)的Sprite sort point设置成pivot
1741499084707

之后我们要将物体的pivot坐标设置成物体的底层。
你可以直接设置成bottom也可以在sprite editor当中进行设置

1741499143649

之后就可以正常运行了。

注意:
1,只有sprite mode为single,才可以设置pivot
2,其次如果选择物体之后没有显示pivot,记得要把scene当中的pivot选项打开

第四节:碰撞

经过好几次案例,应该对这种操作感到熟悉,但是注意几点:
1.2d碰撞体不可以与3d碰撞体有交互
2,如果使用了rigidbody,那么记住锁住旋转

1741501268746

3,使用了rigidbody 2d 记得要将角色的移动代码设置在fixedUpdate,而输入代码设置在Update,两者的区别在于前者的帧数锁定,后者的帧数在没有锁帧的情况下往往并不稳定。
4,fixedUpdate当中的TimedeltaTimr会自动切换成TimeFixedDeltaTime

TODO:unity的刚体穿透问题

设置tileMap的碰撞体
我们给tilemap添加特殊的tileMap Collider碰撞体,之后我们需要在专门的砖块上进行碰撞体的设置
1741505691535

1741505710890

建议使用advance override rule tile
1741506125287

Unity提供了一个名为Composite Collider2D的组件,用来获取对象上所有的碰撞体,并且由此构建一个大的碰撞体

1741506288097

添加之后自动添加了rigidbody 2d
之后记得要勾选上merge
1741506321128

1741506393824

设置成static

第五节:触发器

1741507505890

在代码中,可以使用OnTriggerEnter和OnTriggerStay来设置玩家碰到触发器的触发条件

为节省资源,物体停止运动时会停止计算刚体的碰撞,我们可以通过设置sleepMode来进行调整

1741515505264

第六节:陷阱区域的缩放

1741517861451

1741517874820

如果直接对陷阱预制体进行缩放,则会造成采样失真,如图拉伸非常严重,unity提供了设定采样方式的方法
首先先重新设定陷阱的缩放为111

1741517959965

之后改变SpriteRenderer里面的DrawMode为Tiled

1741517998898

之后改变MeshType为Full Rect

1741518065054

之后再去使用矩形工具,就可以发现效果变了
1741518207844

第七节:2D帧动画

创建动画后可以直接把你想要的动画片段拖拽过来,
注意默认情况下动画的sample帧数是30帧,你需要将其调整成你想要的帧数

1741523709286

之后如果需要往右的动画,可以:
1741523847829

BLEND TREE 怎么使用
1741524349108

我们先再animator面板里面删除我们创建的所有动画,之后我们创建一个blendertree建立transition并且双击进入,之后我们进入了如上的页面,之后我们就可以再旁边添加参数
1741524585053

之后我们更改blend type为2D Simple Directional

1741524631689

之后我们的blendertree会发生如下的变化。
1741524718333

之后我们add motion Field

1741524755784
由于我们有四个不同的动画剪辑所以我们需要添加四个

1741524772876

之后我们更改motion
1741524876628

更改pos

1741524943490

之后我们可以在移动的代码中添加以下的字段
1741526574104

以来实现最低限度的动画控制

1741584406780

获取角色静止时候的面朝向

1741584873264

1741586443166

1741586658376

OnTriggerStay 的触发时间段和 Update 不完全相同,它实际上和 FixedUpdate(物理更新)同步,而不是 Update(帧更新)。

第八节:cinemachine

1741590821089

1741591091732

在hierachy视口中创建cinemamachine

1741591302260

将你的游戏人物在cinemamachine的follow里设置成跟随

1741592030793

为了不将摄像机移动到地图外,在add extension下面添加cineMachine confiner

1741592473716

之后在hierachy窗口里面创建一个cameraConfiner,给它安装上2d碰撞器,之后将碰撞盒设定成你摄像机需要限制的范围

1741591915162

注意
1741592655288

第九节:粒子系统

unity的内置粒子系统是在CPU上运行的,
unity的Visual Effect Graphics则是在GPU上运行的。

在hierachy当中右键-effect-particle system创建粒子系统
1741593575691

之后在inspector视图里面将Texture sheet animation勾选上,之后更改mode为sprites

1741593793178
我们添加了两个sprite,这个时候只会显示第一个sprite
但是我们可以对其进行更改:
1741593850737
更改成Random Between Two Constants
1741593899551
更改数值之后,我们生成了两种粒子,但是发现粒子在生成之后也会发生改变,有时候我们不需要这种效果,这个时候我们可以调整曲线

1741593974798

1741594528758

之后我们点击shape
可以观察到粒子系统生成的形状我们可以设置这个锥体的形状,我们可以把它的半径设定成0

1741594158302

可以给粒子生成时的形状初始速度生命周期添加随机性来使得粒子更加贴近想要的效果

1741594533694

但是我们现在物体消散是突然消散的,我们想要它缓慢消失,这时候我们可以调整

1741594697861

点进去后我们选择上面的点可以调整他在整个生命周期的alpha值

1741594922881

我们将其修改成0
之后得出效果
1741594984894

之后更改size over lifetime

1741595110566

1741595146767

添加simulation space,让烟雾不随机器人走动而摆动
1741595255435

在代码中控制smoke effect使用stop可以使其缓慢消失
1741595836379

关于爆发特效你可以在scene页面重播特效动画,注意要在emission里面把burst打开,并且把loop和duration设置一下。

1741596865451

第十节:UI系统

unity分为ugui,imgui,uitoolkit三大需要学习的ui对象

我们拖动图片到canvas,可能会发生画面拉伸现象,这个时候点击set native size就可以了

1741598787827

设置锚点
当我们将头像image放入heath框架image中的时候,如果我们缩放heathImage,动物头像不会发生相应的缩放,这个时候我们需要将锚点进行匹配(左上角的风车形状图标)

1741602915294

1741602970839

遮罩:
添加Mask遮罩层来模拟血条,我们添加了mask 和 bar父子对象

1741603890268

我们将遮罩(白色区域)对其血条框架,并且将其锚点设定在最左边,这样我们进行缩放的时候这个血条就会从右边往左边进行缩放。之后将子对象bar对白色区域进行填充,并且将其锚点设置在左上角

1741603949006

之后我们在Mask里面添加Mask组件
1741604155505

并且将其show mask graphic给它勾选关闭

1741603866155

之后我们就可以将其进行血条的控制模拟了1741604218362使用这样的代码进行血条的控制
1741604895467

第十一节 :音效

通过blend把音效设置成3D,并且给你的角色添加一个Audio Listener组件。之后就可以在曲线上调整音效的范围和音效变化的曲线,注意在Unity 2D中仍然有z轴,z轴相差过大也会听不到音效