《生存之战》经验整理总结

开发思想

任何一款游戏的开发都有一个过程,这个过程不管是简单的还是复杂的,都会有一定的流程和顺序。作为还未熟练掌握游戏开发框架的人员来说开发中具备拆解和迭代思想就显得格外重要。
要知道整个大型项目分割为若干个大的功能模块,大的功能模块再细分为针对性的子模块,子模块细分为具体的功能类,然后从最小的功能类一步一步实现整个项目。模块划分没有标准答案明知要划分合理,方便开发,就是好的划分,功能开发不是一次性到位的,都是在开发过程中,不断修改,不断完善。

功能模块

整个项目大体分为:房屋建造模块,物品合成模块,资源采集模块,地形系统模块,战斗系统模块,武器系统模块,其它功能模块。

在这里插入图片描述

技术要点

套路思路

1.Unity商店是个好东西,可以使用免费的素材,甚至还有完整的工程。Unity essentials survival shooter
2.canves的渲染模式很重要,要做好选择,设置默认分辨率,宽高根据屏幕自动适配,宽的话那就在宽度上等比例缩放,高度上可能压缩拉伸,反过来同理。
3.游戏立项设计阶段划分功能,开发时注意功能模块的依赖关系,注意先后,分析好对象是由哪些组成的,比如背包,背包框/背包槽/物品
4.gridlayoutgroup 背包脚本,具备自动布局元素的功能,可用空间就为自身范围.
5.注意利用锚点和中心点,单锚点就是以中心为坐标计算的,如果中心点有调整那么得到的效果也是不同的.分区域布局的时候,注意调解中心点,比如左区域的中心点放左边,右区域的放右边.
6.MVC,主要运用于UIPanel上,数据,视图,逻辑.c持有m和v中的字段时,需要调用属性,字段得封装.v做资源加载,组件查找,m数据的处理,c整体逻辑编写.
7.在做数据时,可以利用tostring 来展示,每一样物品都可以做一个数据实体类的对照,把数据获取,然后创建对象的时候,将对象初始化,一同把数据传过去.把数据的创建转化赋值存储流程做明白.
8.litjson必须放在Plugins文件夹中,资源加载resources.load(path).text;jsonmapper.toobject(txt);jsonmapper.toobject(jsondata[i].tojson())。
9.选项卡这种功能常用的功能完全可以使用固定套路,生成选项卡,选项卡的父物体做好gridlayer排布,然后保留一个元素隐藏,在父物体中写生成tag的方法,并持有(用list会方便),生成tag给它初始化注意传递一个标识,可以是角标,也可以是枚举,后续对tag进行操作时需要调用父物体身上的方法,就很方便区分tag的索引.
10.选项卡和对应内容都是成型的单独的,我切换一个选项卡把这这归属于该选项卡的所有内容包括装这些内容的框给切换掉了,一个选项卡对应一个装东西的框,框里在装东西.我一直在做的只有一个框,那要切换就得把框里的东西先倒出来,再装东西,这样其实浪费性能.资源都是从外层传递进去,在子级里面做好索引和接收属性,方便生成.
11.loadall try getvallue(out xxx) 利用键值对可以方便管理和查找
12.子物体生成后,带有button属性,想要按下切换状态,而上一次按下的也切换状态,这里就需要一个父物体来存储当前按键对象,在父物体内操作这些按键,按下的切换并记录,上一次记录的恢复状态.将按下的回调传递给父物体,可获取父物体的脚本,也可直接senmanageup(this),这里this就是当前脚本,不会波及其它同名脚本,选项卡没必要重复执行,可以重复检验不执行.
13.resources.load all(),可以加载文件夹下的所有对象,Dictionary.trygetvalue(key,out value)可以尝试拿到键对应的值.
14.工具类,密封类结构体,静态方法,普通C#类
15.拖拽:避免结束时射线能检测到对象,可以添加canvasgroup,取消blocksraycasts,这个ui自带的raycadttrigger有什么差别.
16.reccttransform,setsizewithcurrentanchors(轴向,值);recttransform.axis.horizontal/vertical UGUI更改图片的宽和高.
17.给字段封装属性是一个成熟的做法,当属性发生变化时候,可以在相应位置做其他操作,比如更新ui,存储数据等
18.实例化不仅可以实例预制体,也可以实例对象 ,实例出来的新对象脚本会按awake执行,涉及到引用类型会自动初始化,值类型也会初始化.
19.为了减少耦合度,顶层MVC,功能是聚集的,但C层很多时候需要拆分,当子对象的C需要M的数据,是自己单独获取,还是从顶层M中年获取?,M中获取会职责更清晰,那如何获取,直接在子类C获取顶层M吗?还是通过顶层C来中转,自己去获取耦合度会比较高但方便,通过顶层C传过来,顶层C就需要持有底层C和M,在顶层C里面操作,这样耦合度低,但麻烦.
20.Assets 面板右键–>Import Package–>Characters 该资源包中有多个“角色控制器”,我们使用其中的第一人称控制器文件夹下的FPS 控制器。
21.FOV:Field of View,是 Camera 组件上的一个控制属性;值越大看的区域越广,看到的物体会显得越远,越小;值越小看的区域越窄,看到的物体会显得越近,越大。摄像机叠加.利用CullingMask进行遮罩剔除.
22.const常量 可以通过类名直接点出来,这可以用作那些不会改变的数值,比如 按键I打开观察背包,数字1920为屏幕固定宽度等。合理利用常量有利于代码的阅读。
23.使用bool值作为标志位可做状态切换,就像是true↔false。
24.接口的运用,对于那些常用功能,却又不适合继承的(有些子类需要,有些子类不需要)这样的情况下使用接口是个不错的选择,按需实现接口。
25.VS里面有简便方法提取方法.
26.图片里面的渲染组件,可以选择tilling属性,调整xy的值,就可以划分为x行y列。 阴影调节可以选择cast shadow off。
27.官方自带的有许多插件,比如第一人称控制器。Asset Import package Character,在资源里面可以找到 Pfscontroller
28.animator会受到对象active的状态影响, 物体对象从失活到激活,animator里面的执行会从enter开始执行。
29.使用携程做延迟是一个比较方便的选择。
30.摄像机fov值可调节视角范围,值越大视角越广,看到的物体越远也越小。多摄像机工作,需要调节clear flags
31.动画机动作之间有参数transtime duration 过渡时间,就是两个动作之间切换所需要的时间,和exit time 不一样,有退出时间,是表示当前动作得做完才能切换。
32.dotween是个好东西,43课有,非常适合调动作,通常的位置缩放旋转外,还能调摄像机的fov值。然后在调节动作时想观察效果,可直接用enter与想要调的动作连接,这样进入游戏就能触发该动作了。
33.depth值越大,显示越靠前。clear flags表示视野中那些没有被渲染到的地方,使用什么渲染方式补气,是天空盒还是纯色等等。调整近裁面可以有效防止视线穿模,如果物体从近裁面上穿过就会有穿透的状况。
34.辅助画线方式debug.drawline linerenderer
35.声音组件不用挂载,可直接使用静态方法调用播放audiosoure.playclipatpoint(),指定播放片段,指定播放位置。粒子系统也是类似的particlesystem.play
36.贴图也有许多可操作的API。可以做贴图融合,用双for循环,结合uv坐标赋值。射线可获取对象的贴图坐标值raycasthit.texturecooril()。但是需要碰撞体是meshcollider。计算坐标uv.x×主贴图宽度-弹痕贴图宽度/2+i。然后在texture.setpixel()在指定点指定颜色。如果不是meshcollider,坐标会是(0,0)
37.弹痕脚本,其作用是给物体创建弹痕。这个弹痕脚本是独立的好,就只负责弹痕的事情,怎么负责呢?我挂在谁身上,就负责管谁?获取自己的贴图,获取对应的弹痕,来一个弹痕融合方法,再来一个弹痕消除方法。完美。弹痕融合是利用的texture的uv坐标结合pixel方法,单个像素点循环赋值,效率有点低。消除的方式是先把主贴图拷贝了一份,并且用队列记录弹痕生成点,再反向给对象贴图融合给拷贝的贴图。
38.关于提取抽象类的一些思想:什么属性方法该提取到父类,什么又该提取到接口。①大家都要实现的实现的提取到父类,部分子类要实现的提取到接口。②大家都要实现的,但是实现的内容不一致的,留出参数,或者直接抽象方法,在父类的awake方法内调用。③由子类完成该方法的具体方法体。④父类子类同样的生命周期函数容易涉及到执行先后的问题,把父类的awake公开给子类,让子类调用,子类再实现自己的。我写的子类有时候要先执行自己的,我觉得有改进的空间,重构下代码。
39.方法有参数但可以让调用时不写参数的办法,在方法声明的参数里面给参数赋值,这样调用时就可写也不写参数了。void func(int num=2,string str=“haha”)
40.[requirecomponent(typeof(objectpool))]需求特性,会在初次挂上脚本的时候执行
41.子类v层与子类c层是不进行关联的,关联都在父类中进行。原由是c父类中查找v父类其实是通过子类过渡查找的,是里氏转换的结果,现在在子类的c层获取子类的v就完全可以从继承的父类c层中找到的父类v再里氏转换成子类v即可。这样就切段了子类v和c之间的关联耦合性。也就意味着,父类管理了该方法什么时候调用,子类继承父类,只需要完成该方法的方法体即可,其余的不需要子类管理.
42.刚体检测容易穿模,可以提高刚体的检测频率。刚体运动的物体是不受transform位置影响的,让对象停下来可以用rigidboy.sleep()休眠刚体。
43.trailrenderer是个不错的组建,调节宽度长度,持续时间,过渡颜色,透明度等等。
44.预制体对象他们在内存引用的是同一个“贴图对象”,其实不只是贴图,其它的也是,如果对贴图进行操作,那所有的预制体都会发生同样的变化。为避免这一点,可以在脚本里复制一份该贴图持有,所有的预制体都复制了一份,使用的就是各自的贴图资源了。
45.Mathf.SmoothDamp(current, target, ref currentVelocity, smoothTime);
46.layermask.nametolayer()这个方法是内部是怎么写的,我觉得是用string直接转 enum。
47.地图模块terrain的height是可以调节的,即可调节最大高度,也可调节平面高度使用flatten按钮,树木资源既可以在地形上导入成批种植,也可以拖入场景手动种植,其实种的就是预制体。
48.工程中有许多资源,只要是成批量的需要生成或交互的就不妨用管理器统一管理,生成点一般采用手动定位生成点的位置,获取的方法是getcompentsinchild<>获得的是数组,也包含父物体本身,使用时跳过索引为0的即可。
49.物体身上的弹痕或贴图融合,需要贴图是全面制作的,可读可写的,rgba32位的。
50.地形系统Terrain 是内置的系统,是一个建模工具,只能建造地形。地位和cube在同一层级。包括terrain系统组建,制作地形,terraincollider组建,地形碰撞,terraindata存储地形数据,assets资源。
51.地形绘制工具,地图贴图绘制工具,添加的第一张贴图会自动作为主贴图,贴图是可以编辑的调整xy值可以调节精细度。种草工具其实是二维贴图,草可种可拔,草的颜色也是可以调节的。
52.地形的绘制可以使用高度图制作,“黑白灰”的图片,导入高度图可识别图片信息自动生成地形效果。高度图的格式必须是raw格式,地形的尺寸和高度图尺寸最好保持一致。
53.布娃娃系统,可以模拟人形角色死亡.布娃娃系统路径:GameObject --> 3D Ojbect --> Ragdoll…
54.string textAsset = File.ReadAllText(jsonPath);
55.音频应该独立出来管理,使用单例,把资源放进字典,用好LoadAll<>,audioClipDic.TryGetValue(clipName,out tempClip); AudioSoure.PlayClipAtPoint(),有没有什么性能影响,不需要有音源,播放完这个音效,编辑器会自动处理它,也就是销毁了 使用枚举让参数可视化,
56.///三斜杠的注释,可以让内容变得可见,没必要省着,该用用,用不用你管理,到时候VS帮我折叠不就好了
57.CanvasGroup 组件挺好用的. Alpha:该组UI元素的透明度。需要注意,每个UI最终的透明度是由此值和自身的alpha数值相乘得到。
Interactable:是否需要交互(勾选则可交互),同时作用于该组全部UI元素
BlcokRaycasts:如果需要图形射线(GraphicRaycaster)检测。勾选后,可将此组件作为一个射线碰撞盒。注意,不适用于Physics.Raycast。
Ignore Parent Groups:是否需要忽略父级对象中的CanvasGroup的设置。(勾选则忽略)
58.做环形UI时,按中心点旋转,调整锚点,使用滚轮循环一个数据,使用大数来计数,前滚后滚有正负数之分,把初始值设为大数,可以避免这个现象.
59.射线检测层使用方式 (1<<13),表示忽略,不要怕update的使用,有些计算就该放在里面执行,你只要别把资源加载IO操作放进来,本来计算机计算数据是很快的.
60.用常见的材质球调出透明的感觉出来,在材质球的RenderingMode 属性,调整为 Transoarent,为透明模式,
61.trigger的触发 非高速物体都能使用, 可以把检测调到高频率,这没关系,谁是主动运动的一方,谁就trigger去检测.
62.IO操作,File.ReadAllText(jsonPath),可对文件进行读写,Resoures.load(@“Build\Prefabs+”)
63.有时候我们需要查找一个物体下的子物体,却不要他的孙子物体,使用childcount就能只数子物体的数量.

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值