【发烧期间随笔】第一次游戏开发经历的总结与反思

news2024/11/18 20:19:21

一、前言

这两天三阳了,头疼头晕恶心发烧打喷嚏流鼻涕咳嗽嗓子疼气管疼都找上门来了,这导致一周以来都没学什么东西,无意间又刷到各个游戏厂关于本人目标岗位HC骤减且要求造火箭的能力的消息,这两天一直是在病痛和焦虑中度过的,躺着就焦虑自己在浪费时间,坐到电脑前又没有精神集中可以学习,因为阳了。但是我还是想尝试写一些东西,说是打发时间也好,或者恢复一下脑子,总之就是想记录一下当时第一次游戏开发的一些经历和感想吧,对自己以后的工作可能也会有一些帮助。(写文章时脑子仍然处于发烧状态,如果出现胡言乱语,还请见谅)

这里我主要想阐述我自己视角下的一些东西,因为当时我是担任程序和一部分策划的工作,关于美术我只负责了一定的美术资源的处理和使用,并没有美术资源产出,所以也不会有什么见解。我想写一些关于游戏开发的个人思考吧,方便小白参考,也方便我日后回顾,当然和我所有的博客一样,如果有大佬看到了错误也请指出,我会虚心改正。同时为了大家都能读懂,我不会用专业术语,尽量让所有人都能读懂。

先说明一下经历的大概情况:要求每个组5个人,分工自定,在6天之内做出一个完整的项目。本人在项目之初担任的是程序,当然后来因为需要,介入了策划和关卡设计与搭建等工作。

二、立项—磨合、集思广益

在立项的时候,理想情况下,如果策划已经有了想法,并且如果策划是一个比较认真负责的策划的话,他会直接写一个项目文档,供大家讨论分析可行性以及潜在问题等等(当然可能后续需要一些细化)。

如果策划是一个不懂程序或者说没有经验的人,那么立项这个事情将会非常拖延时间,常见的情况比如,策划天马行空的想法,程序无法实现,美术无法创作。或者,理论上可以实现,但因为团队中程序技术能力的原因导致的无法实现,这无法直接说是谁的问题,策划有考虑不周到,程序有技术不达标,这都有可能,这是一个团队需要磨合的东西。

有些情况,比如在本人的第一次的游戏开发经历中,我们团队倾向于的是头脑风暴式的立项,看上去是一个很民主的选择,实则个人认为是最浪费时间的一个选择。我们团队的所有人都提出了1~2个想法,并把它们按照自己设想的方法细化,贴到公共的白板上,供我们之间互相提出意见,最后经过长时间的讨论,交流,我们投票选出了,相对来说既可实现落地,又有一定创意的方案,之后在此基础上进行工程上细化和潜在问题的解决。

立项之初头脑风暴大家的各自奇思妙想

这个过程我用文字只描述了一点点,但实际上在整个6天的时间里,这个立项花费了我们2天的时间。在此我并不想说这样做不好,因为我觉得大部分人做游戏都是有一定情怀在的,大家想做出自己心目中的那个游戏,而并不想完全追求效率,把它当作一个工业化的产品,当然如果是在公司,那确确实实就是这样,大家都是流水线上的工人,这样可以提高很多效率。所以我在这想说明的就是,立项这个选择因人而异,但无论怎样,策划的脑子里是一定要有东西的,坦白地说作为程序我一开始就已经把自己当成了干活的,而没想到要参与到设计中去,如果大家都是这样,那整个项目就是空谈了,所以无论是策划一人独大也好还是集思广益也罢,策划的脑子里一定要有东西。

三、程序的分工—交叉与并行

我们团队的分工是,2策划+2程序+1美术,也就是负责大部分项目内容工作的只有3个人,美术只有一个人,所以只需要自顾自即可。但程序有2个人,一旦出现1个人以上,就需要进行分工协作了。

在开发之处其实我已经遇见了一些可能会遇到的问题,如果两个程序的开发内容存在交叉,那么一个人写出的BUG另外一个人可能很难调试,就算BUG修好了,又可能会导致修改BUG导致原本程序的其它逻辑出现BUG。而避免这一问题,我们需要把对方的代码再读一遍,理解对方实现某个功能的逻辑,因为一个功能的实现可以有很多种逻辑方法,我们并不能想当然的觉得对方和自己的想法是一样的。因此,读对方的代码,理解对方的逻辑思路,在前期花费了大量的时间。

既然交叉的工作内容会导致问题,难道就没有解决方案了吗?有,当然有,那就是两个人负责不同的大块的整块的内容,比如在我们游戏里有三个角色,它们有各自不同的移动逻辑,和功能逻辑,如果我负责写移动,而他负责写功能,那么这样发生冲突的概率就会减小很多,这就是各自独立并行的工作内容,既可以提升效率又不至于牵一发而动全身。但是问题并没有这样解决,因为整个游戏中各个元素的交互导致了这些逻辑并不是独立的存在,它们仍然有交互,有影响,在这种情况下,我们最终决定我来负责游戏内的角色逻辑,而另一名程序负责UI和关卡的逻辑,其次由于我后续介入了策划和关卡搭建,程序到最后基本都由另一位程序实现了,这样效率有提高,并且减少了BUG的可能性。

在这里我想阐述的观点是,团队协作本身没有错,但是整个项目在分工的时候最好把每个部分分为独立的个体,这样最后把大家的结果合并的时候才会减小发生冲突的概率,当然如果相互沟通能力特别强的话,这应该也算不上什么问题,但大多数情况不是。所以分工的独立性和并行性尤为重要,无论是策划,程序还是美术。

四、项目资产的管理—减少沟通成本

当时的项目整理后的资产

这里用我的经历举例不太具有参考价值,但有一定的参考性,因为作为一个6天的小项目,需要管理的资产并不多,但如果对于一个大项目,所有的脚本,美术资产等等都需要有一定的规范性整理,从命名规则到文件夹包含关系,团队内需要同一的规定,来确保每个人都能轻而易举的调用项目资产,并且每个人自身创建管理资产的时候也需要用同样的标准。这样做可以最大的减少沟通成本,避免混淆冲突。

举例,上图中的Prefabs就是一个例子,预制体作为一个较为大的概况可以包含游戏内各个元素的预制体,角色,地图,UI等等,这样负责搭建场景的人一眼就知道哪些可以用来干什么。

其次Scene场景,是我们存放游戏中关卡的文件夹,这本身到没什么说的,你可能会注意到关卡1-4后面都有一个后缀-new,因为在初期没有美术资产的时候我们需要用简单的几何体来测试BUG,而有了美术资产后将几何体替换掉后,我们同一命名加上后缀-new,以免引起误会,并且很容易区分,一眼就可以看出这是迭代更新后的关卡。

五、美术资源的需求和规范确定—让美术带着镣铐跳舞

1.需求确定

整个项目开发的过程中,这个是最令我头疼的,首先是因为我们团队里只有一个美术,所以产能有限,而另一边的策划经验有限,会时不时的蹦出一些需要新的美术资产的新想法,当然在我的拒绝下,这些想法都被搁置了,原因是项目的核心所需要的美术资产还没生产完成的时候,美术不应该把精力放在其他地方。

在项目立项结束,并且细化确定美术风格以后,我们就应该想到大体需要哪些美术资源,具体到UI的形状颜色等等等等,写成文档,或者列成表格一并交给美术去生产,程序应当也是如此。这样做之后,在此基础上查缺补漏不断迭代,最后再优化细节。一定要避免的情况是,简简单单的想了个大概然后跟美术说了说大概需要哪些东西,然后在项目进行的过程中时不时蹦出新的需求,这回严重影响进度效率。

2.规范确定

美术资产必须要有规范性,而不能让美术闭门造车。

我举一个例子,我们当时是一个2D的解密小游戏,自然涉及到平台跳跃,那么平台这个资产显然是需要大量复用的,并且有着不确定性,因为在关卡设计和搭建的过程中,我们需要各种长度的平台,如果只有一种固定长度的平台,会严重限制关卡的设计种类。你可能会说不是有缩放功能吗?当然,但是缩放后扭曲了原本资产的形状会很丑。而在项目之初,我们的美术确实没考虑过这一点,所以只交给了我们一种平台的美术资产,导致后续的关卡迭代非常繁琐,浪费时间。最后和美术沟通完毕后,我们终于有了分块的可复用的平台美术资产,但是前期浪费的时间确是无法弥补的。

第二个例子,美术资产的尺寸问题,这个问题到最后项目完成时才发现,但是当时已经来不及了。简单的说,就像地图上的比例尺问题一样,由于各个美术资产并不是独立出现的,它们共同放在一个场景里,那么它们就需要有一个相同的比例尺,同时又要考虑角色的尺寸相称性,并且方便角色的交互。

我们出现的问题如下图所示。

障碍物的比例出现问题

上图左边的石头乍一看好像没什么问题,但是仔细看看就会发现有模糊/马赛克的现象,原因是我们把美术给的资源进行了放大,那么可不可以缩小呢?答案是不可以,因为角色的资产的尺寸和我们在脚本中设定的跳跃高度就是当前石头的大小,其次这个石头在设定中属于初级障碍物,也就是一段跳就可以跳过去,而右边的粉色大石头属于次级障碍物,需要垫着小石头跳过,所以左边小石头的放大可以满足这个需求。

所以,综上所述,角色的尺寸导致了我们的脚本的跳跃高度的调整,进而决定了石头的大小,于是它无法调整,只能这样。或者以我们的引擎中的规格来制定美术标准,或者根据美术所生产的资产尺寸我们修改脚本,但实际上这都是不现实的。唯一的解决方法就是在美术生产资产的过程中,自己脑袋里清楚游戏的场景大致长什么样,以及场景中各个元素都是用来干嘛的,并且需要专门的人来制定一套资产规范和尺寸标准。

六、游戏机制与关卡设计—站在玩家的视角

1.关卡的逻辑设计

当时的关卡设计草图

游戏关卡的设计最初原本是交给我们的策划,但是显然我们策划经验并不丰富,所以我介入了一下,当然这不只是我一个人的功劳,大家都参与到了设计中,只不过我提供了一种可行的产出方法。

在每个关卡/场景,都有一些相同的东西,我把它们列了出来如上图所示,由于是解密游戏,我考虑了玩家具有的能力以及玩家需要解决的问题,那么设计关卡本质上就和老师出卷子一样,你需要考虑到学生会些什么,这样就可以把各个知识点杂糅在一起,不断排列组合形成新的问题,如上图所示,玩家的障碍就是几个东西,四个障碍我们如果排列组合可以得到4+4*4+4*4*4+4*4*4*4种不同的结果,对于一个6天的项目,设计5个关卡来说,已经足够的不能再足够了,当然这只是关卡的逻辑设计部分也是较为烧脑的部分,至于场景如何搭建并不需要花很多时间来思考。

2.考虑玩家的感受

在关卡设计过程中,我们还遇到了一些问题,在最初我们并没有设计新手关卡,我们自认为2D跳跃的游戏,大家玩多了,应该上来就知道怎么玩。但显然这种思路是错误的,因为毕竟我们还是有一定的创新机制在里面,并且它本身也并不是那么容易掌握。

于是在大家的一致建议下,我们为玩家添加了3个新手关卡,循序渐进,难度依次递增,来试图让新接触我们游戏的玩家能快速理解我们游戏的机制,游玩并通关。

七、总结与反思—制定自己的工业化流水线

以上就是关于我第一次游戏开发经历的总结与反思。

还有一点,对于我们这种第一次开发游戏的人来说,个人认为这些是很容易遇到的问题,对于成熟的独立游戏开发者,工作室,公司等,它们应该有一套完整的工业流水线和体系,能够完美的避免这些问题,同时由于我们的项目很简单,所以有许多问题可能是没到一定体量是不会遇到的,因此本篇写的也只是冰山一角,想要流畅的做出一款游戏,还是需要很多碰壁和磨练的。

本质上来说这是一个工程性的东西,和单纯的学习是不一样的,本文没有提到的性能优化,适配等等问题是工业中实际经常会遇到的问题,而我们没有考虑并不代表没有这些问题。

本文提到的问题对于刚入门游戏开发,或者想参加一些游戏开发比赛的小白来说应该还是有一些参考价值的,总的来说,提前的风险预测排雷很重要。希望大家都能在经历中总结和思考,不断历练自己成为一个优秀的工程师。

八、结语

脑袋有点难受,不想写了。。。。。。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1089143.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Unity实现简易坦克移动打炮

功能&#xff1a;坦克可以前后移动、左右旋转、打炮 动态演示效果 静态展示图片 核心代码 1、Bullet.cs挂载在Bullet预设体上 using UnityEngine;public class Bullet : MonoBehaviour {// 移动方向private Vector3 moveDir;// 移动速度private float moveSpeed 2;/// <…

RFID防伪防窜货管理系统—保护品牌声誉和市场秩序的利器

在现代市场经济中&#xff0c;知名品牌的产品常常面临着仿冒和假冒的问题&#xff0c;这给企业的利益和品牌声誉带来了严重的损害&#xff0c;跨区域销售和窜货现象也导致市场秩序的紊乱和价格体系的破坏。 一、系统需求分析 防伪需求&#xff1a;企业需要一种可靠的防伪手段&…

软件测试人必须清楚的测试基础知识详解

一、软件测试概述 1、软件缺陷 软件缺陷&#xff1a;又称之为“Bug”。即计算机软件或程序中存在的某种破坏正常运行能力的问题、错误&#xff0c;或者隐藏的功能缺陷。 缺陷的表现形式&#xff1a; 软件没有实现产品规格说明书所要求的功能模块&#xff1b;软件中出现了产…

基于Flume+Kafka+Hbase+Flink+FineBI的实时综合案例(三)离线分析

文章目录 08&#xff1a;离线分析&#xff1a;Hbase表设计及构建09&#xff1a;离线分析&#xff1a;Kafka消费者构建10&#xff1a;离线分析&#xff1a;Hbase连接构建11&#xff1a;离线分析&#xff1a;Rowkey的构建12&#xff1a;离线分析&#xff1a;Put数据列构建13&…

Spring自动装配源码分析

写在前面&#xff1a;阅读spring源码需要读者对Java反射和动态代理有一定了解。关于这部分内容&#xff0c;可以参考这篇博客&#xff1a;Spring源码分析准备工作及java知识补充 一、Spring依赖注入的方式 关于spring的依赖注入&#xff0c;可以参考官方文档&#xff1a;Spring…

注意力屏蔽(Attention Masking)在Transformer中的作用 【gpt学习记录】

填充遮挡&#xff08;Padding Masking&#xff09;&#xff1a; 未来遮挡&#xff08;Future Masking&#xff09;&#xff1a;

近地面无人机植被定量遥感与生理参数反演

目录 专题一 近十年近地面无人机植被遥感文献分析、传感器选择、观测方式及质量控制要点 专题二 辐射度量与地物反射特性 专题三 无人机遥感影像辐射与几何处理 专题四 光在植被叶片与冠层中的辐射传输机理及平面模型应用 专题五 植被覆盖度与叶面积指数遥感估算 更多应用…

sylar高性能服务器-日志(P7-P8)代码解析

文章目录 p71.TabFormatItem2.init函数&#xff0c;对于{}内容的解析3.Util.h4.CmakeLists5.优化日志输出-流式输出 p81.优化日志输出-格式化输出2.日志管理器3.单例模型设计 测试(无调试步骤) P7P8两节视频新增内容不多&#xff0c;主要看下优化日志输出使用的宏函数。本次记录…

python获取网口列表(获取网络接口列表、网口表)socket.if_nameindex()

文章目录 获取网口列表测试 获取网口列表 以下python代码将打印系统中所有存在的网络接口列表&#xff1a; import socketdef print_interfaces_list():# 打印所有的网络接口列表available_interfaces socket.if_nameindex()# 转换成字典形式 {if_index: if_name}available_…

6个视频剪辑必备的素材网站,免费下载。

视频剪辑必备的视频资源、音效素材、BGM&#xff0c;这6个网站全部免费下载&#xff0c;赶紧收藏起来吧&#xff01; 1、菜鸟图库 https://www.sucai999.com/video.html?vNTYxMjky 菜鸟图库网素材非常丰富&#xff0c;网站主要还是以设计类素材为主&#xff0c;高清视频素材…

TSINGSEE青犀智慧广场智能监控解决方案,助力广场监控数字化转型

前期和大家说过世界最大的城市公园——合肥市骆岗公园的监控方案&#xff0c;大家都很感兴趣&#xff0c;后台还有粉丝留言想看看广场类场景的智能方案&#xff0c;今天小编就和大家聊一聊。 广场视频监控方案大体和公园场景类似&#xff0c;但由于广场比公园更加空旷&#xf…

centos 里面的service自启动app.jar,出现两个java进程,app是同一个端口

当使用jps -lv查看java虚拟机进程 app.jar启动后&#xff0c;居然出现两个启动进程&#xff0c;而且他们的端口都一样&#xff0c;同一端口&#xff0c;是不允许启动两个相同app的。 使用进程ps查看进程工具 #ps -aux 参数说明&#xff1a; a: 显示跟当前终端关联的所有进…

到2026年,超过80%企业将使用生成式AI

10月12日&#xff0c;全球著名信息咨询调查机构Gartner在官网&#xff0c;公布了一项调查数据&#xff0c;到2026年&#xff0c;超过80%的企业将使用生成式AI API&#xff0c;或部署生成式AI的应用程序。而2023年这一比例还不到5%。 Gartner副总裁兼高级分析师 Arun Chandrase…

【约束布局】ConstraintLayout配合Guideline解决两个子控件其中一个被挤出屏幕的问题

一、需求 屏幕横向显示文本框A和图标B&#xff0c;A在B的左侧&#xff0c;B紧贴在A的右边显示&#xff0c;文本框A的字数不确定&#xff0c;文本框A的字数足够多时&#xff0c;换行显示&#xff0c;并且保证图标B一直在文本框A的右侧&#xff0c;且不被挤出屏幕。 二、问题 本来…

Java Object转String方式

Map<String,Object> map new HashMap<>(); map.put("a1","a"); map.put("a2",""); map.put("a3",1); map.put("a4",null);一、强制转换 value "a"或""可以进行强制转换String…

众佰诚:新手开抖音小店申请流程是什么

抖音小店为抖音平台上的商家提供了一个全新的销售渠道&#xff0c;让更多创业者能够轻松实现线上销售。如果你是一位希望在抖音上开展电商业务的新手&#xff0c;下面将为你详细介绍如何申请开通抖音小店。 一、准备工作 首先&#xff0c;你需要准备好以下材料&#xff1a; 营业…

数学术语之源——代数——(子空间的)直和(direct sum)

1. 关于(子空间的)直和(direct sum)的较正式定义 令 为向量空间 的子空间,若 且 是独立的&#xff0c;则称 是子空间 的直和(direct sum), 记为 &#xff0c; 这种表示在同一个基的前提下是唯一的。 一个直观几何类比理解(个人愚见)&#xff1a;如果我将向量空间V 看…

计算机基础——内存

文章目录 内存一、内存条、总线、DMA二、内存管理1、为什么要有逻辑地址2、逻辑地址和物理地址如何映射3、分页时间和空间优化4、程序内部的内存管理-分段 三、内存相关的系统调用1、用户态和内核态 四、Java内存 内存 提示&#xff1a;这里可以添加本文要记录的大概内容&…

JS+Jquery用法

1. 当存在多个select时&#xff0c;想要获取每一个select的选中的值(使用变量赋值的方法). var Metric "";$(#Metric).change(function () {Metric $(this).children("option:selected").val();console.log("Metric:" Metric);}); 2. 在页面…

海外代理IP与VPN有何区别?哪个更好?

当谈到网络安全和IP变更时&#xff0c;人们会想到VPN和IP代理服务器。很多人很困惑&#xff0c;它们之间有什么区别&#xff0c;应该选择哪一个呢&#xff1f;这取决于您的需求来决定哪一个更好。 一、什么是VPN与IP代理&#xff1f; VPN 是虚拟专用网络 (Virtual Private Net…