尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

从零构建像素游戏编辑器:像素画、动画与关卡设计的完整实践

从零构建像素游戏编辑器:像素画、动画与关卡设计的完整实践 几年前的一个深夜我坐在电脑前盯着屏幕上那个16×16的像素小人发呆。当时我刚下定决心要做一个像素风格的游戏可真到了动手环节第一个卡住我的不是角色怎么跳、关卡怎么设计而是一个特别朴素却致命的问题——像素素材和关卡到底拿什么来做市面上的绘图工具、动画工具、地图工具我都试了一圈要么是功能割裂导出格式互相不认要么就是操作手感完全不符合像素创作的需求。于是那个晚上我做了一个多少有点冲动的决定一个人从零开始写一套属于自己的像素编辑器。这个编辑器最后陪着我走完了整整18个月整个项目后来叫“像素跳动”。这篇文章不打算做那种罗列功能的说明书我更想把从立项、选型、核心模块设计到踩坑排错这条完整链路摊开来讲。如果你也在做像素游戏、独立游戏或者一直琢磨着给自己写一套开发工具那这篇内容应该能给你省下不少弯路。尤其是“编辑器到底该怎么设计”“像素级坐标如何处理”“碰撞体怎样自动生成”这些具体问题我会把当年落地的思路和实际参数都写出来。1. 先想清楚我要做的是一款游戏还是一款编辑器很多人会把“编辑器”和“编译器”这两个词混在一起其实游戏开发里它们完全是两码事。编译器是把源代码翻译成机器指令编辑器则是把人的创作意图变成结构化数据。游戏里的关卡、精灵、动画、碰撞区域本质上都是一堆数据只是它们太抽象了直接改文件根本没法做所以才需要可视化编辑器。我当时的核心任务其实是做一套能把“脑子里的画面”高效转换成“游戏可读数据”的工具链。1.1 三个核心需求决定了编辑器长什么样像素跳动是一款平台跳跃游戏这类游戏的内容创作需求其实高度集中在三个地方像素画绘制、逐帧动画制作、瓦片关卡编辑。三者不是孤立的比如一个角色你要先画出它的待机帧、跑步帧、跳跃帧然后把这些帧组织成动画再把它放进关卡里验证跳跃手感。任何一个环节缺少工具支撑整个创作流程就会断掉。我一开始天真地以为游戏逻辑代码才是最难写的部分。后来才发现如果素材工具不好用你连一张能看的角色立绘都出不来更别提测试游戏玩法了。所以“编辑器”在我这个项目里的分量从一开始就超过了“游戏本体”。这也是为什么整个项目叫“像素跳动”但大家看到的核心成果却是一套编辑器。1.2 编辑器与游戏运行时必须彻底分离这是我在项目第一天就定下的纪律也是后来被证明最正确的一个决策。编辑器的代码工程和游戏的代码工程完全独立两者通过磁盘上的标准数据文件交互精灵导出为PNG动画和关卡导出为JSON加二进制数据。编辑器只负责“写”游戏运行时只负责“读”。这个决策的意义在于编辑器为了提高操作体验可以堆各种复杂的界面逻辑、撤销栈、实时预览这些代码如果塞进游戏里必然拖累游戏的加载速度和运行时稳定性。反过来游戏里为了性能做的各种优化也不该反过来掣肘编辑器的功能设计。数据格式是两者之间的契约只要契约不变两边随便折腾。1.3 18个月不是规划出来的是“范围蔓延”堆出来的如果按最初的设想我只打算做一个能画像素画的小工具那可能三周就做完了。但实际做过开发工具的人应该都有同感一旦你开始用自己做的工具就会不断发现“这里缺一个功能”“那里交互不舒服”。从像素画板开始我做着做着发现“没有动画预览根本没法看动作是否流畅”于是加了时间轴动画有了之后又发现“关卡没有编辑器就只能手写二维数组”于是又做了瓦片地图地图出来后碰撞体又要自动生成……就这样一环扣一环最后变成了一套完整的“像素游戏工作台”。回头看18个月这个数字就是这么一点一点被撑起来的。2. 技术选型为什么最终选了C# MonoGame而不是Web技术技术栈的选择基本决定了后面一年半的开发体验。当年我认真考虑过三条路线也花时间做了对比实验最后选了C#和MonoGame的组合。这条路线未必适合所有人但如果你要做的是“像素级别的精确控制工具”那这里的选型逻辑应该能给你一些参考。2.1 三条路线的实际对比先说我为什么没有选Web技术。当时市面上很多工具都基于Electron或纯网页实现跨平台是方便但像素画有一个致命需求缩放到200%、400%甚至800%时边缘必须保持硬朗绝不允许出现平滑过渡的模糊感。浏览器在早期普遍会对Canvas做抗锯齿处理虽然现代浏览器可以通过image-rendering: pixelated关掉但在部分移动端浏览器和某些WebGL驱动上表现并不稳定。而像素编辑器恰恰是那种“一像素模糊就废了”的应用我实在不想把命脉交到浏览器厂商手里。然后说Python。Python做原型很快但真要做一个需要频繁全量刷新画布、处理大尺寸图像运算的编辑器性能会非常吃紧。另外Python的打包分发一直是个痛点你不可能让用户去装Python环境再来用你的工具。最终选择的是C# MonoGame。MonoGame是XNA的继任者2D渲染控制力非常强可以精确指定采样状态PointClamp这是像素画不模糊的关键。同时C#写工具类应用效率足够高打包发布也简单一套代码能覆盖Windows、Linux、macOS还能通过WebGL跑在浏览器里。性能说实话很多像素编辑工具对性能的要求并没有想象中那么极端。真正决定成败的反而是“对像素渲染的控制精细度”和“开发效率的平衡”这也是我最终站在C#这边的原因。2.2 为什么把编辑器做成独立程序而不是IDE插件还有一个容易被忽略的决策点工具形态。当时流行把工具做成某款IDE的插件这样能省去很多界面工作。但我刻意避开这条路把编辑器做成了完全独立的窗口程序。原因有两个。第一IDE插件绑定在那款IDE的生态里用户的编辑流程会被IDE自身的行为干扰比如文件管理、快捷键冲突这些都会影响专注度。第二独立的编辑器才能作为“产品”分发出去——别人不需要安装那款IDE就可以直接使用。后续如果想让更多独立游戏开发者使用这套工具独立发行几乎是唯一选择。2.3 用VSCode替代Arduino编辑器的启发开发过程中还有个很有意思的插曲。很多玩嵌入式的人会纠结到底用Arduino自带的编辑器还是换成VSCode我当时也纠结过一阵。后来想明白了替换工具不是因为原工具有多差而是为了统一语言、统一流程、统一体验。同样的逻辑也适用于我自己写的编辑器它的存在不是为了“取代谁”而是为了让“画像素画—做动画—搭关卡—调手感”这条链路足够顺畅不因为工具切换而断掉。这是工具设计里一个非常核心的思维。3. 像素编辑器的核心网格、坐标与“像素级”缩放Pixel Jump Workshop这个名字听起来有点高级但它的核心底层逻辑其实特别朴素一块低分辨率的画布加一套足够精准的坐标转换系统。如果你现在正准备自己写一个类似工具我建议你从这一节开始研究——这是所有像素编辑器的地基。3.1 像素画布的数据结构与渲染编辑器内部每张精灵图本质是一个二维颜色数组比如Color[,]。画布默认分辨率按精灵尺寸来定常见的有16×16、24×24、32×32支持最大到128×128。所有绘制操作都发生在这个数组上而不是直接画在屏幕上。渲染到屏幕时画布会通过矩阵变换放大显示。这里有一个关键参数缩放倍数。我限定缩放倍数必须是2的幂也就是1x、2x、4x、8x。为什么这么限定因为整数倍缩放可以保证“原始画布的一个像素 屏幕上的2×2或4×4像素块”边缘是绝对整齐的不会出现半像素偏移。如果缩放倍数是个奇数或非整数屏幕上就会出现有些像素格比其他像素格宽一像素的情况整个格子视觉上就乱了。配合缩放的是采样状态。MonoGame里渲染纹理时要强制设置SamplerState.PointClamp这一点绝不能妥协。如果用默认的LinearClampGPU会在像素之间做线性插值边缘会发虚像素画看起来就像蒙了一层雾。3.2 坐标转换窗口坐标到像素坐标鼠标操作是编辑器里最高频的动作所以坐标转换的准确性直接决定工具的“手感”。核心公式其实只有一行int GetPixelX(int screenX, int offsetX, int scale) { return (int)MathF.Floor((screenX - offsetX) / (float)scale); }注意这里用的是Floor向下取整而不是Round四舍五入。理由很简单像素格子是有明确边界的鼠标落在格子的左半边和右半边在用户视觉上属于不同的格子。如果用四舍五入在放大倍数高的时候你会觉得光标在“跳格”明明还没移动到下一个格子笔迹却已经画过去了。同样的逻辑也应用到Y轴。编辑器内部统一使用整数像素坐标运算所有涉及浮点数的地方只在“窗口坐标转像素坐标”这一步出现后续操作全部是整数算术。这道“整数化”的约束是整个编辑器字号对齐、格子规整的基础。3.3 DPI缩放引发的光标偏移这个坑我印象太深了。最开始编辑器在高分屏上出现一个诡异现象光标在左上角时点选是准的越往右下移动偏移越严重。排查了很久最后定位到Windows的DPI缩放机制上。为了兼容老程序Windows默认会把不支持高DPI的进程的鼠标坐标“放大”后再交给应用程序。如果你的程序没有声明自己支持高DPI系统就把你当成“老古董”4K屏上鼠标实际移动1像素程序收到的可能是2像素甚至3像素于是光标和画面就错位了。解决方式是在app.manifest里声明PerMonitorV2 DPI Awareness窗口创建后还要手动处理DpiChanged事件动态调整画布缩放比例。这段经验后来被我写成了一段模板因为每次新建项目都得重新配一遍。3.4 二维像素数组转图片的性能细节编辑器里的数据是Color[,]二维数组导出PNG时必须转成Bitmap。最开始我图省事用了Bitmap.SetPixel逐点写入结果导出128×128的预览图时能明显感觉到卡顿。后来换成LockBits配合指针直接写入像素数据速度提升了大概几十倍。这个优化非常简单但带来的体验提升非常明显using (var bitmap new Bitmap(width, height, PixelFormat.Format32bppArgb)) { var data bitmap.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.WriteOnly, PixelFormat.Format32bppArgb); unsafe { var ptr (byte*)data.Scan0; for (int y 0; y height; y) { for (int x 0; x width; x) { int idx y * data.Stride x * 4; ptr[idx 0] color.B; ptr[idx 1] color.G; ptr[idx 2] color.R; ptr[idx 3] color.A; } } } bitmap.UnlockBits(data); }3.5 基础工具的实现顺序编辑器的基础绘画工具我是按照这个顺序实现的铅笔、橡皮、取色器、填充、选区与移动、对称画笔。前四个是必须的第五第六个属于提升效率的利器。填充这里有个容易踩的坑。最朴素的泛洪填充用递归实现在稍大一点的画布上会让栈溢出。比如64×64的画布极端情况下递归深度可能达到上万层。我换成了队列加逐行扫描的方式速度和栈占用都稳定很多。核心思想是从左到右扫描某一行遇到可填充的连续区间就填掉然后检查上一行和下一行的相邻区间继续入队处理直到所有连通区域都被填完。对称画笔这个功能虽小但像素角色很多时候是左右对称的画左半边自动镜像到右半边能省很多重复劳动。实现上就是在绘制回调里同时写两个坐标点。4. 帧动画与图集打包像素美术工序的数字化像素画和普通插画最大的区别在于它的“动画”通常不是骨骼驱动而是逐帧替换的精灵图。精灵图的美术质量很大程度取决于动画预览和帧管理的流畅程度。这一章我聊聊帧动画时间轴和图集打包这两个核心模块。4.1 时间轴设计30FPS基准加帧延迟我把动画时间轴设计成了类似音频编辑器的多轨形式每个精灵的每一帧是一张独立画布帧按顺序排列在时间轴上上方直接提供播放/暂停按钮方便随时预览。帧率以30FPS为基准。这里有一个像素游戏特有的设计决策为什么要预设30FPS而不是60FPS因为逐帧动画在30FPS下每帧持续3~4个屏幕刷新周期人眼已经能感知到流畅的动作而60FPS意味着每秒要画60张不同的帧工作量翻倍对像素这种“手工逐帧”的美术风格来说性价比极低。不过我也提供了一个“帧延迟”参数允许每帧重复1到5个时间单位。这个参数用来做复古的“2帧走路循环”——左右脚各一帧但在落地的瞬间故意多停一拍就能营造出一种二次元老游戏的顿挫感。这个看似不起眼的功能实际上对游戏风格影响很大。4.2 图集打包Skyline天际线算法实战当游戏里精灵多起来之后如果每个精灵帧都是一张独立纹理GPU的绘制调用Draw Call数量会爆炸直接拖垮游戏帧率。解决方案是把所有精灵帧合并到一张大纹理上这张纹理叫图集Sprite Atlas。图集打包算法我选的是实现简单但效果不错的Skyline算法。核心思路是维护一个一维高度数组表示大图每一列当前已经被占用的高度。放置一个矩形时从左到右扫描找到一组连续的、宽度足够且“最高点最低”的区域把矩形放进去然后更新高度数组。文字描述有点抽象伪代码会更直观function placeRect(width, height): bestX -1 bestY MAX for x from 0 to skyline.Length - width: y max(skyline[x..xwidth]) if y bestY: bestY y bestX x if bestX -1: return 需要新建图集 update skyline[bestX..bestXwidth] bestY height return (bestX, bestY)打包完成后每张小图在大图上的矩形区域会被记录到JSON文件里。运行时加载大图纹理再根据矩形数据裁剪出需要的精灵帧。这套方案对几百张小图的场景完全够用。4.3 调色板管理像素画风格的“守门员”像素画辨识度高的原因之一是它通常使用有限颜色。我见过很多新手在画像素画的时候什么颜色都往上堆结果画面花成一片。像素跳动的编辑器内置了16色、32色、256色三档调色板所有绘制工具都受当前调色板约束不允许画出调色板之外的颜色。调色板还支持从外部图片自动提取主色以及导入ASE格式的色板文件。这个功能对美术风格统一非常有用。想象一下你在一张宣传图里看到一套漂亮的配色直接导入到编辑器的调色板里后续所有精灵都用这套颜色来画整个游戏的美术风格立刻会有一种凝聚力。4.4 导出与扩展从PNG到LED点阵屏编辑器的动画可以导出为PNG序列帧也可以直接导出为GIF。还有一个很偏门但好玩的玩法我把动画帧导出为RGB数组后接了一个树莓派驱动的LED点阵屏当播放器在物理世界里播放游戏里的精灵动画。第一次看到像素小人从屏幕里“跳”到那块发光的LED板子上时说实话挺震撼的。那一刻我觉得“像素跳动”这个名字算是起对了。这种硬件扩展其实并不复杂LED点阵屏通常只需要往驱动板按协议刷像素数据就行编辑器负责把动画帧转换成对应分辨率的RGB数组。如果你手头有类似的像素屏完全可以把它当成编辑器的“实体预览窗”。5. 关卡编辑与碰撞体把“跳动”手感调出来对一个平台跳跃游戏来说关卡编辑器的好用程度直接决定你能做多少关、关卡质量高不高。而碰撞体的生成方式又直接决定玩家操控时的手感。这一章是整个项目里最有“游戏开发味”的部分。5.1 瓦片地图的多层设计像素跳动的关卡地图最多支持8层分为背景层、碰撞层、机关层、前景层。每一层都是一个二维字节数组。为什么是字节因为瓦片ID范围通常是0到255一个瓦片正好一个字节300×200大小的地图层只有60KB非常轻量。导出时直接用二进制格式保存加载快体积小。图层还有一个关键的视觉属性“视差滚动比例”。背景层的移动速度是主层的0.5倍就能营造出简单的纵深感。这个参数不用写死在游戏里而是作为图层属性存档游戏运行时读取后自动应用。编辑器里可以一键切换显示哪些层也可以把某一层调成半透明方便对齐。5.2 碰撞体的自动合并算法如果朴素地给每个实心瓦片都生成一个碰撞体一个大关卡可能产生几百上千个矩形物理引擎每帧检测一次全量碰撞性能会急剧下降而且相邻瓦片之间会产生肉眼不易察觉、但手感上能感受到的“微小的卡顿感”。解决方式是逐行扫描合并。算法思路很简单遍历每一行把连续排列的实心瓦片合并成一个矩形。对于某一行上的瓦片如果x1到x8都是实心的就合并为Rectangle(1, y, 8, 1)。做完行合并后再对纵向相邻且宽度完全相同的矩形尝试二次合并。这样300个瓦片的关卡最终碰撞体数量通常在30到60个左右。这个算法不到100行代码但效果是立竿见影的。物理引擎的负担瞬间下降了一个数量级。5.3 手动微调自动算法永远不够自动合并有一个典型问题如果“玩家头顶的平台”旁边连接着一堵更高的墙算法可能会把它们合并成一个L形的大矩形。这个合并本身没错但会在转角处产生一个“隐藏的凹槽”玩家跳跃时可能会被这个凹槽卡住手感变得非常诡异。所以编辑器里必须有碰撞体的可视化编辑模式。在这个模式下每个碰撞矩形会以半透明色块显示在地图上可以直接拖拽边缘来修改尺寸或者手动拆分、合并矩形。我强烈建议所有类似的编辑器都保留这个功能因为自动生成的碰撞体永远是“合理”的但“玩家手感需要”的形状只有人能判断。5.4 手感调试面板跳跃参数的可视化“跳跃手感”听上去很玄其实就是一堆参数调出来的结果。核心参数我整理成了这几项重力加速度gravity决定下落速度曲线的陡峭程度。跳跃初速度jumpVel决定起跳的爆发力。跳跃取消倍率jumpCutMultiplier松开跳跃键时上升速度立即乘以这个系数。这个参数是让“短按轻跳、长按高跳”手感成立的关键。土狼时间coyoteTime角色离开平台后的一小段时间内仍然允许跳跃。这个参数让玩家在边缘起跳时不会觉得“明明按了跳跃键却没反应”。跳跃缓冲jumpBuffer按下跳跃键后的若干帧内即使落地稍晚落地后仍会立刻起跳。这个参数可以减少操作延迟感。这些参数在编辑器的“手感调试面板”里可以实时修改并立刻在预览角色身上生效。边栏会同时显示当前参数下的起跳高度和滞空时间。这个功能让我调跳跃手感时完全不需要重新编译游戏效率翻了好几倍。5.5 从草稿到可玩关卡的完整工作流整个流程我最终标准化成了这样先在网格纸上画草图规划大致的平台位置和敌人分布。然后打开编辑器在“结构层”快速铺瓦片把主要地形搭出来。接着自动生成碰撞体进入调试面板跑一遍找出那些“跳不过去”或“卡脚”的地方。微调瓦片或手动调整碰撞矩形后再跑一遍。循环稳定后添加装饰层和机关层最后导出二进制关卡文件。这个工作流最核心的指标是“从开始铺瓦片到能跑起来”的时间。整个循环如果能控制在10分钟以内你就会有源源不断的动力去尝试新关卡设计如果这个循环动不动就要半小时那你大概率会半途而废。6. 那些差点让我放弃的坑性能、序列化与跨平台做工具最折磨人的不是写功能而是遇到那种“看起来没问题但就是不对”的隐蔽坑。这一章我不打算美化什么直接把你最可能遇到的四个问题摊开讲每一个都标清楚了当时的排查过程。6.1 撤销/重做内存爆炸现象连续绘制几百笔之后编辑器内存飙到几百MB64×64画布操作起来卡成PPT。排查过程一开始我怀疑是不是有什么资源没有释放但反复检查逻辑都没有问题。后来排查到撤销功能时才恍然大悟我每次绘制操作都把整张画布的像素数组完整复制一份塞进历史栈。对32×32的小画布来说一次操作也就几KB但历史栈累积起来几百次操作就是几十MB甚至更多。64×64画布更是直接失控。解决思路改成命令模式加差异记录。每次操作只记录“影响范围”和这个范围内的旧像素、新像素。撤销时只恢复旧像素重做时应用新像素。历史栈深度限制为100步差异数据用简单的行游程编码压缩。优化后连续操作几百次内存峰值不到20MB。6.2 JSON序列化导致大关卡加载缓慢现象一个300×200的三层瓦片地图导出成JSON后文件有700多KB加载需要一两秒。排查过程JSON这种文本格式有天然冗余逗号、大括号、字段名、转义符都是额外的字节。调试期用着方便但游戏发布的时候这个加载时间完全不可接受。解决思路换成MessagePack二进制序列化。同样是那组数据体积缩到原来的约四分之一加载时间从一秒多降到几十毫秒。核心改动就是给数据类加特性标记然后调两个序列化函数[MessagePackObject] public class TileLayerData { [Key(0)] public int Width { get; set; } [Key(1)] public int Height { get; set; } [Key(2)] public byte[] Cells { get; set; } } byte[] bytes MessagePackSerializer.Serialize(layerData); TileLayerData loaded MessagePackSerializer.DeserializeTileLayerData(bytes);6.3 DPI缩放导致的光标偏移这个坑在上面坐标系统那节提到过一次这里再说一下完整的排查链路。现象是光标在窗口左上角点击比较准越往右下偏移越厉害而且偏移量随着窗口位置不同而变化。最开始我以为是我自己坐标换算代码写错了反复检查了好几遍都没有问题。后来在窗口拖动到另一块显示器时偏移量发生了变化才想到可能是系统DPI缩放造成的。Windows对没有声明DPI感知的进程会默认做位图缩放和鼠标坐标映射。在高分屏上这个映射是非线性的所以左上角准、右下角偏。解决方式就是在manifest里声明PerMonitorV2 DPI Awareness再处理一下字体和控件的缩放。这个问题耗费了我整整一天但解决方案本身非常简单。6.4 跨平台纹理采样状态丢失MonoGame支持多平台但在WebGL后端上我发现某些平台默认的纹理采样会忽略代码里设置的PointClamp导致像素画边缘发虚。排查后定位到原因MonoGame在切换RenderTarget时采样状态有时会重置为默认值。如果只在初始化时设置一次切到渲染目标再切回来状态就丢失了。解决办法是每次在设置RenderTarget之后都显式重新绑定SamplerState.PointClamp。这个教训告诉我对渲染状态的管理必须“每次渲染前显式设置”不能依赖“初始化时设置一次生效”。6.5 坑位复盘表格坑根源解决方式解决耗时Undo内存爆炸全量快照命令模式差异记录2天JSON体积大文本格式冗余换成MessagePack1天光标偏移Windows DPI缩放声明PerMonitorV21天纹理发虚采样状态丢失每次渲染前显式绑定半天7. 18个月复盘哪些决定是弯路哪些值得坚持18个月不算短回头看有差不多三分之一的时间在走弯路。但弯路走多了反而让一些“对的决定”变得格外清晰。7.1 砍掉脚本系统是我做过最果断的减法项目进行到大概第七八个月的时候我觉得如果编辑器能有一个脚本系统让玩家自定义关卡逻辑那就无敌了。于是我花了一两个月设计脚本语言、调试器、与关卡数据的绑定层。越写越觉得不对劲——这个系统的复杂度几乎相当于再造一个小型游戏引擎了。作为一个单人项目这个摊子铺得实在太大了。最终我狠下心把整个脚本模块连根删掉改成“事件数据”方案编辑器内置跳板、移动平台、传送门、按钮机关这些有限的事件类型所有逻辑都由数据驱动不需要写代码。砍掉之后项目稳定性立马上了一个台阶我也把精力重新收回到游戏内容本身。7.2 追求“通用工具”是个陷阱早期我在设计编辑器功能时总想着“万一别人要做其他类型的像素游戏怎么办”于是一股脑加入了很多跟平台跳跃无关的通用功能。结果是工具越来越臃肿每一项功能都要维护但真正常用的只有那么几个。后来我把定位收窄成“像素平台跳跃游戏专用编辑器”所有工具围绕这个玩法设计把那些无关功能全部藏起来或删掉。效率立刻就不一样了。做工具克制比能力更重要这个道理我是真金白银买来的。7.3 值得坚持的三件事第一编辑器与游戏运行时分离。这个决策从第一天起就是对的没有它后面所有模块的迭代速度都会慢一半。第二先定数据格式再写编辑器界面。数据格式是契约编辑器只是契约的可视化编辑工具。只要数据是干净的哪怕界面做得再丑游戏本身也不会受牵连。反过来如果数据一团糟界面再华丽也是空中楼阁。第三把性能问题当成功能来做。撤销重做、序列化、碰撞体合并这一系列工作虽然不像新功能那么有存在感但它们才是用户体验的分水岭。一个卡顿的工具再有创意也留不住人。这个项目做下来给我最大的改变是对“工具”这件事有了敬畏心。一个编辑器不只是一个画板它决定了你每天要在工具上消耗多少耐心、能产出多少内容。像素跳动现在还在持续迭代我下一步打算加联机协作和素材市场。如果你也在酝酿一款独立游戏真的建议先花两周把“素材管线”想清楚而不是急着写游戏逻辑。工具定生死数据定未来这句话在独立游戏开发这条路上含金量比想象中高得多。
返回列表