天涯明月刀ol长生剑是用什么语言开发的?c ?c#? unity开发游戏是用什么语言?

后使用快捷导航没有帐号?
 论坛入口:
  |   |    |   | 
独立游戏开发者需要在激情中保持清醒
10.jpg (131.79 KB, 下载次数: 98)
16:17 上传
  文/Oliver Milne
  Josh Parnell是独立游戏开发者,他是2012年通过Kickstarter成功众筹共计18万美元来制作《极限理论》(Limit Theory),从而开始崭露头角的。这款游戏是一切皆由程序生成的太空模拟游戏。然而,开发在众筹成功后进入了瓶颈。很多人都知道,在2015年Parnell从公众眼前消失了6个月,再出现时带来了他的精神健康抱恙的消息,原来他是回到了父母身边去看病了。他向GamesIndustry.biz吐露了在独立游戏开发中他是如何挣扎着保持清醒的经历。
  “我独自一人住在田纳西州山上的小木屋里,那里很安静,这也是我之所以想在那里进行开发的原因,但是同样地,那里也真的是一个容易让人疯掉的地方,因为你永远都是一个人在写着代码。”他这样告诉我们。除了Kickstarter宣传文中提到令人印象深刻的概述——独自开发以外,这个游戏中只有音乐和声音效果是从外部获取的资源——也就是说在Parnell临近崩溃的时候,他只有孤身一人。
  “我最终的情况是要一个人来面对开发过程中遇到的大问题,而如果你想保持游戏的高质量,你就要写好每一行代码——要让它有很高的性能、还要让它有高效的机械感——但是你是一个人,所以你还要在开发中超高效发挥水准,”他说,“然而这个问题并不好解决。特别是考虑到——说真的我以前从没有做这种大项目的经验,所以我从没有过它会完不成的概念。”
  Limit Theory代码规模已经达到了10万行,一个人完成这样的代码规模是不可能的,Parnell在使用自制的“Limit Theory 脚本语言”来缩减代码量时,导致了让人无法接受的游戏性能表现——这样棘手的问题给他的内心世界带去了灾难性后果。
  Parnell是在大学的时候开始Litmit Theory的开发的,而他在精神上崩溃的时候只有22岁。“21、22、23岁正是我精神病征的形成期,这段时间我的大脑经历了非常多的变迁,”他提到。“也因此,在我经受精神压迫的时候,我糟糕的生活习惯——不眠不睡、饮食不健康、以及除了开发Limit Theory以外什么也不干——无疑恶化了这个病状。”
  “很显然,对于那些生活经验丰富的人以及论坛友人们知道了我的生活方式以后,都会跟我说很多次类似于‘Josh,你快停下来吧,不然你会崩溃的’这样的话。但是,你懂的,对于一个没有那种经历的22岁年轻人来说,这些话的真正含义我很难真正体会。但是该来的还是来了,而且来得如此猛烈。我的大脑有一段时间几乎都是处于一种当机的状态。那真的——真的是一段非常不愉快的时光。”
  说来有趣,精神健康问题在游戏行业其实是见怪不怪了,在那些“高压时期”和随时丢饭碗的压力下,患精神疾病的风险和症状就容易被放大。能自由掌控自己的时间和知识产权,这乍一看好像可以为独立游戏开发者们减少一些压力,但是Parnell说独立游戏开发者的生活法时本身就存在风险:“一方面,你觉得你在做自己喜欢的事,这种激情让你觉得自己作为一个独立开发者真是棒极了;另一方面,这种激情也正是危险的源头——当它成为你的工作,消耗着你的时间的时候,一切都变了。不过你很难看清这点,因为你脑袋里想的全都是‘哇,我在做我喜欢的是耶,它一定会非常棒的!’”
  事实上,正是因为独立游戏开发者能够做出自己想要的游戏,才导致了这些问题的产生。Parnell说:“我认为这是一大诱因。当然因人而异,但是就这种圆梦的概念(如果你好好想想的话)本身就已经很危险了。因为很多(虽然不是大部分)人有梦想,并把梦想放在在一臂之遥的距离……当你真的可以抓住它的时候,你就会试着让它成真,而艰难险阻便随之而来——因为你已经离梦想很近了,你想让它更近一点,你想让它成为现实。为了实现这个梦想,你时常要面对一写肮脏、混乱或者你毫无兴趣的东西,而这样的梦想——跟你想象的不一样。”
  看过Limit Theory的Kickstater页面的话会知道,这款游戏野心可不小,无限的宇宙生成系统、飞船的战略性控制、供给链的创造、一个带有NPC的“丰富社交系统”、除此之外还有很多内容。有如此愿景的抱负正是导致了结构效率问题的直接因素,这在2015年对Parnell造成了重大打击。可能很多人会觉得这不过是个警醒傲慢的独立游戏人要勇于面对现实的故事罢了,然而让人欢心鼓舞的是——Parnell在带病的情况下成功做到了,而且现在仍旧坚守着游戏的工作——用的是一种更健康的方式。
  他说“我现在有了非常正常的工作时间安排表,我把工作和个人的空间分隔开来了,我强烈建议同僚们也这么做——起床之后直接坐上椅子开始写代码真没什么好的,而且还有点儿危险。”现在Parnell回到了他在Baton Rouge的老家,更加注重了对工作和生活的平衡。
  有了五年前Parnell在Kickstarter成功众筹得到的资金加上独自一人开发游戏的低开销,这使得他有足够的时间针对游戏的效率问题做结果试验,Parnell一年的时间里基本上都在针对这些问题进行处理,一年后的现在他很有把握——通过LUA脚本语言和C语言结合方法——这些问题都被很好地解决了。然而他拒绝对游戏的发行日期发表评论。
  “我不会给出一个时间表的,这只是因为我要真给了的话我还会倒的。”他还说:“但是我可以告诉你们,如果接下来几个星期在【明确C和LUC语言之间的分工】方面顺利的话,我预计大部分剩下的时间会用来做游戏的平衡阶段内容。因为现在新游戏层出不穷——然而想找到好玩有格调的游戏却像大海捞针。是的,我在精神崩塌之前确实放了大量内容在游戏里,并且它们现在已经开始运转了,我觉得这时候最大的挑战就是——假设没有什么大型差错的话——让这个宇宙有一种对的感觉。”
  Parnell的进步是肉眼可见的。一个相关论坛用户问他:“我想看看我们完美主义者Josh(他现在喜欢被叫做更健康、更均衡的务实者Josh)的作品(the smoldering corpse)”,他现在可以指出Limit Theory的demo将在一月份得克萨斯州的圣安东尼奥举行的PAX South游戏展上继续展出,他写道:“我将会把一个操作器交给完全不认识的陌生人,让他们玩玩这款无疑是相当不完美(但是很美)的游戏demo。完美主义者Josh想要写一个能够让这些陌生人在10个不同场景进行选择的demo,每个展示的都是LT游戏的不同模块。务实者Josh则追求稳定性,希望不要有太多漏洞就好了。在【PAX South游戏展】过后,我希望我将能够给你们呈现出这个作品(the smoldering corpse)来。
  在经历了这么多以后,Parnell现在变得十分冷静。他说“如果我可以带着经历过一切后吸取的经验教训回到过去,重新来过,那现在一切都会变得不一样。但是这些事情确实让我吸取了我应得的教训——比如保持健康的工作方式、用更全面的视角审视游戏而不是在趣味性和细枝末节上较真——说实话,这些事如果我没有经历过,真的永远无法体会到。”
  他说其他小型游戏开发者也存在这样的风险:“我认为我经历的挣扎不是我一个人才有的——很多的独立游戏开发者,尤其是那些想要冒险干一番大事的人,他们会逼着自己做下去,因此他们也必须面对于生活与工作的平衡抗争。”
  现在Parnell最担心的问题是如何保留住他对游戏的最初设想。“这真的是很难的一部分——也是相当重要的一部分——记住最初的梦想。”他解释道。“也可以这么说:铭记还未增添实施细节的最初游戏设想。所以我有时试着花一些时间来什么都不做,光幻想着Limit Theory的未来——我总是沉浸在这种幻想里,把最初对游戏设想的愿景停留在脑海里。”
游戏邦编译
相关阅读:
关注我们官方微信公众号
下载我们官方APP-游戏行
关注手游动态微信公众号
数值碎碎念(三)——兰彻斯特的讨论冷兵器 “动作+吃鸡”游戏,《灵魂之火》想Game Maker:一款教学工具造就了一批独立开《战神》总监:一个boss需20人做一两年 被恺英网络拟以10.64亿元现金收购浙江九翎,抖音游戏营销实例:下载量iOS提升40倍、安
微信扫一扫关注我们→【天涯明月刀OL】抖腿神曲unity--天刀乐伶演奏_腾讯视频
三倍流畅播放
1080P蓝光画质
新剧提前看
1080P蓝光画质
纯净式无框播放器
三倍流畅播放
扫一扫 手机继续看
下载需先安装客户端
{clientText}
客户端特权:
3倍流畅播放
当前播放至 {time}
扫一扫 手机继续看
副标题要不要
副标题要不要
副标题要不要
副标题要不要
副标题要不要
副标题要不要
副标题要不要
副标题要不要
副标题要不要
副标题要不要
副标题要不要
副标题要不要
副标题要不要
副标题要不要
副标题要不要
副标题要不要
副标题要不要
副标题要不要
副标题要不要
副标题要不要
副标题要不要后使用快捷导航没有帐号?
 论坛入口:
  |   |    |   | 
Unity开发者如何有效地进行本土化
iOS&Android&
文/Alex Sink
  对于一名游戏开发者来说,本土化总是不能出现在适当的时候。不管我们是否在一开始进行设置,因为我们认为这是正确的方法,但是紧随其后游戏便遭遇了失败。或者即使游戏表现得不错,我们也必须尝试着明确如何将其放置在之后的过程。我已经将这个问题放在之后的问题集分类中:如果这是你所面对的问题,那么这便是你需要为此花钱去解决的问题。
  最近我参与了一个为本土化提供资金的项目,我们的任务比想象中复杂得多。虽然存在一种简单的方法,但却没有什么好的建议,所以这个任务暂时被搁置了。是使用unity获得了整个资产渠道,但是获得游戏翻译仍然不是件简单的工作。我仍然需要完成我的资源,资产以及关于文本的所有场景搜索,然后对它们进行重组并参考一些实用内容从而给予当前语言的相关翻译。我知道自己可以做得更好,对吧?
  在Transfluent我认识了Jani,对于使用一种工具而更轻松地利用unity的资产渠道获得游戏翻译这一点我们具有类似的想法。他已经通过获得一个基本的编辑翻译工具而完成了第一传。因为它遭遇了许多第二层和第三层问题,所以第一传是非常好的出发点。然而,与许多unity图形用户界面编辑窗口一样,即时模式的使用将会以某种方式倒向代码结构并倾向于创造好几千行内容的文件。所以这是推动我们吸取某些教训的一个很好的起点。
本土化的障碍:
  1.提取文本并将其放在数据储存区进行翻译
  2.删除任何关于文本的简单引用(在场景和预制件中)并用纯粹的脚本控制文本进行替代
  3.基于某种形式用字符串替代任何串并置(“hello”+“world”)以及动态文本(如来自用户“hello there”+用户名的文本)
  4.重新将储存于数据储存区的文本整合到你所选择的UI解决方法中
  5.找到一种方法去使用翻译器翻译你的数据—-这通常包含进入“蓝屋”(如:不创造一款游戏)
  6.检查你的游戏是否已经翻译了所有内容—-使用一种你懂的“外语”并且仍然能够用于导航至各种理想选择。例如:Facebook的“英语(盗版)”
  7.在发现短语未翻译时获得新的翻译内容
什么是正确的:
  1.隐藏unity的所有OnGUI和GUILayout功能。这有时候看似疯狂,但这将以创造一个非常简单的方法去获得一个带有许多静态文本且能够更快速地进行翻译的UnGUI游戏告终。也许还有些功能较为模糊,就像输入内容是否应该是自动翻译的,但只要那些内容属于异常情况,这便能够帮助你轻松地翻译游戏。
  2.对textmeshes,场景和预制件进行资产扫描。它将找到你的文本并对其进行翻译。我认为GameSpecificMigration中的黑名单机制可以得到完善。
  3.简单的储存格式。最初,我将数据格式与专用格式绑定在一起,认为这么做会方便许多。ScriptableObjects是并未存在于场景中的基本游戏对象。它们将在运行时间中获得同意的优化,并在与别人合作时呈现出YAML合并友好型特质。确保界面就像一本简单的词典,并且在处理之后出现的各种简单任务上允许更多灵活性的出现。
  4.“逆向”语言—-这是检查你的游戏的一种简单的方法,以此确保你能够翻译自己所作出的大多数决定。
  5.“捕获模式”—-能够贯穿你的游戏而运行,作为一种寻找资源翻译的方法,而不是从代码中将文本复制到翻译数据库,这似乎比较不容易出错且更容易更新。你也可以选择其它方法,但这种模式能够带给你帮助。
  6.编辑窗口逻辑/视图分离。拆分“视图”逻辑,就像通过“应用”逻辑呈现文本,如上传,命令翻译。基于strangeioc的中介模式(),我越来越习惯这种方法。是否想要上传你自己完成的新翻译内容?当然。那么在编辑窗口呢?也要。
  7.测试—-测试能够帮助我避免沉浸于某些愚蠢的内容,如脱机以及计划停运。它们将帮助我在前进的过程中核实设计和数据格式,因为如果我不能单独测试它,它便很容易崩溃。尽管我以前使用过nunitlite,不过Unity的测试工具刚刚出现,并且是一个很棒且较为完善的工具,基于Jenkins(游戏邦注:是基于Java开发的一种持续集成工具,用于监控秩序重复的工作),我能够自动操作测试,从而在代码损坏某些内容时立即获得反馈。
未知:(例如“已知的未知”)
  1.基于OnLocalize支持的运行时间。显然我们需要一种方法去告知代理语言发生了改变,所以我决定使用Unity向客户发送信息。这并不是我经常做的某些事,但却是我发现其它类似的中间件成功使用过的一种模式。
  2.标记化。我认为这将以积极的结果告终,而这更多地取决于KISS原则的功劳。最简单的解决方法只是隐藏字符串。格式以及在“Hello,{0}”格式中使用字符串看似是最正确的方法。事实证明,关于翻译存在许多细微差别,可能会让屏幕截图变得更有效(也有可能变得更糟糕)。
未来的工作:
  1.编辑器的支持。翻译你的编辑工具EditorGUILayout和EditorGUI似乎是有效的。我认为所有需要完整的本土化编辑工具的内容在某种程度上都将连接隐藏的editorguilayout和editorgui与一个特定的TranslationUtilityInstance。我不认为这具有挑战性,但是我也不确定是否真的需要这样的内容。
  2.确保文本“看起来”是合理的,并且如果翻译内容需要提前运行的话,提供给翻译器一个更棒的提示。这与在获取模式中发送屏幕截图一样简单。
  3.更深入的整合—-支持在各种框架上自动换行以及规格调整。
  4.支持更多UI框架—-它们带有许多相关联的不同挑战。
  5.中间件整合—-整合搭配fungus和其它工具链意味着能够更轻松地创造游戏。拥有像fungus以及其它故事/游戏创造支持工具真的很酷。
  6.更多资产扫描。创造更多支持自动转移的文本。思考:本土化playmaker文本。资产扫描器的设置是为了帮助解决编辑器脚本撰写的粘滞位问题,ICustomProcessors只是处理GameObjects将功能延伸向全新的脚本类型。
  随着越来越多人使用工具,我们的目标便是根据新识别的用例而继续完善它。
via:91手册
关注我们官方微信公众号
下载我们官方APP-游戏行
关注手游动态微信公众号
学习,支持!
学习,支持!
数值碎碎念(三)——兰彻斯特的讨论冷兵器 “动作+吃鸡”游戏,《灵魂之火》想Game Maker:一款教学工具造就了一批独立开《战神》总监:一个boss需20人做一两年 被恺英网络拟以10.64亿元现金收购浙江九翎,抖音游戏营销实例:下载量iOS提升40倍、安
微信扫一扫关注我们→&p&正如楼上所说, TA(技术美术)和图形程序员的专注方向是不一样的&/p&&p&PBRT是一本讲离线渲染中的基于物理着色的书,而Physical-Based Rendering 在实时渲染领域的发展也有好几年了,已经成为了各大引擎的标配,作为一个TA,现在无论是实现一个支持pbr的图形引擎还是研究新的BRDF框架都不太值得。只要做到理解由Cook-Torrance microface框架衍生出来的材质模型参数如何去影响渲染结果就行。对于BRDF来说,甚至不需要理解到Disney的材质模型的那十个参数,只需要到 Roughness, Metallic, Albedo这三个就完全足够了,也方便你更加轻松地使用substance之类的工具建立工作流&/p&&p&相反,RTR 3rd倒还是值得一看,大而全,介绍了很多实时渲染领域的基础内容,(中文版建议看&a href=&//www.zhihu.com/people/b34bb40fe18653f1baeb09e& data-hash=&b34bb40fe18653f1baeb09e& class=&member_mention& data-hovercard=&p$b$b34bb40fe18653f1baeb09e&&@毛星云&/a&的专栏,加入了译者的很多理解)从基本的transform,texturing到LOD, Occlusion Culling,包括上面说的microface框架原理,然后是和特效相关的粒子系统,volumetric rendering,和全局光照相关的反射,折射,次表面散射,环境光遮蔽等等,会让你对整个游戏的图形部分有个清晰的认知。如果你同时在学习美术,你就可以熟练地用 procedual texture 生成好看的纹理,同时来节约纹理空间,从而做到纯美术和纯技术做不到的事情&/p&&p&作为技美,不建议为了理解RTR而去写一些基础框架级别的代码,可以写写基于现有引擎的一些shader来验证书中的一些技术&/p&&p&再往深看,不一定是RTR,一旦理解了 deferred rendering pipeline 为什么把动态光照复杂度由O(mn)变成了O(m+n),就能知道在Unity引擎中切换渲染管线所造成的影响,进而能想到这样会占据相对较大的带宽从而明白TBBR和Forward+为什么逐渐成了主流。对渲染管线的熟悉程度决定了技术美术在做决策,写shader的时候能否写出高性能的代码。&/p&&p&RTR3 其实有些旧了,建议多关注GDC&/p&
正如楼上所说, TA(技术美术)和图形程序员的专注方向是不一样的PBRT是一本讲离线渲染中的基于物理着色的书,而Physical-Based Rendering 在实时渲染领域的发展也有好几年了,已经成为了各大引擎的标配,作为一个TA,现在无论是实现一个支持pbr的图形引擎…
&figure&&img src=&https://pic2.zhimg.com/v2-8e12bbf2e657e_b.jpg& data-rawwidth=&1920& data-rawheight=&1312& class=&origin_image zh-lightbox-thumb& width=&1920& data-original=&https://pic2.zhimg.com/v2-8e12bbf2e657e_r.jpg&&&/figure&&p&&b&主要实现3个功能&/b&:&/p&&p&&br&&/p&&blockquote&1.代码膨胀&br&2.代码变形&br&3.对地址常量包括字符串常量进行加密&/blockquote&&p&&br&&/p&&p&&br&&/p&&h2&&b&代码膨胀&/b&&/h2&&p&&br&&/p&&p&代码膨胀无非就是指令等价替换,不过这里没条指令最好能有多个膨胀规则,这样会加大还原难度。&/p&&p&&br&&/p&&p&原始程序大小为6kb,经过5次混淆后,大小变为66kb。&/p&&figure&&img src=&https://pic3.zhimg.com/v2-1a9b36928f9dac31ec1f6_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&661& data-rawheight=&487& class=&origin_image zh-lightbox-thumb& width=&661& data-original=&https://pic3.zhimg.com/v2-1a9b36928f9dac31ec1f6_r.jpg&&&/figure&&p&&br&&/p&&p&混淆前代码:&/p&&figure&&img src=&https://pic1.zhimg.com/v2-f0ee3e4f6c405b49cdca5c1_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&813& data-rawheight=&572& class=&origin_image zh-lightbox-thumb& width=&813& data-original=&https://pic1.zhimg.com/v2-f0ee3e4f6c405b49cdca5c1_r.jpg&&&/figure&&p&&br&&/p&&p&混淆后代码:&/p&&figure&&img src=&https://pic1.zhimg.com/v2-c4cc0f0d1da87e3e873c312e112f2f75_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&734& data-rawheight=&243& class=&origin_image zh-lightbox-thumb& width=&734& data-original=&https://pic1.zhimg.com/v2-c4cc0f0d1da87e3e873c312e112f2f75_r.jpg&&&/figure&&figure&&img src=&https://pic2.zhimg.com/v2-eca25db40c87a71df0a74de28174ef8f_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&910& data-rawheight=&795& class=&origin_image zh-lightbox-thumb& width=&910& data-original=&https://pic2.zhimg.com/v2-eca25db40c87a71df0a74de28174ef8f_r.jpg&&&/figure&&p&从上图会发现有大量的垃圾代码生成。&/p&&p&&br&&/p&&p&&br&&/p&&h2&&b&代码变形&/b&&/h2&&p&&br&&/p&&p&&br&&/p&&p&&b&1. 有分支跳转改成无分支跳转。&/b&&/p&&p&&br&&/p&&p&在逆向分析时主要是通过条件跳转来确定函数的流程,根据跳转的目标地址来确定这是一个分支还是一个循环。如果将所有条件跳转改成无分支跳转,那么程序只有在动态执行时,才能确定流程。这大大提高了逆向分析的难度。&/p&&p&&br&&/p&&p&另外,ida在进行还原伪c代码时,遇到无分支跳转,会进行截断,导致后面指令无法还原伪c代码。这对靠f5吃饭的人说就gameover了。因为此时已经控制了代码流程, 如果在后面加一些垃圾指令,会导致后面的代码全部识别错乱,只有运行时才确定要跳到哪个位置。&/p&&p&&br&&/p&&p&另外对 jmp imm, call imm和call [imm](一般这种间接call都是api调用) 也改成无分支跳转。&/p&&p&&br&&/p&&p&本来没打算对这类指令进行处理,但是发现效果还挺好,干脆就加上吧。因为jmp imm也可以作为判断分支或者循环的依据,而call也是一个比较关键的指令,尤其是call api,在逆向分析时,通过观察api的前后代码来确定代码到底在干嘛。&/p&&p&&br&&/p&&p&这样一处理,你静态分析时看不到任何条件跳转,看不到任何call调用(除了call reg,当然了,静态分析你也看不出来call reg)。&/p&&p&&br&&/p&&p&另外对条件跳转和call这类指令的下一条指令加一些垃圾代码,会导致后面的整段指令识别错误。也会给别人留下个坑,比如一般人想步过这个函数调用,会在函数的下一条指令地址处下断点,但这条指令实际上永远不会执行。&/p&&p&&br&&/p&&p&&b&实现思路&/b&&/p&&p&&br&&/p&&p&1. 将跳转目标地址保存到一个地址数组表里面,在建一个索引表记录地址表的索引,在对索引进行随机加密。&/p&&p&&br&&/p&&p&运行时根据条件码得到正确的索引表地址,在对索引进行解密,得到正确的目标地址偏移。&/p&&p&&br&&/p&&p&代码变形前:&/p&&figure&&img src=&https://pic4.zhimg.com/v2-bee1f0e7b_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&610& data-rawheight=&486& class=&origin_image zh-lightbox-thumb& width=&610& data-original=&https://pic4.zhimg.com/v2-bee1f0e7b_r.jpg&&&/figure&&p&&br&&/p&&p&代码变形后:&/p&&figure&&img src=&https://pic3.zhimg.com/v2-53f1e5fa5e92a97bb43c6be_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1051& data-rawheight=&469& class=&origin_image zh-lightbox-thumb& width=&1051& data-original=&https://pic3.zhimg.com/v2-53f1e5fa5e92a97bb43c6be_r.jpg&&&/figure&&p&两幅图对比发现call memset 变成了一大串指令,最后以ret结尾。这一大串做了一个事情,去索引表找到地址表的索引,在根据这个索引去地址表找到正确偏移值,加上基地址,得到目标地址。&/p&&p&&br&&/p&&p&同时会把返回地址压栈,实际上返回地址是可以随意更改的,我是按照代码块进行处理的,随意加一些垃圾指令, 把后面的代码块往下移动一点就好了,这个自己改,另外索引加密这个我注释掉了,去掉就可以。&/p&&p&&br&&/p&&p&大家发现这里先push了2个寄存器,在这里偷了点懒,实际上最好应该是用反汇编引擎扫一下当前哪些寄存器是被占用的,再从没被占用的寄存器中随机分配2个寄存器。如果没有可利用的寄存器,在这么做。&/p&&p&&br&&/p&&p&call memset是一个立即数,再来看下scanf (call [imm])&/p&&p&&br&&/p&&p&代码变形前:&/p&&figure&&img src=&https://pic4.zhimg.com/v2-ad4b037d8cdbb_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&752& data-rawheight=&383& class=&origin_image zh-lightbox-thumb& width=&752& data-original=&https://pic4.zhimg.com/v2-ad4b037d8cdbb_r.jpg&&&/figure&&p&代码变形后:&/p&&figure&&img src=&https://pic3.zhimg.com/v2-5c31efdb701abf08a085faf_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1049& data-rawheight=&438& class=&origin_image zh-lightbox-thumb& width=&1049& data-original=&https://pic3.zhimg.com/v2-5c31efdb701abf08a085faf_r.jpg&&&/figure&&p&再来看下f5后的代码:&/p&&p&&br&&/p&&p&代码变形前:&/p&&figure&&img src=&https://pic4.zhimg.com/v2-c117f9be06eb_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&751& data-rawheight=&426& class=&origin_image zh-lightbox-thumb& width=&751& data-original=&https://pic4.zhimg.com/v2-c117f9be06eb_r.jpg&&&/figure&&p&代码变形后:&/p&&figure&&img src=&https://pic2.zhimg.com/v2-dde04e914abb622b37d228b5e10325b2_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&971& data-rawheight=&651& class=&origin_image zh-lightbox-thumb& width=&971& data-original=&https://pic2.zhimg.com/v2-dde04e914abb622b37d228b5e10325b2_r.jpg&&&/figure&&p&从上图可以发现变形后,ida根本就没有识别完整个函数,只识别了一点点。ida遇到无条件跳转会截断当前函数。&/p&&p&&br&&/p&&p&对地址常量包括字符串常量进行加密 :&br&&/p&&p&在进行逆向分析时,很多人第一反应会去看看有没有一些敏感字符串,根据ida的交叉引用来确定目标地址。&/p&&p&&br&&/p&&p&另外一些地址值可能也比较关键,比如回调函数。而这类常量赋值一般都是mov指令和push指令,对 mov imm,push imm这类指令的立即数做随机加密,就可以起到一个保护的作用。&/p&&p&&br&&/p&&p&加密前:&/p&&figure&&img src=&https://pic3.zhimg.com/v2-8ac2b51e38993aec777ba2ad41f08b8d_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&651& data-rawheight=&170& class=&origin_image zh-lightbox-thumb& width=&651& data-original=&https://pic3.zhimg.com/v2-8ac2b51e38993aec777ba2ad41f08b8d_r.jpg&&&/figure&&p&&br&&/p&&p&加密后:&/p&&figure&&img src=&https://pic2.zhimg.com/v2-fa721f471d64dc09a842_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&788& data-rawheight=&369& class=&origin_image zh-lightbox-thumb& width=&788& data-original=&https://pic2.zhimg.com/v2-fa721f471d64dc09a842_r.jpg&&&/figure&&p&&br&&/p&&p&&a href=&https://link.zhihu.com/?target=https%3A//bbs.pediy.com/thread-223629.htm& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&本文由看雪论坛 淡淡的荧光 原创
转载请注明来自看雪社区&/a&&/p&&p&&/p&
主要实现3个功能: 1.代码膨胀 2.代码变形 3.对地址常量包括字符串常量进行加密 代码膨胀 代码膨胀无非就是指令等价替换,不过这里没条指令最好能有多个膨胀规则,这样会加大还原难度。 原始程序大小为6kb,经过5次混淆后,大小变为66kb。 混淆前代码: 混…
&p&几个在线编译器资源:(来源于&a href=&https://link.zhihu.com/?target=https%3A//isocpp.org/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&https://isocpp.org&/a&)&/p&&p&平时会遇到有点小想法想验证一下,发现手头那台电脑环境不具备,还要折腾一下重新配置,很是烦人。无意间发现了这几个在线的资源,记录下来,留作后用。&/p&&p&1、&a href=&https://link.zhihu.com/?target=https%3A//isocpp.org/godbolt.org/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&godbolt.org&/a& (Clang, GCC, Intel ICC, VC++)&/p&&p&2、&a href=&https://link.zhihu.com/?target=http%3A//melpon.org/wandbox/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Wandbox&/a&
(Clang, gcc -- includes Boost)&/p&&p&3、&a href=&https://link.zhihu.com/?target=http%3A//webcompiler.cloudapp.net/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Online Visual Studio Compiler&/a& (VC++)&/p&&p&4、&a href=&https://link.zhihu.com/?target=http%3A//stacked-crooked.com/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Stacked-Crooked&/a& (GCC)&/p&&p&5、&a href=&https://link.zhihu.com/?target=http%3A//rextester.com/runcode& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Rextester&/a& (Clang, GCC, VC++)&/p&&p&6、&a href=&https://link.zhihu.com/?target=http%3A//ideone.com/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&ideone.com&/a& (GCC, Clang)&/p&&p&&/p&
几个在线编译器资源:(来源于)平时会遇到有点小想法想验证一下,发现手头那台电脑环境不具备,还要折腾一下重新配置,很是烦人。无意间发现了这几个在线的资源,记录下来,留作后用。1、 (Clang, GCC, Intel ICC, VC++)2、
&figure&&img src=&https://pic1.zhimg.com/v2-2dc6a2a33d63ab11a2dfe7cc50f0b2b3_b.jpg& data-rawwidth=&960& data-rawheight=&544& class=&origin_image zh-lightbox-thumb& width=&960& data-original=&https://pic1.zhimg.com/v2-2dc6a2a33d63ab11a2dfe7cc50f0b2b3_r.jpg&&&/figure&&p&大家好。我“正式”从事软件工程师这个职业已经快15年了。至于编程的历史则更长,有20余年了。记忆当中第一次编程的机器里只有ROM BASIC,用“*”打了个金字塔。屏幕是那种单色的cga,只能显示绿色的字符。&/p&&p&因为这样,至今我也喜欢手敲代码。我的意思是,从零开始一个字符一个字符的敲。我觉得这个过程特别有意思,有成就感。&/p&&p&我从小就喜欢科技类的东西,父母是做航天工业的,所以也算有些基因,也有机会较早接触到电脑。十多岁在爸爸的办公室看到了装在屏蔽笼子里的图形工作站,旁边一台绘图仪。好像是德国进口的?反正单位里没几个人懂德语,国家花了大价钱买来,也没啥人会用,就供在那里。后来来了个研究生,外语比较好,把厚厚的说明书研究了半天,总算调出了一个例程,可以控制绘图仪画一张航天飞机模型的线框图。记得绘图仪左边一共有6只水笔,一个固定在横杆上的机器手(夹子),可以沿横杆前后(y方向)移动;同时横杆自体在步进马达控制下可以水平(x方向)移动。换色就是移动到左边换笔,然后在纸上绘图。夹子有落笔和提笔两种动作。&/p&&p&扯得有些远了,但总之从那时开始便对计算机绘图产生了浓厚兴趣。后来又有了游戏机,就觉得更有兴趣了。&/p&&p&然而直到近年有幸进了SIE,其实之前一直没有机会能够从事和游戏开发直接相关的工作。毕业后做了4年GUI,又搞了4年DLNA,1年中医四诊仪,3年视频监控设备,中间还客串了2年市场部,写了个销售制造管理系统,才终于进入了游戏行业。&/p&&p&目前我支持着国内200余家主机游戏开发商的开发项目。同时也和诸如中国传媒大学,上海交通大学等在一起推进游戏开发相关的教育项目。&/p&&p&不过这个专栏是纯粹的个人分享,与我所在团体和公司无任何直接关系。&/p&&p&我计划在这个专栏里通过一系列文章的分享,完成并展现一个手敲版游戏引擎的制作过程。可能的话,还会包括在合适的开发板上全手工建立操作系统(这部分主要是交叉编译,不是从零手敲),并在上面跑起来这个手敲版引擎的过程。引擎的部分首先着重runtime部分,editor等host tools在runtime之后。runtime部分则首先做图形渲染部分,然后逐渐迭代扩充。&/p&&p&工程十分浩大,老实说我也不知道要多少篇文章才能写完。平常也很忙,人也不是很勤快,十年肯定是不够的,慢慢写吧。反正也不是很在乎有没有人看,?。&/p&&p&好了,这篇就这样吧,算开个头。&/p&&p&(-- EOF --)&/p&&p&&br&&/p&&figure&&img src=&https://pic2.zhimg.com/v2-229daa2bfca2deabf6522d_b.png& data-rawwidth=&88& data-rawheight=&31& class=&content_image& width=&88&&&/figure&&p&&br&&/p&&p&本作品采用&a href=&http://link.zhihu.com/?target=http%3A//creativecommons.org/licenses/by/4.0/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&知识共享署名 4.0 国际许可协议&/a&进行许可。&/p&
大家好。我“正式”从事软件工程师这个职业已经快15年了。至于编程的历史则更长,有20余年了。记忆当中第一次编程的机器里只有ROM BASIC,用“*”打了个金字塔。屏幕是那种单色的cga,只能显示绿色的字符。因为这样,至今我也喜欢手敲代码。我的意思是,从…
&p&为了项目安全且干净其实插件用的越少越好,因为插件很多都自己封装了Dll,如果出了BUG,想解决就特别的麻烦。&/p&&p&但是自己造轮子简直太累,作为强迫症患者又见不惯自己的轮子写的难看,一不小心一天就过去了。&/p&&p&所以这里我就举3款项目里面常用的插件,好用又免费:&/p&&p&&b&1.DoTween &/b&&/p&&p&做动画非常的方便,直接链式结构写代码也非常的快。避免代码里面控制物体还需要写协程或者再Update里面循环。&/p&&div class=&highlight&&&pre&&code class=&language-text&&using System.C
using System.Collections.G
using UnityE
using DG.T
public class DotweenTest : MonoBehaviour {
public Transform targetP
// Use this for initialization
void Start () {
gameObject.transform.DOMove(targetPos.position,2).OnUpdate(()=&
//在移动中每帧执行
}).OnComplete(()=&
//移动完成后执行
gameObject.SetActive(false);
&/code&&/pre&&/div&&p&效果:&/p&&p&&br&&/p&&figure&&img src=&https://pic3.zhimg.com/v2-9fcae42b06a_b.jpg& data-rawwidth=&623& data-rawheight=&312& class=&origin_image zh-lightbox-thumb& width=&623& data-original=&https://pic3.zhimg.com/v2-9fcae42b06a_r.jpg&&&/figure&&p&&br&&/p&&p&缺点是:是DLL包,想修改还得反编译。而且在Dotween回调(如OnUpdate)里面的报错是黄色警告(这个很坑,层级一个回调里面有报错结果谁都没有发现,最后游戏卡死)。&/p&&p&下载地址:&/p&&p&&u&&a href=&//link.zhihu.com/?target=http%3A//dotween.demigiant.com/& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&dotween.demigiant.com/&/span&&span class=&invisible&&&/span&&/a&&/u&&/p&&p&&br&&/p&&p&&b&2.Cinemachine&/b&&/p&&p&影视镜头插件,2017的首推插件,这个做镜头非常的简单,而且效果也很棒。&/p&&p&可以很简单的创建自由视角的摄像机&/p&&p&&br&&/p&&figure&&img src=&https://pic3.zhimg.com/v2-85ca39c5ae7bc_b.png& data-rawwidth=&318& data-rawheight=&184& class=&content_image& width=&318&&&/figure&&p&&br&&/p&&p&创建好的效果&/p&&p&&br&&/p&&figure&&img src=&https://pic1.zhimg.com/v2-626420dcd24cf1a5f5bd6d084cac693c_b.jpg& data-rawwidth=&710& data-rawheight=&262& class=&origin_image zh-lightbox-thumb& width=&710& data-original=&https://pic1.zhimg.com/v2-626420dcd24cf1a5f5bd6d084cac693c_r.jpg&&&/figure&&p&&br&&/p&&p&Cinemachine的功能很强大,之后我们会做相关文章来介绍。&/p&&p&下载地址:&/p&&p&AssetStore上免费的&/p&&p&&b&3.Litjson&/b&&/p&&p&对Json数据处理非常的简洁方便&/p&&p&比如我们要去读取一个json的数据换成游戏里面的脚本类,只用 JsonMapper.ToObject的函数就搞定了。&/p&&div class=&highlight&&&pre&&code class=&language-text&&using S
using LitJ
using System.T
using UnityE
using System.IO;
using System.Collections.G
public class configBagData
public readonly string itemN
public readonly string spriteN
public class LitJsonTest
public void Load(string rSheetName)
TextAsset textAsset = Resources.Load&TextAsset&(&assetsbundles/data/sheet/& + rSheetName);
if (textAsset == null)
Debug.LogError(rSheetName + &未找到&);
var str = textAsset.
Dictionary&string, configBagData& data = JsonMapper.ToObject&Dictionary&string, configBagData&&(str);
&/code&&/pre&&/div&&p&下载地址:&/p&&p&&u&&a href=&//link.zhihu.com/?target=http%3A//lbv.github.io/litjson/& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&lbv.github.io/litjson/&/span&&span class=&invisible&&&/span&&/a&&/u&&/p&&p&&br&&/p&&p&当然还有一些美术插件,比如T4M地形插件,美术场景很多要用unity的地形功能,但是Unity的地形网格数量太多了,用T4M重新渲染可以降低网格数量。但是要注意的是美术资源用完插件后做好代码清理,不然会污染主工程代码环境。&/p&
为了项目安全且干净其实插件用的越少越好,因为插件很多都自己封装了Dll,如果出了BUG,想解决就特别的麻烦。但是自己造轮子简直太累,作为强迫症患者又见不惯自己的轮子写的难看,一不小心一天就过去了。所以这里我就举3款项目里面常用的插件,好用又免费:…
&p&为什么有 8个人邀请,你们都觉得我很老了么?我还很年轻,悄悄的告诉你们,姚老师比我老,你们该去邀请他。&/p&&p&以前学了现在没用的技术,有很多,越数越伤心,还是回忆下 2007年的事情吧:&/p&&br&&p&1. 业余在玩 Flash 游戏开发,当时页游还没有火,我觉得是个机会,市面上很多页游都是八位机的水平,估计他们以前都没什么游戏开发经验,所以大家都持怀疑态度,我想看看 Flash 的 2D 效果能做到什么程度,于是花了了两周时间做了 Flash 下的第一个小游戏:&/p&&p&&a href=&//link.zhihu.com/?target=http%3A//www.skywind.me/weapon/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Flash Game - Final Weapon&/a& 。。。  &/p&&p&嗯,模仿 PopCap 的
heavy weapon 加了些有趣的元素,比当时所有市面上的 Flash 游戏效果都好一大截,至今为止,仍然有很多市面上的 Flash 游戏没达到这个 Demo 的效果。&/p&&br&&p&2. 带领一只六人团队开发 XBox 360 的预研项目,把公司一套 3D引擎移植到 XDK 的 D3D9下面,D3D8 到9 跨度很大,废了比较多的时间,觉得 D3D9 才是未来。当时 360 的性能并没有说的那么好,单核性能差不多只能到我笔记本单核的 50% 左右,但是它有六个核,和原有引擎的单线程体系差别比较大,因此性能十分堪忧,这个坑填了很久。原有引擎很多基于 SSE 的运算代码全部不能使用了,花了不少时间改写成为 PowerPC 的 AltiVec 指令,最终才将整个引擎终于在 360 上从 “不能用” 变为 “能够一用” 了。当时写了篇关于 360 的优化文章:&/p&&p&&a href=&//link.zhihu.com/?target=http%3A//www.skywind.me/blog/archives/340& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&PowerPC 汇编入门与优化&/a& 。&/p&&br&&p&3. 研究游戏同步技术,当时国内没人觉得游戏还有 “同步” 问题,没有任何参考资料,2007年游戏市场上清一色的 MMORPG 游戏,大家觉得只有做 MMO才是挣钱的。我看当时网游里 95% 的 RPG游戏,在对比单机游戏上只有 39%的 RPG比例,觉得十分不合理,玩家迟早要厌烦,RPG垄断的局面必然被打破。但是传统 RPG那一套在快速动作游戏上基本没法行得通。我不断的抓包,推敲模拟传统局域网游戏和国外快速动作游戏的同步方式,写了篇文章:《&a href=&//link.zhihu.com/?target=http%3A//www.skywind.me/blog/archives/131& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&帧锁定同步算法&/a&》配合之前写的《&a href=&//link.zhihu.com/?target=http%3A//www.skywind.me/blog/archives/112& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&网络游戏同步法则&/a&》以及《&a href=&//link.zhihu.com/?target=http%3A//www.skywind.me/blog/archives/1145& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&影子跟随算法&/a&》,基本上从两个方向讨论游戏同步的两大核心方法:&b&帧同步&/b&和&b&状态同步(客户端预测插值)&/b&。&/p&&br&&p&4. 学习策划知识,翻译 MUD之父 Richard Bartle 的《&a href=&//link.zhihu.com/?target=http%3A//www.skywind.me/resource/hcdsc.htm& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&MUD玩家分类理论&/a&》,当时游戏“成就系统” 在国外刚刚兴起,国内游戏还没有这个东西,觉得十分不错,我又翻译了 《&a href=&//link.zhihu.com/?target=http%3A//www.skywind.me/blog/archives/346& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&成就系统最佳实践&/a&》。&/p&&br&&p&5. 弄 server 内存分配优化,参考 kernel 的 slab 内存分配算法,于是优化并重新设计了一套 slabtree 分配算法,给服务端整体内存分配性能提升了一倍,不再受运行时间和碎片的影响 。大致原理见:&a href=&https://www.zhihu.com/question//answer/& class=&internal&&如何设计内存池? - 知乎&/a&&/p&&br&&p&10年后:&/p&&p&1. Flash 基本挂掉了,没人再提了,不过如今页游还是在发展,只是远没当初那么火爆,当年学习 Flash 的程序员都纷纷 cocos 和 u3d了,现在做页游想招聘一个 Flash 程序员更是难上加难,不过 Flash 的 API 我觉得设计的真的很漂亮,我见过 2D 引擎里比较上乘的接口设计了,今天很多用 H5封装的游戏引擎,比如白鹭引擎,没事扫了一眼,他们从对象树到 API名称,还是再模仿 Flash 的接口,可见影响力有多大。&/p&&p&2. 360也挂掉了,当年游戏机清一色的 PowerPC (主机)和 mips(掌机,PSP)架构,如今换成了 x86(主机)和 arm(掌机)结构了。D3D9 也早已被淘汰。 &/p&&p&3. 同步技术到今天都还在很多讨论,作为研究的比较早的人,我的三篇文章曾经帮助了不少游戏解决他们的同步技术。《街机三国》的制作人跟我说,当时做 DEMO就是卡在同步上,后来看到了我的 《帧锁定同步法》解决了《街机三国》的同步问题,最终项目得以立项,然后他们就发财了,我得到一句真诚的 “感谢”。听说《王者荣耀》也还在用基于 “帧同步” 的改良方式。&/p&&p&4. 当年花过好几年的时间学习策划知识,业余也喜欢自己兼任策划和程序做些小游戏,但如今成就系统早已不是什么新东西,巴图的理论也出现了更为科学先进的玩家分类方法的论文,加上 2009 年以后我就不做游戏了,这些知识基本也就白费了。&/p&&p&5. 后来发现和 tcmalloc 很像,用了 7年这套代码,比 libc 自带的 malloc 强太多了,一路都是最好用的内存分配算法,后来我自己忙其他项目懒得添加新特性和继续优化就换成 jemalloc 了。当年 “内存分配” 这个技术,但凡有点经验的人,都会来两手,也是比较关键的模块之一,如今好玩看看就行,自己重新实现边际效用太低。&/p&&p&----&/p&&br&&p&总结下,翻翻历史,以前学过现在没用的技术实在是一大把,我承认技术是有 “道” 和 “术” 的区别,我写了十多年代码的时候以为 “术” 容易淘汰,而只有 “道” 就能长存,一旦掌握了恒久不变的道,就可以以不变应万变;而又写了十多年代码以后发现从更长的尺度上来看,并没有一成不变的东西。&/p&&p&道法精深,短期是可以帮助你尽快的掌握运用新的 “术” 但是随着具体实践的不断发展,人类认识世界的范围逐步扩大,理论体系这个上层建筑的 “道” 也需要不断修正,推陈出新,适应新的实际情况。&/p&&p&早期基于的端游开发经验,帮我在 Flash 平台上可以更短的时间内掌握要点,并做出超过同期水平的东西。手游兴起后,我虽然没趟这滩浑水了,但看到很多第一批成功的团队,也都是早年在端游或者页游上有经验的人。&/p&&p&另一层面上,道也不是一成不变的:以前积累的各种单核技术下的 “道”,碰到 360 这种 6核cpu,每个核都不行的体系,基本全废了;以前写代码,每一行我都想追求极致性能的做法,后面变得没那么重要了;内存分配算法,在某一阶段内自己可以做到领先,但不能持续了解最新相关方法,不持续迭代,兴趣转移了,隔段时间也就被 jemalloc 超过了,所以也并无一成不变的算法。&/p&&p&总之,基本原理要掌握,不能成天只搞具体技术忽视理论提高;也不能痴迷纯粹的 “理论”,还是要勇于实践掌握新进的 “术” 才能更好的迭代进化你自己的 “道”,否则空有理论,只能坐而论道了。这不,我一把年纪了,最近几个月还在玩 beautifulsoup4 做爬虫呢。&/p&&p&并没有什么 “一成不变” 的 “基本原理” 可以让你学一次就吃一辈子的。&/p&&p&钱学森不是说过么,脱离工程的理论,是没有价值的。&/p&&br&&p&---&/p&
为什么有 8个人邀请,你们都觉得我很老了么?我还很年轻,悄悄的告诉你们,姚老师比我老,你们该去邀请他。以前学了现在没用的技术,有很多,越数越伤心,还是回忆下 2007年的事情吧: 1. 业余在玩 Flash 游戏开发,当时页游还没有火,我觉得是个机会,市面…
在育碧里,3C(camera, character, control)是许多动作游戏的核心,是由gameplay程序员实现的。那些跑酷gameplay已成为育碧游戏的标志。&br&&br&在网游中,最基本的是网络同步方案(属分布式仿真的领域)。技能系统可能是最复杂的游戏逻辑部分,需要适合的框架与工具。&br&&br&另外,基本上很多游戏也会花费大量的开发力量在用户界面上。这是很烦人的一个部分,看似没什么技术含量,设计得不好直接要重做几遍。许多时还没考虑到新手指引等东西。&br&&br&高大上的技术也有很多:人工智能、角色动画、物理模拟、内容生成??即使有人工智能、动画、物理引擎,如何合适的应用在游戏上也是gameplay程序员负责的。由于人工智能在每个游戏的需求都很不一样,许多游戏需要由gameplay程序员实现各种算法,从寻路、回避障碍、行为规划、行为实现、高层策略、甚至是机器学习等等。&br&&br&每年 GDC 上除了游戏引擎相关(如渲染)等部分,游戏逻辑部分也占了不少主题。例如今年GDC育碧有一个讲他们如何在 Far Cry 中实现野生动物的locomotion与行为,顽皮狗也有许多游戏中的gameplay实现讲座。上年的中国GDC也有一个讲如何找到最优位置的,也有voxel场景的 AI 方面的。&br&&br&有时也许是有鸡还是有蛋的问题,是人员的能力未能做到某些技术,还是需要那些技术的项目未出现。但作为技术人员的话,最好能不断装备自己,并对现时的需求做到极致。
在育碧里,3C(camera, character, control)是许多动作游戏的核心,是由gameplay程序员实现的。那些跑酷gameplay已成为育碧游戏的标志。 在网游中,最基本的是网络同步方案(属分布式仿真的领域)。技能系统可能是最复杂的游戏逻辑部分,需要适合的框架与…
(Unity开发路过&br&&br&推荐两个资料,一个是刀神翻译的&a href=&//link.zhihu.com/?target=http%3A//www.cnblogs.com/gameknife/p/3515714.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&OpenGL Insights 阅读有感 - Tile Based架构下的性能调校 翻译&/a&&br&一个是R神翻译的&a href=&//link.zhihu.com/?target=http%3A//madstrawberry.me/unreliable-translate/A-trip-through-the-Graphics-Pipeline-2011-translate%280%29.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&(译)3D管线之旅:索引 - 疯草莓的幻想&/a&&br&(&del&&a href=&//link.zhihu.com/?target=https%3A//fgiesen.wordpress.com//a-trip-through-the-graphics-pipeline-2011-index/& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&fgiesen.wordpress.com/2&/span&&span class=&invisible&&011/07/09/a-trip-through-the-graphics-pipeline-2011-index/&/span&&span class=&ellipsis&&&/span&&/a&&/del&划掉)&br&&br&其他的一些资料比较零散,譬如ARM有一些optimization tips这种的
(Unity开发路过 推荐两个资料,一个是刀神翻译的 一个是R神翻译的 (&del&&/del&划掉) 其他的一些资料比较零散,譬如ARM有一些optimiza…
pp来来来,安利一波,钱老板 &a data-hash=&96ebf60da4f1295abab79cce388e85c0& href=&//www.zhihu.com/people/96ebf60da4f1295abab79cce388e85c0& class=&member_mention& data-hovercard=&p$b$96ebf60da4f1295abab79cce388e85c0&&@钱康来&/a&推荐文章的翻译版,不需要翻墙,价廉物美,就是更新有点慢..&br&&a href=&//link.zhihu.com/?target=http%3A//madstrawberry.me/unreliable-translate/A-trip-through-the-Graphics-Pipeline-2011-translate%280%29.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&(译)3D管线之旅:索引 - 疯草莓的幻想&/a&&br&&br&妈的,看着流量那么多,你们倒是赞啊...&br&&br&感谢各位,我在百度统计上看见了烟花,妈的,开博一年了,加起来还没今天多。&br&&br&感谢zhihu拯救了一个日活为2的blog...&br&&br&老泪纵横
pp来来来,安利一波,钱老板 推荐文章的翻译版,不需要翻墙,价廉物美,就是更新有点慢..
妈的,看着流量那么多,你们倒是赞啊... 感谢各位,我在百度统计上看见了烟花,妈的,开博一年了,加起来还没今天多。 …
&p&UI的开发一直是Unity项目里工作量比较大的部分,传统的UI制作流程一般是美术在PS里做好设计图,导出&b&图片素材&/b&以及&b&布局信息&/b&给UI策划或程序(个人感觉直接给程序更好,因为一些程序功能的实现需要调整节点的位置,增删等等),而布局信息则很可能是一张PSD对应的png或jpg图。这样就会带来两个问题:(1)程序无法得到精确到像素的局部信息,搭建界面的位置一般近似处理,除非费时费力的去PSD文件里查看;(2)拼界面的过程相对机械重复,效率不高,对于开发周期短,人手不足的小团队来说可以说是一个痛点。&/p&&p&为了解决这个问题,最近参考&a href=&http://link.zhihu.com/?target=https%3A//blogs.unity3d.com/cn//a-good-workflow-to-smoothly-import-2d-content-into-unity-part-i-authoring-and-exporting/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Unity官方&/a&和&a href=&http://link.zhihu.com/?target=http%3A//blog.uwa4d.com/archives/PSD4UGUI.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&UWA&/a&的两篇文章,从PS的&a href=&http://link.zhihu.com/?target=http%3A//www.adobe.com/cn/devnet/scripting.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&ExtendScript&/a&和UnityEditor两方面入手,做了一个将PSD文件快速转换为UGUI界面的小工具『PSD Importer』,新的工作流下如下:&/p&&ol&&li&美术同学在PhotoShop里完成对界面的设计后,使用编写的Adobe ExtendScript脚本导出PSD图层的信息(XML)以及用到的图片素材(示例素材来源于网络):&figure&&img src=&https://pic2.zhimg.com/v2-fda0cd936f5be78eda99_b.png& data-rawwidth=&600& data-rawheight=&550& class=&origin_image zh-lightbox-thumb& width=&600& data-original=&https://pic2.zhimg.com/v2-fda0cd936f5be78eda99_r.jpg&&&/figure&导出的XML组织信息如下:&br&&div class=&highlight&&&pre&&code class=&language-xml&&&span&&/span&?xml version=&1.0& encoding=&utf-8&?&
&span class=&nt&&&PSD&&/span&
&span class=&nt&&&PSDSize&&/span&
&span class=&nt&&&x&&/span&1920&span class=&nt&&&/x&&/span&
&span class=&nt&&&y&&/span&1080&span class=&nt&&&/y&&/span&
&span class=&nt&&&/PSDSize&&/span&
&span class=&nt&&&PSDGroup&&/span&
&span class=&nt&&&Name&&/span&PreparePanel&span class=&nt&&&/Name&&/span&
&span class=&nt&&&Index&&/span&0&span class=&nt&&&/Index&&/span&
&span class=&nt&&&Type&&/span&Simple&span class=&nt&&&/Type&&/span&
&span class=&nt&&&PSDGroups&&/span&
// list of PSDGroup here....
&span class=&nt&&&/PSDGroups&&/span&
&span class=&nt&&&PSDArtLayers&&/span&
// list of PSDArtLayer
&span class=&nt&&&/PSDArtLayers&&/span&
&span class=&nt&&&/PSDGroup&&/span&
&span class=&nt&&&/PSD&&/span&
&/code&&/pre&&/div&&br&&/li&&li&之后将图片素材打包成Atlas导入Unity,推荐使用TexturePacker;&br&&/li&&li&最后在Unity里读取XML文件,构建出对应的UGUI界面,程序根据需求再进行微调;&/li&&li&结果如图所示,位置布局,层次与PSD文件保持一致(红色部分是TexturePacker未注册所致):&figure&&img src=&https://pic3.zhimg.com/v2-f3bd639ad0bff937c89fa2_b.png& data-rawwidth=&600& data-rawheight=&550& class=&origin_image zh-lightbox-thumb& width=&600& data-original=&https://pic3.zhimg.com/v2-f3bd639ad0bff937c89fa2_r.jpg&&&/figure&&br&&/li&&/ol&&br&新的工作流最大限度的还原了美术所设计的界面,节约了不少手动拼界面所花费的时间和潜在的位置误差等问题。&br&&p&实现上需要解决的核心问题便是得到需要的PSD的结构信息,下面是一些技术细节:&/p&&p&&b&PSD组织结构导出为XML&/b&&/p&&p&主要有两种方式读取PSD文件的信息,一种是直接读取保存好的PSD文件,Git上搜PSD可以找到有很多开源的类库;另一种则是使用Adobe ExtendScript脚本直接扩展PhotoShop的功能,在PS里访问图层的信息,这种方式灵活性比较高,也方便修改,我们采用了第二种方式。在&a href=&http://link.zhihu.com/?target=http%3A//wwwimages.adobe.com/content/dam/Adobe/en/devnet/scripting/pdfs/adobe_intro_to_scripting.pdf& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&这里&/a&我们可以了解到PS里的所有Group和图层都的父类都是Layer,Group对应LayerSet,其余的都是ArtLayer,因此可以定义以下XML结点类型来桥接PS与Unity的类型:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&
public abstract class PSDWidget
public enum PSDGroupType { Simple, /*Button,
ScrollView, Grid */}
public enum PSDArtLayerType { Image, Texture, Label }
public string N
public int I
public class PSDGroup : PSDWidget
public PSDGroupType T
public PSDGroup[] PSDG
public PSDArtLayer[] PSDArtL
public class PSDArtLayer : PSDWidget
public Vector2 P
public Vector2 S
public bool IsS //Solid Color
public PSDArtLayerType T
public Image.Type SpriteT
public string[] A
public class PSD
public Vector2 PSDS
public PSDGroup PSDG
&/code&&/pre&&/div&&p&因为要识别特殊类型如Button,ScrollView等,可以在命名时制定一些规则,例如加一些额外的字段和参数(ButtonGroup@Button),之后在jsx脚本中遍历Layer信息生成XML即可,大致过程如下:&/p&&div class=&highlight&&&pre&&code class=&language-js&&&span&&/span&&span class=&kd&&function&/span& &span class=&nx&&main&/span&&span class=&p&&()&/span&
&span class=&p&&{&/span&
&span class=&nx&&exportLayerSet&/span&&span class=&p&&(&/span&&span class=&nx&&app&/span&&span class=&p&&.&/span&&span class=&nx&&activeDocument&/span&&span class=&p&&.&/span&&span class=&nx&&activeLayer&/span&&span class=&p&&);&/span&
&span class=&p&&}&/span&
&span class=&kd&&function&/span& &span class=&nx&&exportLayerSet&/span&&span class=&p&&(&/span&&span class=&nx&&targetLayerSet&/span&&span class=&p&&)&/span&
&span class=&p&&{&/span&
&span class=&c1&&// export groups&/span&
&span class=&k&&for&/span& &span class=&p&&(&/span&&span class=&kd&&var&/span& &span class=&nx&&i&/span& &span class=&o&&=&/span& &span class=&mi&&0&/span&&span class=&p&&;&/span& &span class=&nx&&i&/span& &span class=&o&&&&/span& &span class=&nx&&targetLayerSet&/span&&span class=&p&&.&/span&&span class=&nx&&layerSets&/span&&span class=&p&&.&/span&&span class=&nx&&length&/span&&span class=&p&&;&/span& &span class=&nx&&i&/span&&span class=&o&&++&/span&&span class=&p&&)&/span&
&span class=&p&&{&/span&
&span class=&nx&&exportLayerSet&/span&&span class=&p&&(&/span&&span class=&nx&&targetLayerSet&/span&&span class=&p&&.&/span&&span class=&nx&&layerSets&/span&&span class=&p&&[&/span&&span class=&nx&&i&/span&&span class=&p&&]);&/span&
&span class=&p&&}&/span&
&span class=&c1&&// export artlayers&/span&
&span class=&k&&for&/span& &span class=&p&&(&/span&&span class=&kd&&var&/span& &span class=&nx&&i&/span& &span class=&o&&=&/span& &span class=&mi&&0&/span&&span class=&p&&;&/span& &span class=&nx&&i&/span& &span class=&o&&&&/span& &span class=&nx&&targetLayerSet&/span&&span class=&p&&.&/span&&span class=&nx&&artLayers&/span&&span class=&p&&.&/span&&span class=&nx&&length&/span&&span class=&p&&;&/span& &span class=&nx&&i&/span&&span class=&o&&++&/span&&span class=&p&&)&/span&
&span class=&p&&{&/span&
&span class=&nx&&exportArtLayer&/span&&span class=&p&&(&/span&&span class=&nx&&targetLayerSet&/span&&span class=&p&&.&/span&&span class=&nx&&artLayers&/span&&span class=&p&&[&/span&&span class=&nx&&i&/span&&span class=&p&&]);&/span&
&span class=&p&&}&/span&
&span class=&p&&}&/span&
&span class=&kd&&function&/span& &span class=&nx&&exportArtLayer&/span&&span class=&p&&(&/span&&span class=&nx&&targetLayer&/span&&span class=&p&&)&/span&
&span class=&p&&{&/span&
&span class=&k&&if&/span&&span class=&p&&(&/span&&span class=&nx&&targetLayer&/span& &span class=&nx&&is&/span& &span class=&nx&&Label&/span&&span class=&p&&)&/span&
&span class=&p&&{&/span&
&span class=&nx&&exportLabel&/span&&span class=&p&&(&/span&&span class=&nx&&targetLayer&/span&&span class=&p&&)&/span&
&span class=&p&&}&/span&
&span class=&k&&if&/span&&span class=&p&&(&/span&&span class=&nx&&targetLayer&/span& &span class=&nx&&is&/span& &span class=&nx&&Image&/span&&span class=&p&&)&/span&
&span class=&p&&{&/span&
&span class=&nx&&exportLabel&/span&&span class=&p&&(&/span&&span class=&nx&&targetLayer&/span&&span class=&p&&)&/span&
&span class=&p&&}&/span&
&span class=&p&&}&/span&
&/code&&/pre&&/div&&p&&b&Unity解析XML构建UGUI界面&/b&&/p&&p&反序列化XML之后,遍历整个结点树,创建UGUI组件即可:&/p&&div class=&highlight&&&pre&&code class=&language-csharp&&&span&&/span&&span class=&n&&PSD&/span& &span class=&n&&psdUI&/span& &span class=&p&&=&/span& &span class=&n&&DeserializeXML&/span&&span class=&p&&&&/span&&span class=&n&&PSD&/span&&span class=&p&&&(&/span&&span class=&n&&xmlPath&/span&&span class=&p&&);&/span&
&span class=&n&&List&/span&&span class=&p&&&&/span&&span class=&n&&PSDWidget&/span&&span class=&p&&&&/span& &span class=&n&&widgets&/span& &span class=&p&&=&/span& &span class=&k&&new&/span& &span class=&n&&List&/span&&span class=&p&&&&/span&&span class=&n&&PSDWidget&/span&&span class=&p&&&();&/span&
&span class=&n&&widgets&/span&&span class=&p&&.&/span&&span class=&n&&AddRange&/span&&span class=&p&&(&/span&&span class=&n&&psdUI&/span&&span class=&p&&.&/span&&span class=&n&&PSDArtLayers&/span&&span class=&p&&);&/span&
&span class=&n&&widgets&/span&&span class=&p&&.&/span&&span class=&n&&AddRange&/span&&span class=&p&&(&/span&&span class=&n&&psdUI&/span&&span class=&p&&.&/span&&span class=&n&&PSDGroups&/span&&span class=&p&&);&/span&
&span class=&k&&foreach&/span& &span class=&p&&(&/span&&span class=&kt&&var&/span& &span class=&n&&widget&/span& &span class=&k&&in&/span& &span class=&n&&widgets&/span&&span class=&p&&.&/span&&span class=&n&&OrderBy&/span&&span class=&p&&(&/span&&span class=&n&&x&/span& &span class=&p&&=&&/span& &span class=&n&&x&/span&&span class=&p&&.&/span&&span class=&n&&Index&/span&&span class=&p&&))&/span&
&span class=&p&&{&/span&
&span class=&k&&if&/span& &span class=&p&&(&/span&&span class=&n&&widget&/span& &span class=&k&&is&/span& &span class=&n&&PSDArtLayer&/span&&span class=&p&&)&/span&
&span class=&p&&{&/span&
&span class=&n&&PSDArtLayer&/span& &span class=&n&&artWidget&/span& &span class=&p&&=&/span& &span class=&n&&widget&/span& &span class=&k&&as&/span& &span class=&n&&PSDArtLayer&/span&&span class=&p&&;&/span&
&span class=&n&&RectTransform&/span& &span class=&n&&childNode&/span& &span class=&p&&=&/span& &span class=&k&&null&/span&&span class=&p&&;&/span&
&span class=&k&&switch&/span& &span class=&p&&(&/span&&span class=&n&&artWidget&/span&&span class=&p&&.&/span&&span class=&n&&Type&/span&&span class=&p&&)&/span&
&span class=&p&&{&/span&
&span class=&k&&case&/span& &span class=&n&&PSDWidget&/span&&span class=&p&&.&/span&&span class=&n&&PSDArtLayerType&/span&&span class=&p&&.&/span&&span class=&n&&Image&/span&&span class=&p&&:&/span&
&span class=&n&&childNode&/span& &span class=&p&&=&/span& &span class=&n&&BuildImage&/span&&span class=&p&&(&/span&&span class=&n&&artWidget&/span&&span class=&p&&);&/span&
&span class=&k&&break&/span&&span class=&p&&;&/span&
&span class=&k&&case&/span& &span class=&n&&PSDWidget&/span&&span class=&p&&.&/span&&span class=&n&&PSDArtLayerType&/span&&span class=&p&&.&/span&&span class=&n&&Label&/span&&span class=&p&&:&/span&
&span class=&n&&childNode&/span& &span class=&p&&=&/span& &span class=&n&&BuildText&/span&&span class=&p&&(&/span&&span class=&n&&artWidget&/span&&span class=&p&&);&/span&
&span class=&k&&break&/span&&span class=&p&&;&/span&
&span class=&p&&}&/span&
&span class=&n&&childNode&/span&&span class=&p&&.&/span&&span class=&n&&name&/span& &span class=&p&&=&/span& &span class=&n&&artWidget&/span&&span class=&p&&.&/span&&span class=&n&&Name&/span&&span class=&p&&;&/span&
&span class=&n&&childNode&/span&&span class=&p&&.&/span&&span class=&n&&SetParent&/span&&span class=&p&&(&/span&&span class=&n&&groupRoot&/span&&span class=&p&&,&/span& &span class=&k&&false&/span&&span class=&p&&);&/span&
&span class=&n&&childNode&/span&&span class=&p&&.&/span&&span class=&n&&localScale&/span& &span class=&p&&=&/span& &span class=&n&&Vector3&/span&&span class=&p&&.&/span&&span class=&n&&one&/span&&span class=&p&&;&/span&
&span class=&n&&childNode&/span&&span class=&p&&.&/span&&span class=&n&&localEulerAngles&/span& &span class=&p&&=&/span& &span class=&n&&Vector3&/span&&span class=&p&&.&/span&&span class=&n&&zero&/span&&span class=&p&&;&/span&
&span class=&n&&childNode&/span&&span class=&p&&.&/span&&span class=&n&&sizeDelta&/span& &span class=&p&&=&/span& &span class=&n&&artWidget&/span&&span class=&p&&.&/span&&span class=&n&&Size&/span&&span class=&p&&*&/span& &span class=&n&&UI_SCALE_RATE&/span&&span class=&p&&;&/span&
&span class=&n&&childNode&/span&&span class=&p&&.&/span&&span class=&n&&anchoredPosition&/span& &span class=&p&&=&/span& &span class=&n&&artWidget&/span&&span class=&p&&.&/span&&span class=&n&&Position&/span&&span class=&p&&*&/span& &span class=&n&&UI_SCALE_RATE&/span&&span class=&p&&;&/span&
&span class=&p&&}&/span&
&span class=&k&&else&/span& &span class=&nf&&if&/span& &span class=&p&&(&/span&&span class=&n&&widget&/span& &span class=&k&&is&/span& &span class=&n&&PSDGroup&/span&&span class=&p&&)&/span&
&span class=&p&&{&/span&
&span class=&n&&BuildGroup&/span&&span class=&p&&(&/span&&span class=&n&&widget&/span& &span class=&k&&as&/span& &span class=&n&&PSDGroup&/span&&span class=&p&&,&/span& &span class=&n&&groupRoot&/span&&span class=&p&&);&/span&
&span class=&p&&}&/span&
&span class=&p&&}&/span&
&/code&&/pre&&/div&在Editor模式下创建UGUI组件时,可以通过Instantiate prefab的方式创建,但是这种方式需要预先保存一堆Prefab,不易管理,经&a href=&http://www.zhihu.com/people/96ebf60da4f1295abab79cce388e85c0& data-hash=&96ebf60da4f1295abab79cce388e85c0& class=&member_mention& data-editable=&true& data-title=&@钱康来& data-hovercard=&p$b$96ebf60da4f1295abab79cce388e85c0&&@钱康来&/a& 指点,直接Copy了部分UGUI创建UI组件的源码来创建,这段代码在&a href=&http://link.zhihu.com/?target=https%3A//bitbucket.org/Unity-Technologies/ui/src/ca5d7dcc97dbc122586/UnityEngine.UI/UI/Core/DefaultControls.cs%3Fat%3D5.2%26fileviewer%3Dfile-view-default& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&这里&/a&。&p&对于Button,ScrollView等复杂的控件,可以在类型中进行扩展,在PSD设计时增加对应的参数即可。&br&&/p&&p&&b&一些比较坑的地方&/b&&/p&&p&1.通过artLayer.textItem.fontSize获取的字体大小,如果Label没有在PS编辑器里被拉伸,那么值是正确的,但是一旦被拉伸,fontSize将不会发生变化,这样将与实际大小不符,解决方案在&a href=&http://link.zhihu.com/?target=https%3A//forums.adobe.com/message/928153& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&这里&/a&;创建的Label如果未进行任何修改,将无法访问fontColor和justification(对齐)信息,需要使用try-catch处理。&/p&&p&2.处理特殊的图片:一是重复的图片,不需要重复导出,可以减少导出时间;二是九宫格和纯色的图片,导出时记录信息但不需要导出图片,这种的类型的图片最好手动处理。&/p&&p&由于实现代码非常暴力,XML都是直接连接string生成的= =,就不贴源码了,希望本文起到能抛砖引玉的效果,让UI制作流程更加高效!&/p&&p&&b&附一些参考资料&/b&(ExtendScript相关的内容真心不多):&/p&&p&1.&a href=&http://link.zhihu.com/?target=http%3A//www.adobe.com/products/extendscript-toolkit.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&ExtendScript Kit&/a&,帮助文档里有详细的API介绍。&/p&&p&2.&a href=&http://link.zhihu.com/?target=http%3A//www.adobe.com/cn/devnet/scripting.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&API PDF&/a&,介绍了基础的概念和API。&/p&&p&3.&a href=&http://link.zhihu.com/?target=http%3A//blog.csdn.net/woyidinghuichenggong/article/details/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&一些可以参考的插件&/a&&/p&
UI的开发一直是Unity项目里工作量比较大的部分,传统的UI制作流程一般是美术在PS里做好设计图,导出图片素材以及布局信息给UI策划或程序(个人感觉直接给程序更好,因为一些程序功能的实现需要调整节点的位置,增删等等),而布局信息则很可能是一张PSD对应…
已有帐号?
无法登录?
社交帐号登录
116 人关注
382 条内容
3194 人关注
290 条内容
685 人关注
2238 条内容
1116 人关注
186 条内容
302 人关注
197 条内容

我要回帖

更多关于 天涯明月刀ol青龙永夜 的文章

 

随机推荐