Unity Shader 入门精要高级
教程笔记的对象是b站白熊游戏制作的教程,供本人参考,看完花费两天,在长久吃灰unity之后用这个教程复习了一些基本知识,部分文字取自chatgpt
第一节:控制角色输入输出
当我们要让角色进行移动的时候,我们需要创建一个脚本,通过类似于
moveX = Input.GetAxis(“Horizontal”);
之类的方法来控制角色的移动。
其中horizontal的具体键位可以在unity的Project_Setting当中找到
当我们移动角色的时候,如果使用帧数进行移动,那么极有可能会发生不同配置的电脑移动速度不一致的情况
那么我们会有两种解决方法
1.通过在start()当中设定:
QualitySetting.vSyncCount = 0;
Application.targetFrameRate = 10;
进行游戏的锁定帧数,很多游戏例如黑暗之魂3和血源诅咒都使用了这种设定,但是缺点便是牺牲了上限,同时需要注意的是,在进行锁帧的时候,你需要使用QualitySetting.vSyncCount = 0;来关闭垂直同步。
2.将游戏的底层通过Time.deltaTime来进行设定
通过取现实世界每一帧的时间来设定移动的距离,可以抵消不同帧数之间的移动速度不同问题
第二节:TileMap
Unity 安排了很多种tilemap
具体操作方法:
在层次列表里面创建一个tilemap grid rectangle
在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里面进行移除。
Tile分为很多种:
1,ruleTile,先设置你要当作中介的tile sprite,之后可以在下面创建更多的tile,然后进行设置,其中绿色代表可以进行扩张的区域,红色代表不可以进行扩张的区域,之后就可以在tilemap当中进行程序化编辑
2,最简单的tile,如果你将sprite强行拖拽进入tile palette当中,就会产生这种紫色的单个的tile
3,rule override tile,如果你需要进行rule tile生成逻辑上的一一对应,不想再设置生成tile的逻辑,可以使用这种tile
4,advance rule override tile,和上面的tile比较类似,不过可以对每一个tile进行更加详细的设置。
第三节:角色与地图的图层顺序
如果是默认情况下,角色与生成的实体往往遮罩关系混乱,但是调整图层layer又满足不了我们想要的效果
而我们创建的游戏应该随着上下坐标形成遮罩,我们一般取上方为游戏的远景,比如箱子的y坐标在我们的上方,那么我们角色的sprite就应该显示在箱子的上方,反之亦然
我们可以使用这样的方法
可以发现这仍然不够,我们角色在穿越物体的中间时发生了错误,因为我们是以物体的中心点为基准进行判断的。
我们要将场景中的每一个交互物体(包括角色本身)的Sprite sort point设置成pivot
之后我们要将物体的pivot坐标设置成物体的底层。
你可以直接设置成bottom也可以在sprite editor当中进行设置
之后就可以正常运行了。
注意:
1,只有sprite mode为single,才可以设置pivot
2,其次如果选择物体之后没有显示pivot,记得要把scene当中的pivot选项打开
第四节:碰撞
经过好几次案例,应该对这种操作感到熟悉,但是注意几点:
1.2d碰撞体不可以与3d碰撞体有交互
2,如果使用了rigidbody,那么记住锁住旋转
3,使用了rigidbody 2d 记得要将角色的移动代码设置在fixedUpdate,而输入代码设置在Update,两者的区别在于前者的帧数锁定,后者的帧数在没有锁帧的情况下往往并不稳定。
4,fixedUpdate当中的TimedeltaTimr会自动切换成TimeFixedDeltaTime
TODO:unity的刚体穿透问题
设置tileMap的碰撞体
我们给tilemap添加特殊的tileMap Collider碰撞体,之后我们需要在专门的砖块上进行碰撞体的设置
建议使用advance override rule tile
Unity提供了一个名为Composite Collider2D的组件,用来获取对象上所有的碰撞体,并且由此构建一个大的碰撞体
添加之后自动添加了rigidbody 2d
之后记得要勾选上merge
设置成static
第五节:触发器
在代码中,可以使用OnTriggerEnter和OnTriggerStay来设置玩家碰到触发器的触发条件
为节省资源,物体停止运动时会停止计算刚体的碰撞,我们可以通过设置sleepMode来进行调整
第六节:陷阱区域的缩放
如果直接对陷阱预制体进行缩放,则会造成采样失真,如图拉伸非常严重,unity提供了设定采样方式的方法
首先先重新设定陷阱的缩放为111
之后改变SpriteRenderer里面的DrawMode为Tiled
之后改变MeshType为Full Rect
之后再去使用矩形工具,就可以发现效果变了
第七节:2D帧动画
创建动画后可以直接把你想要的动画片段拖拽过来,
注意默认情况下动画的sample帧数是30帧,你需要将其调整成你想要的帧数
之后如果需要往右的动画,可以:
BLEND TREE 怎么使用
我们先再animator面板里面删除我们创建的所有动画,之后我们创建一个blendertree建立transition并且双击进入,之后我们进入了如上的页面,之后我们就可以再旁边添加参数
之后我们更改blend type为2D Simple Directional
之后我们的blendertree会发生如下的变化。
之后我们add motion Field
由于我们有四个不同的动画剪辑所以我们需要添加四个
之后我们更改motion
更改pos
之后我们可以在移动的代码中添加以下的字段
以来实现最低限度的动画控制
获取角色静止时候的面朝向
OnTriggerStay
的触发时间段和 Update
不完全相同,它实际上和 FixedUpdate(物理更新)同步,而不是 Update
(帧更新)。
第八节:cinemachine
在hierachy视口中创建cinemamachine
将你的游戏人物在cinemamachine的follow里设置成跟随
为了不将摄像机移动到地图外,在add extension下面添加cineMachine confiner
之后在hierachy窗口里面创建一个cameraConfiner,给它安装上2d碰撞器,之后将碰撞盒设定成你摄像机需要限制的范围
注意
第九节:粒子系统
unity的内置粒子系统是在CPU上运行的,
unity的Visual Effect Graphics则是在GPU上运行的。
在hierachy当中右键-effect-particle system创建粒子系统
之后在inspector视图里面将Texture sheet animation勾选上,之后更改mode为sprites
我们添加了两个sprite,这个时候只会显示第一个sprite
但是我们可以对其进行更改:
更改成Random Between Two Constants
更改数值之后,我们生成了两种粒子,但是发现粒子在生成之后也会发生改变,有时候我们不需要这种效果,这个时候我们可以调整曲线
之后我们点击shape
可以观察到粒子系统生成的形状我们可以设置这个锥体的形状,我们可以把它的半径设定成0
可以给粒子生成时的形状初始速度生命周期添加随机性来使得粒子更加贴近想要的效果
但是我们现在物体消散是突然消散的,我们想要它缓慢消失,这时候我们可以调整
点进去后我们选择上面的点可以调整他在整个生命周期的alpha值
我们将其修改成0
之后得出效果
之后更改size over lifetime
添加simulation space,让烟雾不随机器人走动而摆动
在代码中控制smoke effect使用stop可以使其缓慢消失
关于爆发特效你可以在scene页面重播特效动画,注意要在emission里面把burst打开,并且把loop和duration设置一下。
第十节:UI系统
unity分为ugui,imgui,uitoolkit三大需要学习的ui对象
我们拖动图片到canvas,可能会发生画面拉伸现象,这个时候点击set native size就可以了
设置锚点
当我们将头像image放入heath框架image中的时候,如果我们缩放heathImage,动物头像不会发生相应的缩放,这个时候我们需要将锚点进行匹配(左上角的风车形状图标)
遮罩:
添加Mask遮罩层来模拟血条,我们添加了mask 和 bar父子对象
我们将遮罩(白色区域)对其血条框架,并且将其锚点设定在最左边,这样我们进行缩放的时候这个血条就会从右边往左边进行缩放。之后将子对象bar对白色区域进行填充,并且将其锚点设置在左上角
之后我们在Mask里面添加Mask组件
并且将其show mask graphic给它勾选关闭
之后我们就可以将其进行血条的控制模拟了使用这样的代码进行血条的控制
第十一节 :音效
通过blend把音效设置成3D,并且给你的角色添加一个Audio Listener组件。之后就可以在曲线上调整音效的范围和音效变化的曲线,注意在Unity 2D中仍然有z轴,z轴相差过大也会听不到音效