通过Unity2D独立开发一款瓷砖式RPG游戏需要学习哪些知识

通过Unity2D独立开发一款瓷砖式RPG游戏需要学习哪些知识? - 知乎810被浏览43075分享邀请回答32336 条评论分享收藏感谢收起&img src=&/50/v2-f08fe4f2a70d4fa744e16ffe_b.jpg& data-rawwidth=&655& data-rawheight=&654& class=&origin_image zh-lightbox-thumb& width=&655& data-original=&/50/v2-f08fe4f2a70d4fa744e16ffe_r.jpg&&&h2&&b&概述&/b&&/h2&&p&文章基于一种基础的地图,来讨论三套不同的地图生成方案。&/p&&p&文章不会出现跟代码相关的内容,会以较为通俗的语句和不少简单的示意图来表示迷宫的生成方案。其中不少方法来自于游戏界前辈,我根据自己的基础地图做了不少修正(毕竟迷宫和地图的形式多种多样,适合自己游戏的才是最好的)。&/p&&p&根据方案生成地图之后,还可以加上一些静态分布来丰富地图表现,大家就自行发挥啦!&/p&&br&&h2&&b&地图基础&/b&&/h2&&p&地图的形式很多,这里我使用的地图是以tile块为单位分割的地图,地图上的tile块形式很多,但主要分成三种:&/p&&blockquote&&p&A:陆地,可以在上面分布一些角色啦物件啦&/p&&p&B:过渡,根据物理框可以在上面移动,不过一般不会分布物件&/p&&p&C:水域,不可移动的区域,可以理解成为迷宫的“墙”&/p&&/blockquote&&img src=&/v2-2ea7cf148b6f4f347cbde4edc6744d9c_b.png& data-rawwidth=&869& data-rawheight=&758& class=&origin_image zh-lightbox-thumb& width=&869& data-original=&/v2-2ea7cf148b6f4f347cbde4edc6744d9c_r.png&&&p&在后文的迷宫生成方案里,会以水域作为分割,主要围绕陆地的分布来设计迷宫,过渡的地块根据游戏实际需要再去生成。如果你不希望地图用水域来分割,那只需要把水域改成传统的墙壁即可。&/p&&p&本文用来展示的地图,面积都比较小,方便表达迷宫的生成规则。在实际游戏制作时,按需求去铺量就行。&/p&&br&&h2&&b&方案一:主路扭曲型&/b&&/h2&&p&1、首先,按照下图的间隔规则来生成基础的大地图,1为陆地,0为水域。&/p&&img src=&/v2-c0a3da450cf28acca3ce1f3dfad2d0fe_b.png& data-rawwidth=&888& data-rawheight=&649& class=&origin_image zh-lightbox-thumb& width=&888& data-original=&/v2-c0a3da450cf28acca3ce1f3dfad2d0fe_r.png&&&p&2、然后,选择一个靠近边缘的1作为起点,在它的周围随机找另一个黄色的1(这里的“周围”指的是上下左右4个方向,斜边不算)。找到就把他们联通,即把两个1之间的0变成陆地,这里用红色来表示。&/p&&img src=&/v2-b430e78feae6b5d9f5c64_b.png& data-rawwidth=&888& data-rawheight=&648& class=&origin_image zh-lightbox-thumb& width=&888& data-original=&/v2-b430e78feae6b5d9f5c64_r.png&&&p&3、把上一步“终”的格子作为新的一个“起”格子,不停循环第二步的过程,直到找不到周围有黄色的1。&/p&&img src=&/v2-ed8b_b.png& data-rawwidth=&888& data-rawheight=&648& class=&origin_image zh-lightbox-thumb& width=&888& data-original=&/v2-ed8b_r.png&&&p&4、这时候,原路往回走(即不停去找前一个格子),直到找到一个格子,这个格子周围有黄色的1,那么从这个格子开始重复前两个步骤。&/p&&img src=&/v2-0f9f2dbaeffff52f07562_b.png& data-rawwidth=&887& data-rawheight=&648& class=&origin_image zh-lightbox-thumb& width=&887& data-original=&/v2-0f9f2dbaeffff52f07562_r.png&&&p&5、接下来就是不停重复上面的步骤,找到就联通,找不到就往回走~&/p&&img src=&/v2-c49a26ef8a7f5e5609e14_b.png& data-rawwidth=&888& data-rawheight=&649& class=&origin_image zh-lightbox-thumb& width=&888& data-original=&/v2-c49a26ef8a7f5e5609e14_r.png&&&img src=&/v2-22c15efb0bdc0e7c7f76b8abe00a7f7f_b.png& data-rawwidth=&887& data-rawheight=&646& class=&origin_image zh-lightbox-thumb& width=&887& data-original=&/v2-22c15efb0bdc0e7c7f76b8abe00a7f7f_r.png&&&p&6、填充完整个地图之后,迷宫就算是制作完成了,根据需求加上终点即可。&/p&&img src=&/v2-89cce673f0c2b4d8943d72_b.png& data-rawwidth=&888& data-rawheight=&649& class=&origin_image zh-lightbox-thumb& width=&888& data-original=&/v2-89cce673f0c2b4d8943d72_r.png&&&p&总结一下,&b&这种方案生成的迷宫会有一条明显的主路,&/b&即一条特别长、贯穿大部分区域的路线,同时,&b&迷宫的路线一般比较扭曲。&/b&&/p&&br&&h2&&b&方案二:自然分岔型&/b&&/h2&&p&这个方案的雏形来自于随机prim算法,具体步骤如下:&/p&&p&1、跟方案一一样,生成一个基础地图。格子先用黄色1和灰色0来表示,暂时不区分水陆。&/p&&p&2、随机取一个地图边缘的黄色1,把它标记为红色1,即变成陆地。然后把它旁边的灰色0标记成蓝色0,表示“待定”。(注意的是,大地图四周的灰色0固定不变,作为地图边缘而存在)&/p&&img src=&/v2-d06dc1f95cdca1a327a09c46_b.png& data-rawwidth=&889& data-rawheight=&648& class=&origin_image zh-lightbox-thumb& width=&889& data-original=&/v2-d06dc1f95cdca1a327a09c46_r.png&&&p&3、敲黑板了!!这里是重点!!!&/p&&p&&b&随机选一个蓝色的0&/b&(这一步很重要,会使这个方案明显区别于上一个方案),然后看红色1隔着这个蓝色0对面的格子,是否是黄色的1:&/p&&blockquote&&p&如果是,则把对面的黄色1标记成红色1,即变成陆地,然后把蓝色0变成红色的0,即也变成陆地;&/p&&p&如果不是,就把这个蓝色的0变成灰色的0。&/p&&/blockquote&&p&最后,把新创建的红色1周围的灰色0,标记成蓝色0。&/p&&img src=&/v2-afea54879bcd67bca199f03_b.png& data-rawwidth=&889& data-rawheight=&648& class=&origin_image zh-lightbox-thumb& width=&889& data-original=&/v2-afea54879bcd67bca199f03_r.png&&&p&4、继续重复上面的步骤&/p&&img src=&/v2-b9a66bd6204d_b.png& data-rawwidth=&889& data-rawheight=&650& class=&origin_image zh-lightbox-thumb& width=&889& data-original=&/v2-b9a66bd6204d_r.png&&&img src=&/v2-e27fcb8b777d8cd775b2a_b.png& data-rawwidth=&889& data-rawheight=&649& class=&origin_image zh-lightbox-thumb& width=&889& data-original=&/v2-e27fcb8b777d8cd775b2a_r.png&&&p&5、对比上图和下图,这里取一个蓝色0生成一个红色1之后,新生成的红色1旁边,有两个蓝色0的两边都是红色1了,那么就根据第三步的规则,在稍后取到这些蓝色0时,就会把他们变成灰色0&/p&&img src=&/v2-049efef9bf0686ffe757_b.png& data-rawwidth=&889& data-rawheight=&649& class=&origin_image zh-lightbox-thumb& width=&889& data-original=&/v2-049efef9bf0686ffe757_r.png&&&p&6、继续重复上述步骤,直到整个地图没有蓝色0了,地图就生成完毕&/p&&img src=&/v2-d11e48a61bb1f8e8a779f6c149b857d2_b.png& data-rawwidth=&888& data-rawheight=&649& class=&origin_image zh-lightbox-thumb& width=&888& data-original=&/v2-d11e48a61bb1f8e8a779f6c149b857d2_r.png&&&img src=&/v2-5a5caf858fb_b.png& data-rawwidth=&889& data-rawheight=&649& class=&origin_image zh-lightbox-thumb& width=&889& data-original=&/v2-5a5caf858fb_r.png&&&p&总结一下,对比方案一,&b&这套方案不会出现明显的主路,迷宫相对比较自然,但迷宫的分岔路会比较多,所以迷宫可能会更复杂,即玩家需要做选择的次数可能比较多&/b&。&/p&&br&&h2&&b&方案三:块状分割型&/b&&/h2&&p&上述两个方案有个共同的特点,就是道路永远都是1个格子宽,如果游戏需要给地图创造一些小型地块或者更宽的道路,需要在迷宫生成之后再用各种分布的规则来丰富迷宫。&/p&&p&而第三个方案则&b&以小型地块作为出发点&/b&来设计迷宫,这套方案的雏形来自于国外大神Bob Nystrom,文章后面附上了他的个人主页。&/p&&p&1、首先,在大地图(还是之前那个大地图)上生成若干小型地形,保证边长是奇数且不重合就好(示意图全部使用了正方形,实际上可以做成长方形让地图更加自然)。注意顶点要在黄色1格子上即可,这里我用橙色1来表示这些小型地块。&/p&&img src=&/v2-a2c7fdb712a571c65ea6a_b.png& data-rawwidth=&890& data-rawheight=&649& class=&origin_image zh-lightbox-thumb& width=&890& data-original=&/v2-a2c7fdb712a571c65ea6a_r.png&&&p&2、然后,根据之前方案一的迷宫生成方案,在非小型地块的区域里,用迷宫来填充。这一步完成之后,迷宫和小型地形是分隔开来的。&/p&&img src=&/v2-358e085ef623a5a50d2d_b.png& data-rawwidth=&890& data-rawheight=&649& class=&origin_image zh-lightbox-thumb& width=&890& data-original=&/v2-358e085ef623a5a50d2d_r.png&&&p&3、在橙色1的小型地形周围,随机取点以连接黄色1,连接点的数量可以根据需要来确定,建议是不要吝啬连接点的个数,因为这种地图之下,分岔路远比前两种方案要少。&/p&&img src=&/v2-7f404f08c90c_b.png& data-rawwidth=&889& data-rawheight=&647& class=&origin_image zh-lightbox-thumb& width=&889& data-original=&/v2-7f404f08c90c_r.png&&&p&4、接下来是简化地图,目的是去掉一些死胡同,因为这种方案的核心在于小型地块,没有必要让玩家在迷宫的路上绕。方法是把一些3边都是灰色0的黄色1去掉即可,具体数量也根据游戏需求来制定,我这里只去掉了一部分。&/p&&img src=&/v2-970ce92a76a1ebb167029b_b.png& data-rawwidth=&888& data-rawheight=&650& class=&origin_image zh-lightbox-thumb& width=&888& data-original=&/v2-970ce92a76a1ebb167029b_r.png&&&p&5、最后,给地图加上出口和入口,地图就做完啦!&/p&&img src=&/v2-b3a74f262fef5c69f98e_b.png& data-rawwidth=&888& data-rawheight=&648& class=&origin_image zh-lightbox-thumb& width=&888& data-original=&/v2-b3a74f262fef5c69f98e_r.png&&&p&总结一下,这种方案比前两种多了小型地块,这一点比较适合设计玩家的&b&阶段性反馈&/b&。同时地图的分岔路明显减少,&b&玩家在这种方案下的选择次数会明显降低&/b&。另外,由于这个方案的步骤相对多且独立,所以对于设计者来讲会&b&比较容易控制地图的结构&/b&。&/p&&br&&h2&&b&参考&/b&&/h2&&p&随机prim算法参考了很多网上的资源和代码,也有很多变种,网上都可以搜得到,比如:&/p&&a href=&/?target=https%3A///u/cocolate/blogread/1493& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&随机迷宫生成算法整理分析 | indienova 独立游戏&i class=&icon-external&&&/i&&/a&&br&&a href=&/?target=http%3A///infodetail-1765727.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&[迷宫中的算法实践]迷宫生成算法--Prim算法-布布扣-&i class=&icon-external&&&/i&&/a&&br&&a href=&/?target=http%3A///visayafan/archive//2443173.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&【Tree】迷宫生成算法 - visayafan - 博客园&i class=&icon-external&&&/i&&/a&&br&&p&而块状分割型地图的思路就来源于Bob Nystrom,这是他的个人主页和文章:&/p&&a href=&/?target=http%3A///& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&&i class=&icon-external&&&/i&&/a&&a href=&/?target=http%3A////rooms-and-mazes/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Rooms and Mazes: A Procedural Dungeon Generator&i class=&icon-external&&&/i&&/a&&p&------6.15---------------------------------------------------------------&/p&&p&还有一个很有趣的迷宫生成网页:&/p&&a href=&/?target=http%3A//www.mazegenerator.net/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Maze Generator&i class=&icon-external&&&/i&&/a&&br&&p&可以直接规定迷宫的大小,甚至是迷宫的形状规则&/p&
概述文章基于一种基础的地图,来讨论三套不同的地图生成方案。文章不会出现跟代码相关的内容,会以较为通俗的语句和不少简单的示意图来表示迷宫的生成方案。其中不少方法来自于游戏界前辈,我根据自己的基础地图做了不少修正(毕竟迷宫和地图的形式多种多样…
2d的话直接画三角扇就可以,边缘alpha衰减,再加个噪声图模拟浮沉感觉。&br&3d的话我这倒是有个函数,模拟聚光灯的。&br&&img data-rawwidth=&1187& data-rawheight=&1081& src=&/v2-9bc0cb71f6ee816abadfe889_b.jpg& class=&origin_image zh-lightbox-thumb& width=&1187& data-original=&/v2-9bc0cb71f6ee816abadfe889_r.jpg&&&br&
private Mesh CreateSpotLightMesh()&br&
// copy & pasted from other project, the geometry is too complex, should be simplified&br&
Mesh mesh = new Mesh();&br&&br&
const int segmentCount = 16;&br&
Vector3[] vertices = new Vector3[2 + segmentCount * 3];&br&
Color32[] colors = new Color32[2 + segmentCount * 3];&br&&br&
vertices[0] = new Vector3(0, 0, 0);&br&
vertices[1] = new Vector3(0, 0, 1);&br&&br&
float angle = 0;&br&
float step = Mathf.PI * 2.0f / segmentC&br&
float ratio = 0.9f;&br&&br&
for (int i = 0; i & segmentC ++i)&br&
vertices[i + 2] = new Vector3(-Mathf.Cos(angle) * ratio, Mathf.Sin(angle) * ratio, ratio);&br&
colors[i + 2] = new Color32(255, 255, 255, 255);&br&
vertices[i + 2 + segmentCount] = new Vector3(-Mathf.Cos(angle), Mathf.Sin(angle), 1);&br&
colors[i + 2 + segmentCount] = new Color32(255, 255, 255, 0);&br&
vertices[i + 2 + segmentCount * 2] = new Vector3(-Mathf.Cos(angle) * ratio, Mathf.Sin(angle) * ratio, 1);&br&
colors[i + 2 + segmentCount * 2] = new Color32(255, 255, 255, 255);&br&
angle +=&br&
mesh.vertices =&br&
mesh.colors32 =&br&&br&
int[] indices = new int[segmentCount * 3 * 2 + segmentCount * 6 * 2];&br&
int index = 0;&br&&br&
for (int i = 2; i & segmentCount + 1; ++i)&br&
indices[index++] = 0;&br&
indices[index++] =&br&
indices[index++] = i + 1;&br&
indices[index++] = 0;&br&
indices[index++] = segmentCount + 1;&br&
indices[index++] = 2;&br&&br&
for (int i = 2; i & segmentCount + 1; ++i)&br&
indices[index++] =&br&
indices[index++] = i + segmentC&br&
indices[index++] = i + 1;&br&&br&
indices[index++] = i + 1;&br&
indices[index++] = i + segmentC&br&
indices[index++] = i + segmentCount + 1;&br&
indices[index++] = 2;&br&
indices[index++] = 1 + segmentC&br&
indices[index++] = 2 + segmentC&br&&br&
indices[index++] = 2 + segmentC&br&
indices[index++] = 1 + segmentC&br&
indices[index++] = 1 + segmentCount + segmentC&br&&br&
//------------&br&
for (int i = 2 + segmentC i & segmentCount + 1 + segmentC ++i)&br&
indices[index++] =&br&
indices[index++] = i + segmentC&br&
indices[index++] = i + 1;&br&&br&
indices[index++] = i + 1;&br&
indices[index++] = i + segmentC&br&
indices[index++] = i + segmentCount + 1;&br&
indices[index++] = 2 + segmentC&br&
indices[index++] = 1 + segmentCount * 2;&br&
indices[index++] = 2 + segmentCount * 2;&br&&br&
indices[index++] = 2 + segmentCount * 2;&br&
indices[index++] = 1 + segmentCount * 2;&br&
indices[index++] = 1 + segmentCount * 3;&br&&br&
////-------------------------------------&br&
for (int i = 2 + segmentCount * 2; i & segmentCount * 3 + 1; ++i)&br&
indices[index++] = 1;&br&
indices[index++] = i + 1;&br&
indices[index++] =&br&
indices[index++] = 1;&br&
indices[index++] = 2 + segmentCount * 2;&br&
indices[index++] = segmentCount * 3 + 1;&br&&br&
mesh.triangles =&br&
mesh.RecalculateBounds();&br&&br&&br&
2d的话直接画三角扇就可以,边缘alpha衰减,再加个噪声图模拟浮沉感觉。 3d的话我这倒是有个函数,模拟聚光灯的。 private Mesh CreateSpotLightMesh() { // copy & pasted from other project, the geometry is too complex, should be simplified Mesh me…
&p&&a href=&///?target=https%3A//www./en/%23%21home& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Asset Store&i class=&icon-external&&&/i&&/a&
unity asset store正在进行史上最强大促&/p&&p&占坑 给大家推荐一些值得买的&/p&&p&&b&红色&/b&---康托推荐&/p&&p&&b&绿色&/b&---高风评&/p&&br&&p&&b&Scripts部分&/b&&/p&&img src=&/v2-86ddd42fed88bb0ffca6_b.jpg& data-rawwidth=&714& data-rawheight=&2979& class=&origin_image zh-lightbox-thumb& width=&714& data-original=&/v2-86ddd42fed88bb0ffca6_r.jpg&&&br&&br&&p&&b&Textures 部分。。。&/b&&/p&&p&有substance了 要texture作甚,,看你项目需求吧。唯一觉得可以推荐的&/p&&p&SUIMONO Water System明明应该是shader类啊! 摔&/p&&br&&img src=&/v2-4ef87dcad3a_b.png& data-rawwidth=&231& data-rawheight=&87& class=&content_image& width=&231&&&br&&p&&b&Audio 部分
&/b&&/p&&p&个人没什么要推荐的,因为unity分工流程里面 音效或者直接外部导入wav,或者fmod扔给音效,不是特别有必要买无功能性的音效包。&/p&&p&&b&Animations 部分&/b&&/p&&p&看项目需求,可以买点剑斗枪械什么的,我个人建议是买个mixamo animation的年包,然后把所有动画都拽下来,就都解决了 。
或者买套诺依藤呗,现在搞这类还是挺方便的(我自己用xsens 啦啦)&/p&&p&&b&Editor 部分&/b&&/p&&br&&img src=&/v2-fed8046eafd6efb2e3e2b51b_b.jpg& data-rawwidth=&714& data-rawheight=&2979& class=&origin_image zh-lightbox-thumb& width=&714& data-original=&/v2-fed8046eafd6efb2e3e2b51b_r.jpg&&&p&&b&Particles 部分&/b&&/p&&p&讲真 ,unity现在自带粒子已经很好用了,基本不需要购买粒子插件,而且康某是特效出身,干嘛要买别人的粒子。。 过&/p&&p&&b&Shader 部分&/b&&/p&&img src=&/v2-4b1edcb7aeaab9_b.png& data-rawwidth=&714& data-rawheight=&2631& class=&origin_image zh-lightbox-thumb& width=&714& data-original=&/v2-4b1edcb7aeaab9_r.png&&&br&&p&标注的我肯定都用过,所以,大家剁手愉快&/p&&br&&p&补充几句有些插件很好,不过不具备通用性,那如不是立马要用不必现在就买,打开购买清单几百个也是很累的, 有些东西很好,不过将来技术发展要被滚滚历史车轮碾过的,我也就不怎么刻意推荐,大家可以自行斟酌&/p&
unity asset store正在进行史上最强大促占坑 给大家推荐一些值得买的红色---康托推荐绿色---高风评 Scripts部分 Textures 部分。。。有substance了 要texture作甚,,看你项目需求吧。唯一觉得可以推荐的SUIMONO Water System明明应该是shader…
首先我们明确一点:&br&&b&几乎&/b&所有用障眼法来达到目的的开发方式,其本质都是&b&因为技术层面无法实现想要的效果,不得已而为之&/b&。&br&&br&———————————原答案不断更新中————————————————————&br&&br&怎样在fps里把敌人的命中率严格控制在80%?&br&答:100%击中,80%有效。&br&&br&怎样做出逼真的倒地动作?&br&答:动作做到要倒下时为止,剩下的用ragdoll。&br&&br&怎样在不调用windows api的前提下强制更改鼠标位置?(常见于galgame的存取档)&br&答:做个一模一样的假鼠标,隐藏原鼠标的图形,转嫁所有鼠标操作&br&&br&怎样在静态nevmesh寻路的前提下做出室内外跳转?(斜视角游戏)&br&答:直接利用大场景的navmesh,大门位置对齐,根据进出配合动态obstacle切换场景active状态。&br&&br&怎样做出效率较高的残影特效?(静态视角)&br&答:三渲二出关键帧的动作,在动画的事件帧里扔出来。&br&&br&怎样判断一个杀怪任务是否完成?&br&答:让怪物掉落一个玩家看不见的隐藏道具“任务标记物”,用以标记当前任务的进度。&br&&br&怎样判断一个剧情任务是否完成?&br&答:在玩家到达trigger点时由系统给他一个“任务标记物”。&br&&br&越肩视角、追背视角或者第一人称视角,并且移动速度不会大于跑动速度的情况下,可以把tree的叶片设置为billboard,除非玩家认真去观察,否则不会发现(如果没记错的话,天刀貌似也是这么做的?)
首先我们明确一点: 几乎所有用障眼法来达到目的的开发方式,其本质都是因为技术层面无法实现想要的效果,不得已而为之。 ———————————原答案不断更新中———————————————————— 怎样在fps里把敌人的命中率严格控制在80%? 答:1…
问题很对胃口,我来答一记,水平有限,先说说在Tiled 地图方面的经验(多图流量预警!)。&br&&br&1、一开始是打算做个《英雄无敌3》的独立Unity游戏,最先想到要做的就是Tile地表编辑器,先贴张《英雄无敌3》编辑器的图。&br&&img src=&/f97fde996a31eff4b0adc127be454952_b.jpg& data-rawwidth=&1235& data-rawheight=&813& class=&origin_image zh-lightbox-thumb& width=&1235& data-original=&/f97fde996a31eff4b0adc127be454952_r.jpg&&&br&要说2D Tiles地图的美术表现,除掉斜45度的《暗黑破坏神2》,顶视图的冠军非《英雄无敌3》莫属。另外,&b&刷地表功能的一个要点在于能以各种笔刷(泥地、沙地、海、草地)随意的刷地表,地表跟临接其他类型地表的衔接关系一定是对的,有了这个,不仅是策划或者美术编辑修改方便,而且&u&自动生成关卡&/u&才有可能。&/b&&br&&br&《英雄无敌3》的NB之处就在于多种Tiles之间的衔接非常自然,注意上图中宝物1右边的红框区域,这个格子里有泥地、草地、沙地三种纹理衔接,这在基于Tiles的2D地图里非常少见。&br&&br&所以呢,我先把《英雄无敌3》的资源解出来,看看怎么才能做得如此NB:&br&&img src=&/33d6c40ff6aefd423cd946_b.jpg& data-rawwidth=&1265& data-rawheight=&805& class=&origin_image zh-lightbox-thumb& width=&1265& data-original=&/33d6c40ff6aefd423cd946_r.jpg&&所以为啥人家这么NB呢?素材规划强啊,刚才提到的红框区域泥草沙三种纹理混合图就在最后一排的中间(做了水平镜像的操作)。&br&&br&简单的说,沙地和泥地,算是基础地形,其他地形都有跟跟沙地和泥地衔接的图素,所以如果其他地形之间要衔接,就在中间夹沙地或者泥地(注意第一张图中间区域的火山地形和草地衔接之间的泥地过渡)。&br&&br&明白了这个道理,又有了图素,就开始做呗,正式美术资源什么的等编辑器好了再找美术按着这个规则做吧。&br&&br&所以我就开始写代码了。写了几千行代码,弄了个这么个东西:&br&&img src=&/5c6b59cc487dd63ebc5f5e63b36d902b_b.jpg& data-rawwidth=&1264& data-rawheight=&911& class=&origin_image zh-lightbox-thumb& width=&1264& data-original=&/5c6b59cc487dd63ebc5f5e63b36d902b_r.jpg&&但做到这份上只做到了海面和两种基础地表的混合,接下来就要引入一张图素三种地形的类型了,我心里琢磨了一下算法,突然发现工作量比我想象的大,我似乎对这种Tile衔接的规则总结得不太到位,那么上网找找吧。&br&&br&--------------------------------------------------分割线,谢谢-------------------------------------------------------&br&&br&2、神器出现了:&a href=&///?target=http%3A//www.mapeditor.org/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Tiled Map Editor&i class=&icon-external&&&/i&&/a&&br&&br&这简直是赤裸裸的打我脸啊,以后做啥事之前能不能先上网搜搜?造轮子再快能快过直接开车吗?&br&&br&Tiled是个开源项目,编辑器框架基于QT,有很多游戏都基于Tiled制作地图,斜45度或者顶视图都可胜任,贴几张图上来给大家看下:&br&&br&&img src=&/9a56d028f8298bdb4a8517fee5fd7d9d_b.jpg& data-rawwidth=&1006& data-rawheight=&654& class=&origin_image zh-lightbox-thumb& width=&1006& data-original=&/9a56d028f8298bdb4a8517fee5fd7d9d_r.jpg&&&br&&img src=&/6a50cc241fb_b.jpg& data-rawwidth=&1006& data-rawheight=&654& class=&origin_image zh-lightbox-thumb& width=&1006& data-original=&/6a50cc241fb_r.jpg&&&br&我试用了一段时间,这个编辑器最NB的就是对地表类型编辑归纳,并且自动衔接其他类型地表的功能。举例给大家看看:&br&&br&&img src=&/2f48cad91a3ce96897bf_b.jpg& data-rawwidth=&1483& data-rawheight=&810& class=&origin_image zh-lightbox-thumb& width=&1483& data-original=&/2f48cad91a3ce96897bf_r.jpg&&以上面斜45度地形的图素为例,如果美术给你做了所有的衔接图,你导入所有图素,选定某种类型的地表(左边列表中的Sea2),然后在右边图库中标识哪些图片的哪些区域(左上、右上、左下、右下)是该种类型(蓝色高亮区域)。标识完成后,你就可以在主视窗用该笔刷任意涂刷了,程序会自动为你做地表衔接。&br&&img src=&/0822bcc3ba797f69b97a74_b.jpg& data-rawwidth=&1640& data-rawheight=&862& class=&origin_image zh-lightbox-thumb& width=&1640& data-original=&/0822bcc3ba797f69b97a74_r.jpg&&&br&教学到此为止,那么,题主是要做Unity2d的Tiled地图啊,这个编辑器编辑的成果如何导入Unity项目呢?&br&&br&--------------------------------------------------分割线,谢谢-------------------------------------------------------&br&&br&3、Tiled to Unity&br&&br&Unity Assert Store里搜索“Tiled”,你会很容易找到将Tiled地图导入Unity的插件:&br&第一个是:Tiled Tilemaps &br&&img src=&/bdcf0b97be1ce88a12a5f_b.jpg& data-rawwidth=&797& data-rawheight=&762& class=&origin_image zh-lightbox-thumb& width=&797& data-original=&/bdcf0b97be1ce88a12a5f_r.jpg&&详细的去商店看介绍吧。&br&&br&另一个更神奇一点,名字跟我这节名字一样:Tiled to Unity&br&这玩意儿能把Tiled 2d地图映射到3D元素上,生成Unity3d地图。&br&&img src=&/06fc52d1aae1c74f0f7e8b14_b.jpg& data-rawwidth=&792& data-rawheight=&900& class=&origin_image zh-lightbox-thumb& width=&792& data-original=&/06fc52d1aae1c74f0f7e8b14_r.jpg&&我想2D转3D应该不是题主的需求吧,但这东西看起来确实吸引人,就是不知道渲染效率如何,不知道有没有做渲染批次合并...而且有点贵......本人没试用过,看起来评论区 钟磊 同学有经验,感兴趣的同志可以移步向他请教。&br&&br&总之呢,基于开源软件的Tiled地图本身地图存储格式也是很清晰的,就算自己写读取地图也不会太难。&br&&br&--------------------------------------------------分割线,谢谢-------------------------------------------------------&br&4、Tiled图素资源&br&题主问到美术素材,一看就是准备单人Solo的节奏,遇到这样的同学我就很高兴,虽然知道十之八九是死路一条吧,但就是喜欢这种“虽万人吾亦往”的调调。单人Solo最麻烦的是素材的版权问题,&br&&br&以下是我觉得可以考虑的素材来源:&br&1) Google + Tileset:国外网站有很多免费开源的美术资源,比如&a href=&///?target=http%3A//opengameart.org/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&OpenGameArt.org&i class=&icon-external&&&/i&&/a&,使用前请仔细区分基于什么开源协议,就是里面要挑出刚好合适有好看的不容易。&br&&br&2)Unity Assert Store:虽然大多是收费,但一般品质相当高,举个例子:&br&&img src=&/3bea8c73c_b.jpg& data-rawwidth=&825& data-rawheight=&900& class=&origin_image zh-lightbox-thumb& width=&825& data-original=&/3bea8c73c_r.jpg&&&br&3)淘宝,非常惭愧,介绍这玩意儿简直是助涨无视知识产权的邪恶力量。但如果是做前期技术准备,这里真能找到不少合适的资源。&br&&br&--------------------------------------------------分割线,谢谢-------------------------------------------------------&br&5、没想好....其实是有个念头,大家干嘛非得单人Solo呢?要不咱们跟GitHub上弄个开源游戏项目可好?
问题很对胃口,我来答一记,水平有限,先说说在Tiled 地图方面的经验(多图流量预警!)。 1、一开始是打算做个《英雄无敌3》的独立Unity游戏,最先想到要做的就是Tile地表编辑器,先贴张《英雄无敌3》编辑器的图。 要说2D Tiles地图的美术表现,除掉斜45度的…
已有帐号?
无法登录?
社交帐号登录
12946 人关注
262 条内容
126 人关注
239 条内容
240 人关注
1273 人关注
376 条内容

我要回帖

 

随机推荐