- 博客(58)
- 收藏
- 关注
原创 Unity高清渲染管线——HDRP配置文件
这是针对布料材质的设置,打开它就会为项目中的布料材质单独开辟一个空间来存储反射探针(布料的反射和一般的反射计算方式不同),但是打开了这个设置会让一般的反射探针数量减少一半(因为相当于增加了一份反射探针数据,但是保存数据的位置大小不变,所以会将场景中的普通反射探针减半)(在光照相关章节会详细介绍HDRP中的阴影,包括Shadowmask。首先Grading LUT(颜色分级查找表) 的 Size(尺寸)控制的是颜色的精度,他所提供的32是最平衡的数值,这个同样是提升画质降低性能的设置。
2025-03-28 10:03:27
1230
原创 unity学习-异步场景加载
一般异步场景的加载都是会弹跳到进度条界面,进度条界面加载的同时异步场景也会在后台加载,但是为了防止进度条动画没走完场景就跳转了,所以我们可以先将异步操作的结果存储起来。我们可以摒弃掉一定要到最后才加载下一个场景的观念,可以将加载场景的任务设置在任何地方,放在携程函数下,加载场景的任务和游戏运行任务同时进行。//异步场景加载//后台加载。这叫做异步加载场景,需要调用加载场景的SceneManager.LoadSceneAsync()方法。我们的项目在加载场景的时候如果需要加载的场景过大的话就会卡很久,
2024-10-31 17:41:32
525
原创 unity项目开发-基于MVC架构的俄罗斯方块
在游戏菜单界面除了UI的显示还有背景,背景的大小取决于相机的大小,所有哦我们需要让相机在游戏初始化的时候设定为我们指定的大小。我们需要在合适的时候将游戏的状态设置出来,然后根据当前游戏状态显示对应的UI以及运行对应的底层逻辑,这就是状态机的原理。用MVC架构开发的游戏有很强的可塑性,如后期修改模型,将2d变成3d,不用修改整个程序,只需要修改对应的架构就行。当游戏初始化的时候将游戏状态的枚举类型设置为菜单,当检测到游戏状态为菜单时就需要将菜单对应的UI激活。
2024-10-31 17:25:04
851
原创 unity学习-雾的渲染
在Light面板下的Other Settings中勾选fog就会让场景中生成雾气。在Start和End之间会形成一个雾气由少变多在变少的效果。当Mode调整为Linear模式会多出两个选项。Start:设置之前的位置不显示雾气。Start:往前从多少米开始。End:到多少米有雾气。Density:密度。
2024-10-16 18:43:12
578
原创 unity学习-渲染路径
Legacy Veitex Lit:顶点光照,只支持渲染光照到达顶点级别的,只会渲染顶点,提高模型的精度(顶点)后光照效果会变得细腻,不支持实时阴影,但效率高。Forward:像素级别的计算,细腻,支持查抗锯齿,缺点:只支持一个全局光,当多个光照打到物体上渲染非常慢,不适合与灯光多的场景。Deferred:延时渲染,最好的渲染,拥有最高的保证度以及最好的阴影路径,支持多盏实时灯光影响,不支持抗锯齿。在主摄像机下面有个Rendering Path设置,可以选择场景的渲染路径。
2024-10-16 18:36:08
162
原创 unity学习-自发光材质
自发光材质就是一个可以发射自身光的材质创建一个材质勾选Emission选项将材质变成自发光,下面可以修改颜色将物体设置为Static来烘焙光照贴图,在烘焙光照贴图的时候要选中材质确保材质主物体的Generate Lightmap UVs勾选会减少很多烘焙的问题烘焙完成后自发光材质的光就会生成光照贴图
2024-10-16 18:17:27
461
原创 unity学习-反射探针Reflection
在动态物体移动的时候身上接收的反射探针信息并不会改变,这是因为反射探针这个相机是静止的,我们可以将反射探针设置为需要反射的动态物体的子物体,然后将反射探针的坐标与动态物体设置为一致,这样就可以完美接受反射探针的图像了。想要反射探针反射的信息根据场景的改变而改变可以将反射探针的Type标签改为Realtime(实时)由于反射探针相当于一个摄像机所以反射探针输出给动态物体的图像信息也会将动态物体本身照射进去。会将创建出来的物体接收到的静态物体反射信息赋值给区域中的动态物体。而反射探针是反射接收到的图片信息。
2024-10-16 17:02:01
629
原创 unity学习-灯光探针
在场景中可以创建一个灯光探针组Light Probe Group,他的组成是很多球状物体,也就是一个个灯光探针 ,当场景中的物体都变成静态后就不会将间接光线反射到移动的物体身上了,为了节省性能我们可以用灯光探针的功能来实现对动态物体的间接光照,灯光探针会接受它当前位置的灯光信息然后反射出来,照在动态物体上形成光照,实现实时间接光照的效果。
2024-10-16 16:29:02
191
原创 unity学习-烘焙光照参数详解
当使用灯光烘焙时,会出现两张必须的贴图在Global界面,分别是灯光颜色贴图以及灯光方向贴图,分别存储灯光颜色信息以及灯光方向信息(一张图存不下)Lightmap Size:光照贴图的大小,当贴图变小,那么就需要更多贴图来存放信息,贴图数量会变多。Final Gather:环境反射光,举例:给红色的墙打光,红光会反射到旁边的白墙上,细节更加丰富。Lightmap Pesolution:直接光照烘培的精度,光照贴图的细腻程度。Lightmap Padding:贴图的间隙,确保每张贴图都贴到正确的位置。
2024-10-15 20:25:25
548
原创 unity学习-全局光照(GI)
全局光照是由直接光照和间接光照组成的,直接光照是直接打到物体上的光,间接光照是由物体反射出来的光,如果没有间接光照的话就会出现只有打光的地方亮,没有直接打光的地方一片漆黑。Realtime Light(实时光照):在项目中会提前计算好光照以及阴影的程序,当你需要调用实时全局光照的时候会将程序调用出来使用。在全局光照(Lighting)界面有两个选项。Mixed Light(烘焙光照)
2024-10-15 18:57:15
461
原创 unity学习-光照贴图烘焙
烘焙模式的光属于静态光,只能烘焙到静态物体上,所以我们需要将需要烘焙的物体勾选Static标签,烘焙后的物体上面的的光就不会在随着移动而变化了。将光照烘焙成贴图后可以使运算负荷减小,首先我们需要将打上去的光调整成为烘焙模式。
2024-10-15 17:22:39
281
原创 unity学习-灯光类型
Spotight:圆锥型光源,一般用于车灯,Spot Angle(用来调整圆锥的角度),cookie光照贴图,可以改变灯光样式,如格子形状灯光等等(需要灯光专属贴图)里面有两个选项:Gamma(光照的对比度更高),Linear(光照更加柔和),一般不用Gamma空间,但是有的平台限制不支持Linear。选择Edit-Project-Settings-Player-Color-Space。Area Light:烘焙环境光(下一节详细说明)可以调整场景的线性空间来使光照达到不一样的效果。
2024-10-15 17:10:33
329
原创 unity学习-Directional light光的设置
Mode:灯光模式,Realtime(实时光影),实时计算光影,消耗性能但是效果好,Baked烘焙光影,将光的照射效果作为贴图贴在静态的物体上形成一种虚假的光照效果,不会实时渲染动态物体。Culling Mask:遮罩剔除,可以选择光照射的物体,给需要剔除的物体改变层级,然后在该选项中取消勾选对应的层级。Shadow Type:设置光照产生的阴影样式, 内有3个选项分别为,柔和的影子,硬的影子,无影子。Cookie:光照贴图,一般用于点光源,可以让光照出图案。Bias加上下面的两个选项:偏移。
2024-10-15 16:35:54
455
原创 unity学习-自定义天空盒
unity的天空盒可以在网上下载专门的天空盒图片,导入unity之后将图片的TextureShape写改为cube(立方体),这样图片就变成一个盒子了,将盒子拖入场景中去就可以改变场景中天空盒的样式。在将图片丢入场景变成天空盒之后就会在资源管理位置生成一个材质,调整材质的属性可以改变天空盒的样式。我们可以调整天空盒的颜色,曝光,角度。Exposure:调整天空盒的曝光。Rotation:调整天空盒的角度。Tint Color:改变颜色。
2024-10-14 20:37:41
137
原创 unity学习-渲染优化
我们在unity中一个模型如果距离远了看起来就会模糊,但是它实际上是按照原样来进行渲染的,那我们可以在距离他一定距离的时候将模型替换为粗糙一些的也看不出来,这时候我们可以用LOD组件,LOD组件分为4个档次,每个档次可以放置一个模型,当距离远的是后模型会自动替换,设定的距离可以调整。cpu:什么都干,主要处理代码的逻辑与传递信息,将需要DrewCall传递进gpu。gpu:主要处理渲染方面,实现DrewCall。cpu与gpu的区别。
2024-10-08 17:57:51
553
1
原创 unity笔记-资源优化
Resources文件夹下面的文件不管是否被引用都会被打包,将不需要的文件删除。检测资源是否冗余以及性能的优化可以到UWA官网将文件上传后检测出表格。相同文件放在不同的文件夹如果被引用那么都会被打包形成冗余资源。将贴图合并减少DrewCall。2,减少冗余资源和重复资源。减少模型的面数和顶点数。
2024-10-08 17:37:52
299
原创 项目-坦克大战学习-游戏结束
当boos受到伤害时游戏结束,游戏结束时我们需要将窗体全部绘制从别的画面,这样我们可以在游戏运行类中的update设置条件,在游戏运行类thread创建一个枚举类型定义是否游戏结束。}//如果结束调用绘制结束页面方法。//定义现在游戏运行状态。public static void gameover()//游戏结束。if (game == Game.play)//如果没结束。
2024-10-05 12:23:05
531
原创 项目-坦克大战学习-控制人机发射子弹以及玩家受到攻击
/传入修改后的point调整子弹生成位置标签为人机。我们需要设置一个方法让子弹发射有间隔,可以在子弹类中设置一个计数器,每运行一帧计数器加一,当计数器变为我们设定的时间时运行子弹生成方法然后将计数器重置。在子弹类中我们有子弹碰撞到人机的方法,可以在方法前加一个前置条件,如果当前子弹的标签为wanjia才能运行碰撞程序,否则无视碰撞。//修改子弹生成位置。if (zd == zidanen.wanjia)//如果是玩家发射的子弹。if(zd==zidanen.renji)//如果子弹是由人机发射出。
2024-10-05 11:25:38
424
原创 项目-坦克大战学习-爆炸特效消除
对于爆炸特效的消除有个非常简单的想法,给爆炸类设置一个bool检测是否爆炸完成,初始为false在爆炸特效4图片索引处检测,如果索引为4(所有图片播放完成)那么将bool改为true。//放置需要消除的爆炸对象。然后在对象设置类中做检测将bool值为true的对象挑拣出来消除掉,具体消除方式参考子弹消除。private static void xiaohuiboom()//销毁爆炸特效方法。if (index == 4)//如果播放完成那么重复播放,防止索引超出界限。//每运行一次计数器加一。
2024-10-04 22:15:55
318
原创 项目-坦克大战笔记-子弹命中时的爆炸特效
由于我们需要将图片的黑色部分设置为透明,可以在调用构造函数时设置图片,然后将设置图片生成位置为传入位置的左上方一些,确保传入位置在图片的中心。protected override Image shehziImage()//重写设置图片方法。private static void shezhiindex()//设置生成的图片索引。public static void boom(int x,int y)//设置爆炸特效。爆炸类中有几个必须要的参数,构成动画的五张图片,动画播放速度,更换图片计数器,图片索引。
2024-10-04 21:41:27
512
原创 项目-坦克大战笔记-墙体销毁以及人机销毁
if (gudin.getjuxing().IntersectsWith(rt))//获取墙的矩形调用IntersectsWith方法检测与传递进来的矩形是否碰撞。public static renji renjipengzhuang (Rectangle re)//检测人机碰撞。if (rg.getjuxing().IntersectsWith(re))//如果碰撞。public static void wallxiaohui(gudin wall)//检测墙销毁。//创建一个人机类型检测碰撞到的人机。
2024-10-04 13:02:54
425
原创 项目-坦克大战学习-子弹的移动与销毁
但是我们不可以直接在检测超出的位置设置子弹的销毁,因为检测超出的时候列表还在运行,而销毁的方法是将子弹在列表中抹除,在列表运行时修改列表会出bug,所以我们换一种方式,给超出界限的子弹打上标记,然后在列表实例化完后在运行一个方法将打上标记的子弹销毁,这样就不会在列表运行期间对列表进行更改了。子弹的移动可以参照人机的移动方式,在创建出来的时候就将yidong设置为true然后给一个速度就行了,子弹的销毁代码可以借用坦克的超出检测代码,将检测到超出后执行的程序修改成销毁程序就行。//放入销毁检测列表。
2024-10-04 10:10:43
275
原创 项目-坦克大战笔记-子弹的生成
我们发现创建出来的子弹位置有些歪,因为创建出来的时候子弹的中心点我们是在坦克创建是的point点位,要想子弹刚好在炮口位置上,我们需要创建一个临时的x和y根据方向的不同将修改后的位置放入。子弹的生成就像人机的生成一样,只不过没那么多种类的图片对象,而且不用设置初始方向,但是需要对子弹进行分类成wanjia和renji,在创建子弹的时候将方向传参就行了。public static void zidan(int x,int y,zidanen zid,fangxiang fx)//控制子弹的生成。
2024-10-03 22:06:03
481
原创 项目-坦克大战学习-资源冲突解决
fangxiang.Up||yidong==false)//如果传入的方向不等于当前移动方向或者停止移动。我们要将按下设置为同一个方向只检测一次很简单,只需要在按下检测处增加一个条件,如果检测到按下的方向等于当前方向那么设置方向的代码不执行就可以了。//修改默认方向,在下一帧调用时更改绘制对象。这是修改后的代码,给按下检测传参设置了条件如果传入方向不等于当前方向或者目前坦克停止移动才可以运行。这是因为当我们按住方向键不动的时候窗体的按下事件就会多次触发,这样就会使一个资源被多次调用。
2024-10-03 17:24:26
274
原创 知识扩展-随机数
随机数的原理是创建一个种子Random调用当前系统时间的毫秒来当作随机数。所以随机数的运用一般是设置一个种子然后多次调用,这样截取的数才会不一样。否则两个随机数函数创建两个种子在相同的时间调用那么出来的随机数也会相同。所以我们在运用随机数的时候一般都会多次调用而不是重新创建一个种子。这节讲解一下随机数的运行规则方便大家使用时可以更加清晰。
2024-10-03 17:00:58
241
原创 项目-坦克大战学习-人机ai
我们要知道,人机的移动和玩家的移动方式是一样的,所以我们可以将玩家移动代码以及检测碰撞代码移过来,唯一不同的就是人机检测到碰撞后会改变方向继续移动而不是停止。//强制类型转换随机数1到5(不包含5)fx = (fangxiang)rd.Next(1, 5);如果相等就再次调用随机数,反之就将人机方向转换为转换后的方向。在方法中首先我们定义一个新的方向变量用来存储改变后的方向。Right=4//方便随机数设置方向。
2024-10-03 16:54:43
339
原创 项目-坦克大战学习-人机随机生成
然后设置人机生成条件,目前设置条件为运行60帧后(一秒后)生成一次,我们可以设置一个数,每当方法运行一次计数器就会加一,等到计数器加到60就向下运行人机生成的代码然后将计数器归0。//创建一个坐标随机放置生成人机的位置。private static void renji2(int x,int y)//实例化人机Green。private static void renji1(int x,int y)//实例化人机Gray。foreach (renji renji in renjilist)//实例化人机。
2024-10-03 11:00:08
667
原创 项目-坦克大战笔记-控制玩家坦克碰撞墙体
但是这么写的话坦克与墙体发生一次碰撞后就会一直检测正在碰撞,坦克会被卡住不能动,所以我们需要设置为当发出移动指令后检测下一步移动是否会发生碰撞,只需要将移动方向对应的x或者y增加移动距离就可以得到移动后的矩形。if (gudin.getjuxing().IntersectsWith(rt))//获取墙的矩形调用IntersectsWith方法检测与传递进来的矩形是否碰撞。public Rectangle getjuxing()//创建一个方法,用来获取对象的矩形用于碰撞检测。//返回发生碰撞的墙。
2024-10-02 23:28:32
526
原创 项目-坦克大战学习笔记-控制玩家坦克不超出地图范围
由于坦克自身有占用像素格,而坦克生成位置是以左上角x,y的点开始生成,所有坦克向下和向右的实际碰撞位置应该是坦克生成位置加上坦自身宽或高,而坦克有四个方向就有4种对象碰撞可能,所以我们在物体对象的父类中声明存储物体宽和高的int类型。if (Fangxiang == fangxiang.Up)//检测坦克目前朝向。//设置父类继承过来的图片对象高。//设置父类继承过来的图片对象宽。}//放置图片对象的高。}//重写方向构造函数,调用传入的方向信息设置图片的宽高信息。
2024-10-02 22:10:48
682
原创 项目-坦克大战学习笔记-坦克移动
这时候我们需要创建一个方法将父类的绘制方法包含进去再加上自身的检测移动方法,为了方便后续使用我们可以在父类中创建一个虚方法让子类重写。上一节我们还说了在检测按下事件还有对应匹配的检测松开,这时候我们就可以在检测松开处检测如果松开按键就将移动设置为false。我们每帧会调用GameObject类中的绘制方法,玩家坦克类身为他的子类,可以直接调用他的绘制方法。//获取父类中此方法的代码,获取绘制方法。对于坦克的移动,我们只需要检测坦克方向键是否被按下,然后检测按下的方向移动。
2024-10-01 23:40:20
387
原创 项目-坦克大战学习笔记-按键按下控制方向
着两个方法是连用的,按住不放就会一直触发KeyDown,在窗体类中会对次方法进行检测,我们需要通过窗体类中的按下检测方法调用玩家坦克类中的信息并修改,那么就需要一层层将按下这个信息传递下去。在到玩家坦克类中创建一个方法接收传递过来的KeyEventArgs类型,然后检测传递过来的按键信息来调用case选择函数做到4个方向图片对象切换。在窗体类中进行检测后在方法中调用另一个方法,此方法为调用玩家坦克类中 的方法。这样,就可以设置按键,根据在窗体运行时按下的按键来更改坦克方向了。
2024-10-01 22:40:08
431
原创 项目-坦克大战学习笔记-绘制坦克
首先,我们在玩家类中声明一个构造函数,需要传参的有坐标和速度,在里面默认设置玩家坦克4个方向的图片对象以及默认方向。public wanjia(int x,int y,int speed)//构造函数。在创建好玩家坦克信息后创建一个绘制玩家坦克方法,调用GameObjcte方法中的绘制函数。在duixiangweizhi类中创建玩家坦克的初始位置信息,首先声明一个玩家坦克变量。public static void Tank(int x,int y)//设置玩家。//定义一个玩家坦克类型。
2024-10-01 21:18:09
243
原创 项目-坦克大战学习笔记-地图完善
/在30,30的位置创造竖着的五个墙体,传入(位置,数量,储存对象信息的列表)//在30,30的位置创造竖着的五个墙体,传入(位置,数量,储存对象信息的列表)private static void boos(int x,int y, Image img,Listlist)//放置boos专用方法。//创建一个列表放置铁块。foreach (gudin n in booslist)//遍历boos列表。foreach (gudin n in walllist)//遍历墙体列表。
2024-10-01 18:19:55
571
原创 项目-坦克大战笔记-让窗体不因为刷新闪烁
在我们上一节代码写完后启动窗体会发现绘制的墙体总是闪烁,这是因为每一帧地图都在重新绘制,而每一帧除了绘制墙体之外还会给地图刷一层黑色来重置地图,由于刷新地图和绘制墙体属于先后顺序,所以在窗体显示中墙体会被覆盖然后又重新出现,这时候我们可以定义一个临时使用的图片,将刷新后的背景和新绘制的墙体全部先绘制到图片上,然后将图片一次性绘制到窗体画布上,这样就不会出现黑色背景和墙体交替出现的情况了。最后,在临时画布绘制调用一次后在窗体画布上将临时画布绘制的图片一口气绘制出来,此操作在每帧调用一次的位置。
2024-09-30 22:18:43
200
原创 项目-坦克大战学习笔记-地图绘制
由于实际一格墙体是15*15像素,太小了,所以我们定义一块墙体由4格墙体拼起来也就是30*30像素所以我们用count定义墙体数量,然后乘以30定义那一条墙体占用空间,在用for遍历墙体长度将15*15的墙体对象存储一条竖列进去,然后在定义一条竖列墙体,将x的位置增加15放在第一条墙体右边,然后用ADD函数将所有定义的gudin类型放入列表,这样一条完整墙体的位置以及图片信息就储存好了。//在30,30的位置创造竖着的五个墙体,传入(位置,数量,储存对象信息的列表)//将gudin类墙体信息放入列表。
2024-09-30 21:15:56
398
原创 项目-坦克大战学习笔记-地图对象绘制思路
需要将父类设置为抽象类abstract才能在里面设置抽象方法,抽象方法在父类中调用却在子类中定义,根据子类中定义后传入的image返回值传入绘制方法中调用方法在窗体中绘制对象。protected override Image shehziImage()//根据方向设置图片传到GameObject类的绘制函数将指定图片绘制出来。//调用画布变量的绘制图片方法,传入(图片,坐标)在Object类中有4个子类,他们都继承在Object,在父类中,我们需要实现对象的绘制,坐标的定义。}//设置向下的图片。
2024-09-30 00:06:08
447
原创 项目-坦克大战学习笔记-多线程设置游戏内容
在定义的类中我们需要设置游戏的初始化和每帧更新的运行Start函数和Update函数,将游戏地图的初始化放在Start函数里面,将游戏中需要多次调用的地图刷新和操作检测类放在Update里面,但是我们需要限制以下Update函数使其调用为一秒60帧,不然每台电脑刷新的帧率不一样那么游戏运行速度也不一样,这时候就要调用前面提到的线程方法来使调用一次Update就让当前运行的线程休息sleep(60分之一秒的毫秒),使一秒钟固定运行60帧。//调用tankthread类的函数初始化。//调用Update。
2024-09-27 23:32:50
193
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人