如何在ECS架构下,用Unity引擎进行游戏开发项目组织架构

君,已阅读到文档的结尾了呢~~
unity3d游戏开发之网络游戏服务器架构设计(如何做一名好主程)
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
unity3d游戏开发之网络游戏服务器架构设计(如何做一名好主程)
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer--144.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口一直觉得国内在引擎画面的理解普及上面做的糟糕,借题发挥一下好了&br&&br&游戏画面是很多因素决定的,&b&材质&/b&模型,&b&灯光&/b&模型,&b&渲染&/b&,和&b&后期&/b&特效 起着重要的作用&br&我们一个个比过来好了&br&&br&&b&材质&/b&上面,按说是谁都能写,但是各种花巧和思考,是很深奥很难平衡的,早版本的unreal3碾压其他引擎的重要方面就是材质,首先是normalmap效果强烈,其次是高光模型亮眼(油亮派),而且高亮度部分会自动glow,这个角度上来说,即使当时不是linear渲染,也至少突破了srgb的色深限制(这些不是人话的后面解释),所以某种程度上模型导入unreal就有不同的感觉。 &br&这种感觉与其说是真实,不如说是夸张,所以unreal很长时间都在真实度表现有短板,因为人物皮肤质感不够真实,对比之下,同时期的cryengine很好的改善了皮肤的质感和光照感觉,整体画面的和谐性和真实性,要接近真实的多&br&&br&unity的材质方面,是没有类似unreal的节点系统的,从unity5开始多了默认的几个材质类型,形式是往cryengine那种简单的配置方式上面靠,所以材质灵活性不够,另外一点就是unity不是重Normal map的引擎,带normalmap的材质总是塑料感太重,金属性不足,unity5虽然是改进了一些这方面的感觉,但由于默认的linear色彩空间,总是显得过亮,但是有没法再材质级别有效控制,除非使用类似shaderforge之类的插件,当然效果还是没有unreal的自带材质编辑器来的灵活&br&&br&&b&灯光&/b&模型方面,我不能从专业上说出太多不同,但是首先unity的shadow map不是最先进的,同场景实时物体一多,阴影贴图质量就会开始下降,可能是在阴影分割上面算法不够先进,unreal 和cry这方面问题就小的多&br&&br&灯光和材质的模型配合起来,高光总是不够漂亮,也是确实存在的,即使unity5也有很大改进空间,这个不敢妄言太多&br&&br&&b& 渲染&/b&:来补下linear和srgb之前的梗,真实性方面,人眼身是有一些特性的,就是说按照真实色彩曲线在屏幕上面显示的图像,和我们看到真实的时间,会有区别,因为人眼会加强某个亮度区域的色彩以适应这个世界,而摄像头就客观的多,三维渲染也是更真实一些,但是如果把这种真实的图像给人眼看到,会感觉比我们人眼看到灰暗的多,所以一般会在硬件方面做一个反曲线最后变成srgb的色彩空间让人看到。&br&&br&那我们游戏引擎里面最终效果给人看到,当然是这种强化过的适应人眼的色彩空间,但是我做光照计算和贴图就不行,因为会由于多次的色彩强化导致最终画面强烈失真,这时候就是需要linear的色彩空间,计算时候用真实色彩,直到输出这一步把色彩强化一遍以适合人眼。&br&&br&unity很早就是linear的色彩空间,但是由于后期最后一部的矫正方面很多从业人士的素养不足,或者完全没有这个意识,做出来的效果完全是不正确,或者缺乏调整弹性的。&br&而unreal则在工作流上面几乎是整合和后期的色表,去解决这个问题。我们转到下一个话题说&br&&br&&b&后期&/b&: 在所有的渲染结束之后,会加色彩校正和滤镜,我们看电影就知道,电影拍摄的效果和最终出片效果区别巨大,那是因为色彩Lut表校正之后的关系,换而言之,就是把所有的色彩一一对应,映射成另外一种色彩感觉,这个流程在unreal里面是硬性整合了,而unity则要作为滤镜使用,很多用户也不够重视这个步骤。导致最终效果不良&br&&br&&br&材质模型,灯光模型,渲染,和后期特效 这几个因素的叠加,导致了unity5的画面或者因为自身功能不强,或者因为开发者素养不足,整体效果会有弱于unreal的感觉(&b&如果两个引擎都是最好的开发者在做,应该也是unreal画面更好一些&/b&)&br&&br&但是粗糙这个词汇,我不赞同,&b&所有的特效都要考虑硬件的&/b&,unity的做法很好的考虑了不同游戏平台对画面的兼容性,所有可以随时舍弃很多效果,保证平台的支持,这方面比unreal要灵活,所以说unity画面上面的表现比unreal看起来差,并不是那么单纯的原因,你看过cryengine在mobile上面的一些例子你会更理解这个问题,引擎不是一味追求至高画面表现的。&br&&br&以上跑马随便说到哪里是哪里的,错谬肯定百出,大家不要介意&br&&br&最后吐槽一下unreal4,,由于最近的demo画面确实很惊艳,就下载了一个再玩一下,我是顶配mbp,跑unity4解决几乎所有开发项目从mmo到虚拟现实,城市规划到物理模拟,全无卡顿,(unity5会有点) &br&&br&然后我打开unreal4五秒之后,风扇就开始轰鸣。。。
&br&...&br&我是真的挺想玩玩它的blueprint来着。。。 &br&但还是继续打开unity46。。。。&br&&br&&b&补充:&/b&&br&开发效率问题的话,unreal的起源是大型游戏,unity天生为了中小型项目。&br&我用过unreal一段时间,支援以前公司一个项目,用的痛苦万分,我现在已经多年不用双屏,而当时恨不得有3个屏幕,因为界面上面很多东西配置不合理,做个粒子特效面板占了整个屏幕,要想把asset给特定对象不能用拖曳,要先选择物体再在面板制定,阿以西坝的痛苦死了。&br&当然我制定unreal4现在改进良多非吴下阿蒙,但是我还是不想用下去。&br&&br&unity的很多妙处说不得,往往就是东西放在了正确的地方,那你也就顺手用了没觉得多好,直到用了个不顺手的,才晓得它的好。&br&&br&当然你说unity工程大到一定程度,那多人协作确实不是那么容易的事情,往往还是得有一个比较全面的去兼顾所有,细部再做分工, 不知道unreal怎么解决这个。&br&&br&unity的unitypackge包是非常方便的东西,用法得当很多小游戏都是几天做完,这方面unreal store仍有差距。&br&总的来说unreal由于很多历史原因和架构庞大,开发效率方面比unity要低很多
一直觉得国内在引擎画面的理解普及上面做的糟糕,借题发挥一下好了 游戏画面是很多因素决定的,材质模型,灯光模型,渲染,和后期特效 起着重要的作用 我们一个个比过来好了 材质上面,按说是谁都能写,但是各种花巧和思考,是很深奥很难平衡的,早版本的un…
----------更新--------&br&直接看视频吧:&br&&br&&a href=&///?target=http%3A//mp./s/8Z4l4tfyxKXYdt9UINY1IQ& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&mp./s/8Z4l&/span&&span class=&invisible&&4tfyxKXYdt9UINY1IQ&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&br&&br&------要说明unity有多强大得翻出我以前干过的项目了,2004年的时候我想做一个3d的商场。于是设想了一下这个开发工具。下面是我04年百度贴吧的截图。&br&&img src=&/079d4cff1ea3c8392977afca294dd109_b.jpg& data-rawwidth=&645& data-rawheight=&938& class=&origin_image zh-lightbox-thumb& width=&645& data-original=&/079d4cff1ea3c8392977afca294dd109_r.jpg&&原文地址:&a href=&///?target=http%3A///p/Fpid%3Dcid%3D0%& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&冰火蓝虫的新想法&i class=&icon-external&&&/i&&/a&&br&一个牛逼的创意需要看它所处的时代,当初我们没有这样的开发工具,但是大伙看看unity现在的开发方式与我当初的设想是多么的接近啊!.net +3dmax 这特么的几乎一模一样啊。但是当初并没有unity,我用vrml,好古老的语言通过3dsmax导出vrml,然后通过javascript调用asp实现类似的效果。然并卵,我找不到这样的工作,这个创意超出了时代。至今还有很多公司在做这种项目,但是用户体验是个硬伤,只有vr时代才可能解决用户体验的问题。后来我转型去做crm,结果选择错误的方向,做了茶楼领域的crm,接着&a href=&tel:&&&/a&年南京就没有茶楼是活下来的。 我就去了制造业,然后去了之后就开始脑洞打开,erp当时我的眼里应该做成无人工厂,无人工厂才是真正的erp,先埋下这个伏笔。后来我参与了一些汽车工厂的非标物流设备的设计项目,其实就是因为汽车零部件一个个长的稀奇古怪不是规则的形状,就需要设计的特殊的结构料架,而这些料架不光要满足运输的需要还要满足生产节拍的需要,那么设计一个这样的产品就需要给客户做各种的展示。vrml成了我的主要展示工具,因为可以做交互,当初用的是bitmanagement公司的解决方案。可惜有个logo总是飘来飘去。就这样在制造业一直混到了2009年,一天我苏州的老东家让我给他们做一个用于展示仓储的解决方案,我在vrml群里碰到了一个04年认识的哥们,给我介绍了一下unity,这哥们真给力居然给我邮寄了一份unity的教材,当初最早的教材是“长宽高”出的。国内第一代unity玩家都应该还记得。我用了一个星期学的差不多了,就做了一个赛车游戏的demo,那什么仓储解决方案我已经抛到了脑后。我把游戏上传到了国内当时一个很火的vr网站,结果居然各种电话,各种约,我一看重返it行业的时机来了果断跳槽!下面说说unity在游戏领域有多大强大,我进的游戏公司说他们用xx2d做了半年什么都没做出来,呵呵!呵呵!我去了之后半年出了三款游戏,大卖不大卖我不知道,高层保密,下载量不说。至少在老板面前领导层终于有了勇气说,我们是会做游戏的。当初也就带了南航和河海大学刚毕业的娃娃,这些正规大学的娃娃学的就是快啊,可惜我是技校出来混的,要不然现在就不用创业了去什么大公司混去了。这一次我见识到了unity开发游戏的效率,非常强大,因为在学生时代曾经想过有一天会去做游戏结果还真成了。&br&&b&第一个强大:容易上手,开发效率高!&/b&&br&因为以前的发过赛车demo,突然一个妹纸给几通电话各种约,我没理她,我觉得做游戏蛮好玩的,后来主要新开的游戏太多,下面人被挖空,各种火大,好不容易教出来的人被撬走了,果断跑路。&br&&br&新公司做智慧城市,跑过去就做了几个牛逼的demo,cityengine 迅速出城市场景模型,直接导入unity,各种刷,各种种树种花。socket webservice各种打通,连各种传感器,各种绚丽画面,各种控制,各种高大上。在这踏踏实实干了两年。总结&br&&br&&b&第二个强大:不光可以做游戏,可以搞各种项目。&/b&&br&&br&&br&接下来,还记得前面那个脑通大开的无人工厂吗?直接上图,下面是百度上曾经发的脑残贴。&br&&img src=&/7fa22ef217f2f614b18a2_b.jpg& data-rawwidth=&814& data-rawheight=&1039& class=&origin_image zh-lightbox-thumb& width=&814& data-original=&/7fa22ef217f2f614b18a2_r.jpg&&从图里可以看出来我当时明显是个技术菜鸟,2012年有幸参与了一个真正的无人工厂,采用unity3d做全息监控,整个工厂的运行全部三维可视化监测。因为项目比较大我也不好直接说项目名称也不好找到项目图片,我只好找段类似的视频给大家看看。下面我给个地址:&a href=&///?target=http%3A///watch/.html%3Fpage%3DvideoMultiNeed& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&/watch/077&/span&&span class=&invisible&&42746.html?page=videoMultiNeed&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&br&我做的项目与这个类似,实现类似的监测效果,我只做监测部分,其他部分的均有多家公司的团队合作实现。虽然无图无真相,但是我只想说你爱信不信。看看unity强大不强大,从游戏到无人工厂,从多媒体到工业监测,这货无所谓不能啊。以前有人说发布的平台稳定性不行,后来支持了linux直接抽了这货的脸啊!知道吗?在开发过程中别家公司的用的开发工具各种溢出,各种闪退,而unity真给我长脸啊,一次闪退都没有!顶多卡,但是不溢出!呵呵!&br&&b&第三个强大:稳定性极好,工业级不怕。&/b&&br&&br&&br&其实我之前做软件的时候碰到过各种问题,发布个软件忘记各种类库没添加,话说用了unity之后全是一键发布,重来不用考虑勾选类库。还支持各种平台的发布,现在都知道。&br&&img src=&/1afc396e001a30cded7b766c6f560845_b.jpg& data-rawwidth=&837& data-rawheight=&356& class=&origin_image zh-lightbox-thumb& width=&837& data-original=&/1afc396e001a30cded7b766c6f560845_r.jpg&&&br&&b&&img src=&/acd90a2867dec79d257c4d_b.jpg& data-rawwidth=&836& data-rawheight=&355& class=&origin_image zh-lightbox-thumb& width=&836& data-original=&/acd90a2867dec79d257c4d_r.jpg&&第四个强大:各种平台都支持,一键部署。&/b&&br&&br&关于喷unity效果的,我在上图,来证明一下。&br&&img src=&/49dfbb53ee2_b.jpg& data-rawwidth=&1082& data-rawheight=&562& class=&origin_image zh-lightbox-thumb& width=&1082& data-original=&/49dfbb53ee2_r.jpg&&&br&&img src=&/acdfbd41a6edbc26ba86d_b.jpg& data-rawwidth=&1141& data-rawheight=&640& class=&origin_image zh-lightbox-thumb& width=&1141& data-original=&/acdfbd41a6edbc26ba86d_r.jpg&&&img src=&/42aa6a1d77b8b65d3a7585_b.jpg& data-rawwidth=&1139& data-rawheight=&629& class=&origin_image zh-lightbox-thumb& width=&1139& data-original=&/42aa6a1d77b8b65d3a7585_r.jpg&&&img src=&/55eeaab0f72a226aca095_b.jpg& data-rawwidth=&1135& data-rawheight=&639& class=&origin_image zh-lightbox-thumb& width=&1135& data-original=&/55eeaab0f72a226aca095_r.jpg&&&img src=&/46a9727b6dbadbc91bed7d90ae4fcc5b_b.jpg& data-rawwidth=&1136& data-rawheight=&631& class=&origin_image zh-lightbox-thumb& width=&1136& data-original=&/46a9727b6dbadbc91bed7d90ae4fcc5b_r.jpg&&&img src=&/609b2a7eaec235c79c378f390af8e881_b.jpg& data-rawwidth=&1138& data-rawheight=&638& class=&origin_image zh-lightbox-thumb& width=&1138& data-original=&/609b2a7eaec235c79c378f390af8e881_r.jpg&&&img src=&/c138a8fcfa3d8fbd197c374ac4ae8de0_b.jpg& data-rawwidth=&1165& data-rawheight=&625& class=&origin_image zh-lightbox-thumb& width=&1165& data-original=&/c138a8fcfa3d8fbd197c374ac4ae8de0_r.jpg&&&img src=&/0c370e9839cbd67fdfbff135_b.jpg& data-rawwidth=&400& data-rawheight=&367& class=&content_image& width=&400&&&img src=&/353a96fc25c150ba7fe13e7ffff6aed7_b.jpg& data-rawwidth=&400& data-rawheight=&461& class=&content_image& width=&400&&&br&&img src=&/27ba11de7fbacbca91e7959_b.jpg& data-rawwidth=&1000& data-rawheight=&575& class=&origin_image zh-lightbox-thumb& width=&1000& data-original=&/27ba11de7fbacbca91e7959_r.jpg&&&img src=&/52d7a7ffea81d2662792afbf703203ba_b.jpg& data-rawwidth=&700& data-rawheight=&334& class=&origin_image zh-lightbox-thumb& width=&700& data-original=&/52d7a7ffea81d2662792afbf703203ba_r.jpg&&&img src=&/aa57f924acc4_b.jpg& data-rawwidth=&700& data-rawheight=&393& class=&origin_image zh-lightbox-thumb& width=&700& data-original=&/aa57f924acc4_r.jpg&&&img src=&/9f1cf0c6e81b78e4fabe2e8_b.jpg& data-rawwidth=&700& data-rawheight=&334& class=&origin_image zh-lightbox-thumb& width=&700& data-original=&/9f1cf0c6e81b78e4fabe2e8_r.jpg&&&br&&br&&br&这效果是做手游的吗,我也是醉了。估计这是未来手游效果,4k分辨率以上的手机屏。&br&&br&我的新浪微博号:许悍匪 求关注&br&&br&本屌丝才疏学浅,写的不好的地方还请大家见谅。&br&&br&--------------更新------------
----------更新-------- 直接看视频吧:
------要说明unity有多强大得翻出我以前干过的项目了,2004年的时候我想做一个3d的商场。于是设想了一下这个开发工具。下面是我04年百度贴吧的截图。 原文地址: 一个牛逼的创…
&p&这里主要说下Timeline吧~&/p&&p&&br&&/p&&p&&b&曾经&/b&&/p&&p&制作游戏经常会用到剧情系统,就算没有剧情系统也会有即时演算的动画存在。在之前Unity要完成这些工程要么使用剧编插件再搭配摄像机插件,甚至用非常多的状态机来做。而现在Unity3d有了Timeline 和Cinemachine,一切变得容易了很多。&/p&&p&&br&&/p&&p&现在网上的教学资源较少,可以在&a href=&///?target=http%3A//edu.csdn.net/huiyiCourse/detail/453& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&edu.csdn.net/huiyiCours&/span&&span class=&invisible&&e/detail/453&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&看看直播。&/p&&p&我这里下载Timeline_Market的Demo资源,链接在下面,有兴趣的朋友可以下载来研究研究&/p&&p&&a href=&///?target=http%3A///s/1c17OMTM& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&/s/1c17OMT&/span&&span class=&invisible&&M&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a& 密码:s9s1&/p&&p&&br&&/p&&p&我这看完了视频后花了30分钟实践了一下,总的来说不算太难。&/p&&p&&b&现在开始半教学模式~&/b&&/p&&p&首先得有一个Timeline的组件&/p&&img src=&/v2-c772fcbc77d330a742c5fb17a76f36cf_b.png& data-rawwidth=&540& data-rawheight=&660& class=&origin_image zh-lightbox-thumb& width=&540& data-original=&/v2-c772fcbc77d330a742c5fb17a76f36cf_r.png&&&p&&br&&/p&&p&然后给Timeline点击添加一个动画控制&/p&&img src=&/v2-28fb17e91ff1d3875dfe33c725a798ed_b.png& data-rawwidth=&554& data-rawheight=&121& class=&origin_image zh-lightbox-thumb& width=&554& data-original=&/v2-28fb17e91ff1d3875dfe33c725a798ed_r.png&&&p&&br&&/p&&p&这里需要把场景里面的带有Animator组件的物体拖到Track上,这里必要的说明一下,Timeline并不需要动画控制器中的动画状态,那怕空的资源也是可以的。如果是空的Animator组件,可以点击红色录制按钮,像操作动画Animation动画一样的制作动画。&/p&&p&&br&&/p&&img src=&/v2-aa7eb3b5c87d846e041e_b.png& data-rawwidth=&505& data-rawheight=&571& class=&origin_image zh-lightbox-thumb& width=&505& data-original=&/v2-aa7eb3b5c87d846e041e_r.png&&&p&&br&&/p&&p&我们可以右键添加动画Clip,这里的资源是在工程中的。同时添加的动画可以在Timeline中做混合处理&/p&&img src=&/v2-8d4f2aa7bb603bbb970557f_b.png& data-rawwidth=&554& data-rawheight=&185& class=&origin_image zh-lightbox-thumb& width=&554& data-original=&/v2-8d4f2aa7bb603bbb970557f_r.png&&&p&&br&&/p&&p&添加后直接播放的效果:&/p&&br&&img src=&/v2-eff71ddf1e967fef8315a_b.jpg& data-rawwidth=&530& data-rawheight=&602& class=&origin_image zh-lightbox-thumb& width=&530& data-original=&/v2-eff71ddf1e967fef8315a_r.jpg&&&br&&br&&p&&br&&/p&&p&Timeline动画功能搞定~&/p&&p&&br&&/p&&p&&br&&/p&&p&我们还可以自定义脚本:&/p&&img src=&/v2-ee0e7df2a78dc7_b.png& data-rawwidth=&360& data-rawheight=&213& class=&content_image& width=&360&&&p&&br&&/p&&p&然后创建一个 PlayableBehaviour类型的脚本&/p&&img src=&/v2-cdcb4eedfda31eede50b419_b.png& data-rawwidth=&531& data-rawheight=&230& class=&origin_image zh-lightbox-thumb& width=&531& data-original=&/v2-cdcb4eedfda31eede50b419_r.png&&&p&脚本内容如下,主要注意得通过Resolve(playable.GetGraph().GetResolver())方法去获得Timeline传入的值。&/p&&div class=&highlight&&&pre&&code class=&language-csharp&&&span class=&k&&using&/span& &span class=&nn&&System.Collections&/span&&span class=&p&&;&/span&
&span class=&k&&using&/span& &span class=&nn&&System.Collections.Generic&/span&&span class=&p&&;&/span&
&span class=&k&&using&/span& &span class=&nn&&UnityEngine&/span&&span class=&p&&;&/span&
&span class=&k&&using&/span& &span class=&nn&&UnityEngine.Playables&/span&&span class=&p&&;&/span&
&span class=&k&&using&/span& &span class=&nn&&UnityEngine.Timeline&/span&&span class=&p&&;&/span&
&span class=&k&&using&/span& &span class=&nn&&UnityEngine.UI&/span&&span class=&p&&;&/span&
&span class=&k&&public&/span& &span class=&k&&class&/span& &span class=&nc&&NewPlayableAsset&/span& &span class=&p&&:&/span& &span class=&n&&BasicPlayableBehaviour&/span&
&span class=&p&&{&/span&
&span class=&na&&
[Header(&对话框&)]&/span&
&span class=&k&&public&/span& &span class=&n&&ExposedReference&/span&&span class=&p&&&&/span&&span class=&n&&Text&/span&&span class=&p&&&&/span& &span class=&n&&dialog&/span&&span class=&p&&;&/span&
&span class=&k&&private&/span& &span class=&n&&Text&/span& &span class=&n&&_dialog&/span&&span class=&p&&;&/span&
&span class=&na&&
[Multiline(3)]&/span&
&span class=&k&&public&/span& &span class=&kt&&string&/span& &span class=&n&&dialogStr&/span&&span class=&p&&;&/span&
&span class=&k&&public&/span& &span class=&k&&override&/span& &span class=&k&&void&/span& &span class=&nf&&OnGraphStart&/span&&span class=&p&&(&/span&&span class=&n&&Playable&/span& &span class=&n&&playable&/span&&span class=&p&&)&/span&
&span class=&p&&{&/span&
&span class=&n&&_dialog&/span& &span class=&p&&=&/span& &span class=&n&&dialog&/span&&span class=&p&&.&/span&&span class=&n&&Resolve&/span&&span class=&p&&(&/span&&span class=&n&&playable&/span&&span class=&p&&.&/span&&span class=&n&&GetGraph&/span&&span class=&p&&().&/span&&span class=&n&&GetResolver&/span&&span class=&p&&());&/span&
&span class=&p&&}&/span&
&span class=&k&&public&/span& &span class=&k&&override&/span& &span class=&k&&void&/span& &span class=&nf&&OnBehaviourPlay&/span&&span class=&p&&(&/span&&span class=&n&&Playable&/span& &span class=&n&&playable&/span&&span class=&p&&,&/span& &span class=&n&&FrameData&/span& &span class=&n&&info&/span&&span class=&p&&)&/span&
&span class=&p&&{&/span&
&span class=&n&&_dialog&/span&&span class=&p&&.&/span&&span class=&n&&gameObject&/span&&span class=&p&&.&/span&&span class=&n&&SetActive&/span&&span class=&p&&(&/span&&span class=&k&&true&/span&&span class=&p&&);&/span&
&span class=&n&&_dialog&/span&&span class=&p&&.&/span&&span class=&n&&text&/span& &span class=&p&&=&/span& &span class=&n&&dialogStr&/span&&span class=&p&&;&/span&
&span class=&p&&}&/span&
&span class=&k&&public&/span& &span class=&k&&override&/span& &span class=&k&&void&/span& &span class=&nf&&OnBehaviourPause&/span&&span class=&p&&(&/span&&span class=&n&&Playable&/span& &span class=&n&&playable&/span&&span class=&p&&,&/span& &span class=&n&&FrameData&/span& &span class=&n&&info&/span&&span class=&p&&)&/span&
&span class=&p&&{&/span&
&span class=&k&&if&/span& &span class=&p&&(&/span&&span class=&n&&_dialog&/span&&span class=&p&&)&/span&
&span class=&p&&{&/span&
&span class=&n&&_dialog&/span&&span class=&p&&.&/span&&span class=&n&&gameObject&/span&&span class=&p&&.&/span&&span class=&n&&SetActive&/span&&span class=&p&&(&/span&&span class=&k&&false&/span&&span class=&p&&);&/span&
&span class=&p&&}&/span&
&span class=&p&&}&/span&
&span class=&p&&}&/span&
&/code&&/pre&&/div&&p&然后和动画一样插入Track后可以看到下方的属性是我们可以编辑的了。&/p&&img src=&/v2-1cdad4886feaf14c5da6a9d829cff155_b.png& data-rawwidth=&317& data-rawheight=&458& class=&content_image& width=&317&&&p&做一个文本变换的效果:&/p&&br&&img src=&/v2-83f5b1e5e4e90e107da91_b.jpg& data-rawwidth=&643& data-rawheight=&593& class=&origin_image zh-lightbox-thumb& width=&643& data-original=&/v2-83f5b1e5e4e90e107da91_r.jpg&&&br&&br&&p&脚本自定义功能也完成~&/p&&p&&br&&/p&&p&之后修改成条件触发判定,不在是直接播放游戏就开始运行&/p&&img src=&/v2-acaef1afa57db_b.png& data-rawwidth=&309& data-rawheight=&159& class=&content_image& width=&309&&&p&&br&&/p&&p&做了一个触发的脚本功能&/p&&div class=&highlight&&&pre&&code class=&language-csharp&&&span class=&k&&using&/span& &span class=&nn&&System.Collections&/span&&span class=&p&&;&/span&
&span class=&k&&using&/span& &span class=&nn&&System.Collections.Generic&/span&&span class=&p&&;&/span&
&span class=&k&&using&/span& &span class=&nn&&UnityEngine&/span&&span class=&p&&;&/span&
&span class=&k&&using&/span& &span class=&nn&&UnityEngine.Timeline&/span&&span class=&p&&;&/span&
&span class=&k&&using&/span& &span class=&nn&&UnityEngine.Playables&/span&&span class=&p&&;&/span&
&span class=&k&&public&/span& &span class=&k&&class&/span& &span class=&nc&&StoryControl&/span& &span class=&p&&:&/span& &span class=&n&&MonoBehaviour&/span&
&span class=&p&&{&/span&
&span class=&k&&public&/span& &span class=&kt&&bool&/span& &span class=&n&&isTrigger&/span&&span class=&p&&;&/span&
&span class=&k&&public&/span& &span class=&n&&GameObject&/span& &span class=&n&&ui_tip&/span&&span class=&p&&;&/span&
&span class=&k&&public&/span& &span class=&n&&PlayableDirector&/span& &span class=&n&&playableDirector&/span&&span class=&p&&;&/span&
&span class=&k&&public&/span& &span class=&k&&void&/span& &span class=&nf&&OnTriggerEnter&/span&&span class=&p&&(&/span&&span class=&n&&Collider&/span& &span class=&n&&other&/span&&span class=&p&&)&/span&
&span class=&p&&{&/span&
&span class=&k&&if&/span& &span class=&p&&(&/span&&span class=&n&&other&/span&&span class=&p&&.&/span&&span class=&n&&gameObject&/span&&span class=&p&&.&/span&&span class=&n&&name&/span& &span class=&p&&==&/span& &span class=&s&&&Trigger&&/span&&span class=&p&&)&/span&
&span class=&p&&{&/span&
&span class=&n&&ui_tip&/span&&span class=&p&&.&/span&&span class=&n&&gameObject&/span&&span class=&p&&.&/span&&span class=&n&&SetActive&/span&&span class=&p&&(&/span&&span class=&k&&true&/span&&span class=&p&&);&/span&
&span class=&n&&isTrigger&/span& &span class=&p&&=&/span& &span class=&k&&true&/span&&span class=&p&&;&/span&
&span class=&p&&}&/span&
&span class=&p&&}&/span&
&span class=&k&&public&/span& &span class=&k&&void&/span& &span class=&nf&&OnTriggerExit&/span&&span class=&p&&(&/span&&span class=&n&&Collider&/span& &span class=&n&&other&/span&&span class=&p&&)&/span&
&span class=&p&&{&/span&
&span class=&k&&if&/span& &span class=&p&&(&/span&&span class=&n&&other&/span&&span class=&p&&.&/span&&span class=&n&&gameObject&/span&&span class=&p&&.&/span&&span class=&n&&name&/span& &span class=&p&&==&/span& &span class=&s&&&Trigger&&/span&&span class=&p&&)&/span&
&span class=&p&&{&/span&
&span class=&n&&ui_tip&/span&&span class=&p&&.&/span&&span class=&n&&gameObject&/span&&span class=&p&&.&/span&&span class=&n&&SetActive&/span&&span class=&p&&(&/span&&span class=&k&&false&/span&&span class=&p&&);&/span&
&span class=&n&&isTrigger&/span& &span class=&p&&=&/span& &span class=&k&&true&/span&&span class=&p&&;&/span&
&span class=&p&&}&/span&
&span class=&p&&}&/span&
&span class=&k&&public&/span& &span class=&k&&void&/span& &span class=&nf&&Update&/span&&span class=&p&&()&/span&
&span class=&p&&{&/span&
&span class=&k&&if&/span& &span class=&p&&(&/span&&span class=&n&&isTrigger&/span&&span class=&p&&)&/span&
&span class=&p&&{&/span&
&span class=&k&&if&/span& &span class=&p&&(&/span&&span class=&n&&Input&/span&&span class=&p&&.&/span&&span class=&n&&GetKeyDown&/span&&span class=&p&&(&/span&&span class=&n&&KeyCode&/span&&span class=&p&&.&/span&&span class=&n&&E&/span&&span class=&p&&))&/span&
&span class=&p&&{&/span&
&span class=&n&&playableDirector&/span&&span class=&p&&.&/span&&span class=&n&&Play&/span&&span class=&p&&();&/span&
&span class=&p&&}&/span&
&span class=&p&&}&/span&
&span class=&p&&}&/span&
&span class=&p&&}&/span&
&/code&&/pre&&/div&&p&之后我们可以运行看效果了:&/p&&br&&img src=&/v2-3c4d8f577f0f10a2f72b_b.jpg& data-rawwidth=&646& data-rawheight=&597& class=&origin_image zh-lightbox-thumb& width=&646& data-original=&/v2-3c4d8f577f0f10a2f72b_r.jpg&&&br&&br&&p&&br&&/p&&p&最后还有一个Cinemachine插件和Timeline的结合(Cinemachine的作者投靠了Unity),这个插件可以在AssetStore上免费下载。&/p&&p&首先添加&/p&&img src=&/v2-4edaa289e56fe4fd0f0a_b.png& data-rawwidth=&565& data-rawheight=&223& class=&origin_image zh-lightbox-thumb& width=&565& data-original=&/v2-4edaa289e56fe4fd0f0a_r.png&&&p&创建摄像机后设置,具体Cinemachine的功能这里不多介绍了,一款非常不错的专业摄像机控制插件。&/p&&img src=&/v2-34a78c1de20f0fefeeef_b.png& data-rawwidth=&285& data-rawheight=&383& class=&content_image& width=&285&&&p&顺便将主角屏蔽掉,通过ActivationTrack的功能&/p&&img src=&/v2-734e1bd4a5e12_b.png& data-rawwidth=&955& data-rawheight=&119& class=&origin_image zh-lightbox-thumb& width=&955& data-original=&/v2-734e1bd4a5e12_r.png&&&p&最后是这样的效果&/p&&br&&img src=&/v2-ac512ff38d76f9c25dc607_b.jpg& data-rawwidth=&787& data-rawheight=&545& class=&origin_image zh-lightbox-thumb& width=&787& data-original=&/v2-ac512ff38d76f9c25dc607_r.jpg&&&br&&br&&p&&br&&/p&&p&&b&总结&/b&&/p&&p&现在相关教学还是太少,希望Timeline能在更多的项目中运用起来。毕竟更加好用专业的工具能带来效率和质量的提升,如果只是升级Unity版本,而不去了解更新的功能还不如继续保持旧版本的稳定。&/p&&p&关于Timeline的学习,
感兴趣的可以来我们游戏开发交流群:,互相交流~&/p&
这里主要说下Timeline吧~ 曾经制作游戏经常会用到剧情系统,就算没有剧情系统也会有即时演算的动画存在。在之前Unity要完成这些工程要么使用剧编插件再搭配摄像机插件,甚至用非常多的状态机来做。而现在Unity3d有了Timeline 和Cinemachine,一切变得容易了…
你说的这个东西一点都不新鲜,而且已经被历史证明是失败的——它就是任天的WIIU的运行原理。&br&&br&WIIU就是主机运行游戏,然后投射到带显示器的手柄上。&br&&br&而微软走的更远,即所谓的云游戏概念——玩家的输入指令通过XBOX ONE传递给微软服务器,游戏本身运行在微软的大型机上,能实现好莱坞电影级别的画面,将压缩后的视频流传递给玩家的屏幕。我觉得这个方案在商业上基本属于是幻觉,但是技术上确实可行。&br&&br&“解决了目前大部分游戏不支持Linux的问题”,哪有这回事?&b&你还是需要原来的主机——不管是PC还是MAC——来运行游戏本身,STEAM本身的兼容性仍然是0,而且永远都会是0。&/b&你觉得大多数人是愿意不花钱把主机搬到另一个房间,还是再花几百买STEAM?&br&&br&这东西甚至还不如老式的游戏机,PS3只要视频用无线HDMI输出到电视上,手柄就用原来的,照样也能实现在隔壁玩游戏。&br&&br&串流技术最大的潜力,是单主机运行多个进程,然后通过无线网络分配给几个玩家,可以实现一台主机供多人玩不同的游戏,STEAM就相当于当年的NETPC终端。&br&&br&我是希望,看不起传统主机游戏的行业新贵们,能稍微花点时间,学习一下游戏史。&b&我这些年看到的新兴游戏业的所谓“创新”,九成都来自抄袭者出生前的某个古董产品。&/b&重新发明轮子还好,重新发明三角形的轮子,那就是有病了。&br&&br&&img data-rawheight=&533& data-rawwidth=&800& src=&/b6dc85c0b10a510a8e7ed8ff_b.jpg& class=&origin_image zh-lightbox-thumb& width=&800& data-original=&/b6dc85c0b10a510a8e7ed8ff_r.jpg&&
你说的这个东西一点都不新鲜,而且已经被历史证明是失败的——它就是任天的WIIU的运行原理。 WIIU就是主机运行游戏,然后投射到带显示器的手柄上。 而微软走的更远,即所谓的云游戏概念——玩家的输入指令通过XBOX ONE传递给微软服务器,游戏本身运行在微软…
来使用哥开发的slua吧,
&a href=&///?target=http%3A//www.slua.net& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://www.&/span&&span class=&visible&&slua.net&/span&&span class=&invisible&&&/span&&i class=&icon-external&&&/i&&/a&&br&&br&开源, 和ulua相比快的没有朋友,
没有反射,没有额外gc alloc,采用静态代码生成, 可以用于游戏核心逻辑, 完整支持4.6+ UI系统.&br&&br&同ulua/tolua的性能对比,请看这里 &a href=&///?target=http%3A///post/164& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&slua benchmark&i class=&icon-external&&&/i&&/a&&br&&br&20万次 测试用例 数据如下(slua0.6 vs cstolua1.7, slua0.7再次飙升速度)&br&&img src=&/42f688af7ec13ef59bd9d_b.jpg& data-rawwidth=&650& data-rawheight=&285& class=&origin_image zh-lightbox-thumb& width=&650& data-original=&/42f688af7ec13ef59bd9d_r.jpg&&&br&slua 0.6 对比 slua 0.7&br&&img src=&/7da4d8bf3f433bcac5d5ced25f9c1879_b.jpg& data-rawwidth=&649& data-rawheight=&324& class=&origin_image zh-lightbox-thumb& width=&649& data-original=&/7da4d8bf3f433bcac5d5ced25f9c1879_r.jpg&&&br&&br&主要功能如下:&ul&&li&速度就是快, 这是slua的核心目标&/li&&li&避免额外gc alloc, 去掉性能杀手&/li&&li&90%以上UnityEngine接口导出(主要去掉了flash,平台相关的接口);&/li&&li&100% UnityEngine.UI接口导出 (4.6+ 版本)&/li&&li&支持UnityEvent/UnityAction, 使用lua function&/li&&li&支持delegation,使用lua function (支持iOS)&/li&&li&支持coroutine&/li&&li&支持导出自定义类&/li&&li&所有enum导出为number&/li&&li&所有数组返回值导出为lua table&/li&&li&使用luajit 64bit(完整支持armv7,armv7s,arm64), 可用lua5.3替换&/li&&li&支持il2cpp/il2cpp 64&/li&&/ul&
来使用哥开发的slua吧,
开源, 和ulua相比快的没有朋友, 没有反射,没有额外gc alloc,采用静态代码生成, 可以用于游戏核心逻辑, 完整支持4.6+ UI系统. 同ulua/tolua的性能对比,请看这里
20万次 测试用例 数据如下(slua0.…
&p&&b&本文基于Unity 5.3版本的3D物理和C#语言,服用前请注意本文未必适用于其他的版本。&/b&&/p&&p&(对于2D的情形,Unity 5可以使用Point Effector实现)&/p&&p&========================================================================&/p&&br&&p&&b&&u&前言&/u&&/b&&/p&&br&&p&我们知道在诸如Unity此类的游戏引擎中,游戏内物体是已经有现成的力与运动的物理模型的。我们可以调用相关的API来对物体施力(比如Unity的AddForce),获取坐标等。因此在引入万有引力,磁场力等物体的相互作用时,只要了解力的结算公式和作用方式,即可通过在每帧用脚本进行力的结算和施加,来实现这些物理上的效果。&/p&&br&&p&此外,作为一个游戏开发者,出于游戏需求经常会被要求模拟一些其他领域的现象与原理。我们应当始终保持一种学习的心态来获取其他领域的经验与知识,但也要记住我们的初衷-“在游戏中实现”。每当我们遇到这样的问题时,获取知识的同时也要在大脑中思考,如何在你所用的引擎中实现这些效果,以及你要追求的是什么,是正确,还是效率。&/p&&br&&p&&b&追求正确&/b&需要以最贴合公式的方式进行结算,并且需要考虑到各类极限情况。在为信息安全,航空航天等精密领域开发软件时,正确性无疑是非常关键的。&/p&&br&&p&&b&追求效率&/b&则是优先保证资源分配效率的情况下,允许牺牲一部分正确性。这个效率既可以是指开发成本,比如一些游戏使用静态模型动画替代布娃娃系统;也可以指运行效率,比如多数游戏物理所采用的牛顿力学而忽略相对论性效应和量子力学效应;两者都是的情况也有,比如WoW中投射物动画与游戏逻辑的分离。这都是在资源有限情况下所侧重的一种决策。&/p&&br&&p&在游戏开发中,我们会经常遇到这样的抉择。由于绝大多数游戏是为用户打造的,我们更多时候会考虑实现效率。当然也有诸如Kerbal Space Program这样相对更加追求正确性的游戏存在,但毕竟是特例,是由游戏定位所决定的。&/p&&br&&p&&b&&u&基本物理知识与思路&/u&&/b&&/p&&br&&p&要实现磁体吸引与排斥的功能,先得补习一点物理知识。&/p&&blockquote&&b&磁性&/b&是物质响应&a href=&///?target=https%3A//zh.wikipedia.org/wiki/%25E7%25A3%%25A0%25B4& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&磁场&i class=&icon-external&&&/i&&/a&作用的属性。每一种物质或多或少地会被磁场影响。&a href=&///?target=https%3A//zh.wikipedia.org/wiki/%25E9%%25E7%25A3%%& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&铁磁性&i class=&icon-external&&&/i&&/a&是最强烈、最为人知的一种磁性。由于具有&a href=&///?target=https%3A//zh.wikipedia.org/wiki/%25E9%%25E7%25A3%%& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&铁磁性&i class=&icon-external&&&/i&&/a&,&a href=&///?target=https%3A//zh.wikipedia.org/wiki/%25E7%25A3%%259F%25B3& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&磁石&i class=&icon-external&&&/i&&/a&或磁铁会产生&a href=&///?target=https%3A//zh.wikipedia.org/wiki/%25E7%25A3%%25A0%25B4& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&磁场&i class=&icon-external&&&/i&&/a&。另外,&a href=&///?target=https%3A//zh.wikipedia.org/wiki/%25E9%25A0%%25A3%%& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&顺磁性&i class=&icon-external&&&/i&&/a&物质会趋向于朝着磁场较强的区域移动,即被磁场吸引;&a href=&///?target=https%3A//zh.wikipedia.org/wiki/%25E5%258F%258D%25E7%25A3%%& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&反磁性&i class=&icon-external&&&/i&&/a&物质则会趋向于朝着磁场较弱的区域移动,即被磁场排斥;还有一些物质会与磁场有更复杂的关系,例如,&a href=&///?target=https%3A//zh.wikipedia.org/wiki/%25E8%2587%25AA%25E6%E7%258E%25BB%25E7%& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&自旋玻璃&i class=&icon-external&&&/i&&/a&的性质、&a href=&///?target=https%3A//zh.wikipedia.org/wiki/%25E5%258F%258D%25E9%E7%25A3%%& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&反铁磁性&i class=&icon-external&&&/i&&/a&等等。外磁场对于某些物质的影响非常微弱。&/blockquote&&p&来源:&a href=&///?target=https%3A//zh.wikipedia.org/wiki/%25E7%25A3%2581& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&zh.wikipedia.org/wiki/%&/span&&span class=&invisible&&E7%A3%81&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&/p&&blockquote&磁单极子
磁单极子是一种假想的&a href=&///?target=https%3A//zh.wikipedia.org/wiki/%25E7%25B2%%25AD%2590& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&粒子&i class=&icon-external&&&/i&&/a&(或粒子类),这粒子只拥有一个磁极(指北极或指南极)。换句话说,类似带电粒子的拥有电荷,磁单极子拥有&a href=&///?target=https%3A//zh.wikipedia.org/wiki/%25E7%25A3%%258D%25B7& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&磁荷&i class=&icon-external&&&/i&&/a&。&br&现今,对于这概念的兴趣大多出自于&a href=&///?target=https%3A//zh.wikipedia.org/wiki/%25E7%25B2%%25AD%%%25E7%E5%25AD%25B8& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&粒子物理学&i class=&icon-external&&&/i&&/a&,特别值得注意的是&a href=&///?target=https%3A//zh.wikipedia.org/wiki/%25E5%25A4%25A7%25E7%25BB%259F%25E4%25B8%%E8%25AE%25BA& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&大统一理论&i class=&icon-external&&&/i&&/a&和&a href=&///?target=https%3A//zh.wikipedia.org/wiki/%25E8%25B6%%25BC%25A6%25E7%E8%25AB%2596& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&超弦理论&i class=&icon-external&&&/i&&/a&,关于磁单极子的存在或可能性,它们做了很多预测,因而激发出许多物理学者寻找磁单极子的强烈兴趣。但尽管竭尽全力,物理学者至今仍旧无法观察到任何磁单极子的蛛丝马迹&br&永久磁铁的磁场
永久磁铁的磁场比较复杂,特别是在磁铁附近。一个微小条形磁铁的磁场与其&a href=&///?target=https%3A//zh.wikipedia.org/wiki/%25E7%25A3%%259F%25A9& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&磁矩&i class=&icon-external&&&/i&&/a&成正比,也会与磁铁的&a href=&///?target=https%3A//zh.wikipedia.org/wiki/%25E5%25AE%259A%25E5%& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&定向&i class=&icon-external&&&/i&&/a&有关。当尺寸驱向无穷小极限时,磁铁可以理想化成为磁偶极子,以方程表示,这微小条形磁铁(磁偶极子)产生的磁场为&br&有时候,磁铁与磁铁之间感受到的磁力和力矩,可以采用“磁极模型”来计算,磁极与磁极之间会互相吸引或互相排斥,就好像电荷与电荷之间的&a href=&///?target=https%3A//zh.wikipedia.org/wiki/%25E5%25BA%%25BC%25A6%25E5%258A%259B& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&库伦力&i class=&icon-external&&&/i&&/a&。很可惜地,磁极模型不能正确地反映出磁铁内部的真实状况(请参阅&a href=&///?target=https%3A//zh.wikipedia.org/wiki/%25E9%%25E7%25A3%%& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&铁磁性&i class=&icon-external&&&/i&&/a&)。科学家尚未找到磁荷存在的实证。磁铁的指北极与指南极无法被分离;任何分离动作会造成两个子磁铁,各自拥有自己的指北极与指南极。磁极模型无法解释电流产生的磁场,也无法解释移动于磁场中的电荷所感受到的&a href=&///?target=https%3A//zh.wikipedia.org/wiki/%25E5%258B%259E%25E4%25BE%%258C%25B2%25E5%258A%259B& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&洛伦兹力&i class=&icon-external&&&/i&&/a&。&br&更正确地描述磁性,涉及了计算广泛分布于磁铁内部的原子尺寸载流循环所产生的磁场。&/blockquote&&p&来源:&a href=&///?target=https%3A//zh.wikipedia.org/wiki/%25E7%25A3%%25A0%25B4& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&zh.wikipedia.org/wiki/%&/span&&span class=&invisible&&E7%A3%81%E5%A0%B4&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&/p&&br&&p&为什么我只关心这三项?因为作为一个物理苦手,哦不,游戏程序员(其实我是设计师啊设计师啊),我并不关心磁场强度是怎么计算的,也不关心磁单极子是否存在。就算把整个物理公式都照搬进来,有效率的在游戏中模拟也难度非常高,并不符合实际。&/p&&br&&p&对于游戏需求而言,最常见的是顺磁性,反磁性和铁磁性。我这里只做&b&铁磁性&/b&(Magnetic)和&b&顺磁性&/b&(Paramagnetic),对应磁铁和被磁铁吸引的物体。如果你想加反磁性,只需要修改顺磁性的代码,把力的方向反过来就能做到了。&/p&&br&&p&我的思路就是,类似于磁极模型,&b&把磁场力的相互作用全部简化为磁单极之间的作用&/b&。在一定范围内,这样模拟出来的效果常人是很难分辨的。&/p&&p&事实上,我只关心这里出现在分母的r三次方项。这r^3告诉了我,磁场内某一点的&b&磁感应强度和相对距离的3次方成反比&/b&。具体的常数可以根据游戏内容和代码相关进行微调。&/p&&br&&p&========================================================================&/p&&p&&b&&u&场景准备工作&/u&&/b&&/p&&br&&p&首先,我们先给这个Unity的物理世界加入两种新成员:顺磁性物体(Paramagnetic),铁磁性物体(Magnetic)。为它们制作带有标示性的标签。&/p&&img src=&/0b3d14f3e3d111f39bce5b1e9fb6e62e_b.jpg& data-rawwidth=&199& data-rawheight=&49& class=&content_image& width=&199&&&br&&p&然后便是最简单最容易想到的顺磁性物体:硬币&/p&&img src=&/873c953adacccb3eb2ee20_b.jpg& data-rawwidth=&307& data-rawheight=&412& class=&content_image& width=&307&&&br&&p&请原谅我没有添加金属材质,这并不是重点。&/p&&br&&p&这个硬币最重要的就是Rigidbody和Tag了&/p&&img src=&/8cd20b2b729c8_b.jpg& data-rawwidth=&305& data-rawheight=&641& class=&content_image& width=&305&&&p&注意Continuous Dynamic可以防止因瞬时速度太快而导致的碰撞失效。&/p&&br&&p&稀松平常的硬币,由压扁的圆柱体制成。加上Rigidbody和标签,这样就算完工了。&/p&&br&&p&做成Prefab吧。&/p&&br&&p&接下来做一个磁铁吧。&/p&&img src=&/89a155ec35baa0c0b0f4a4f813de3abe_b.jpg& data-rawwidth=&418& data-rawheight=&334& class=&content_image& width=&418&&&br&&br&&p&注意我用的是红色长方体(North Bar)加蓝色长方体(South Bar)拼成的,为了区分N极与S极。&/p&&img src=&/cd0abc03d81efbe42310fc_b.jpg& data-rawwidth=&304& data-rawheight=&491& class=&content_image& width=&304&&&br&&p&不要忘记标签。&/p&&br&&p&重点解释一下磁铁下的两个Empty Object:North Pole & South Pole&/p&&img src=&/96b7eab689f527c58b18863_b.jpg& data-rawwidth=&830& data-rawheight=&503& class=&origin_image zh-lightbox-thumb& width=&830& data-original=&/96b7eab689f527c58b18863_r.jpg&&&img src=&/8cdcdcdd02b6d06fe47ffdb_b.jpg& data-rawwidth=&317& data-rawheight=&250& class=&content_image& width=&317&&&img src=&/1bccb85cda6e_b.jpg& data-rawwidth=&843& data-rawheight=&436& class=&origin_image zh-lightbox-thumb& width=&843& data-original=&/1bccb85cda6e_r.jpg&&&br&&p&这两个抽象的点,便是铁磁性物体的&b&磁极&/b&。&/p&&p&这里用了物理学终极大法:&u&简化为质点法&/u&,把所有磁性物体的相互作用都看作磁单极点的相互作用,一会的Script便可以用到它们(作为NP和SP)。&/p&&p&&b&注意:一定要把磁极藏在物体里面,否则会导致外部物体和裸磁极接触后果自负!&/b&&/p&&p&其实也没那么严重,具体请参照下面脚本里,如果有像范例的脚本里一样限制最小距离的话,也不用担心和裸磁极接触直接弹飞的问题。&/p&&br&&p&这样还没完,还得做出“磁场”这个物体。&/p&&img src=&/8bf596abeb_b.jpg& data-rawwidth=&570& data-rawheight=&424& class=&origin_image zh-lightbox-thumb& width=&570& data-original=&/8bf596abeb_r.jpg&&&br&&p&根据需要来做,我这里用一个Capsule型的Trigger Collider代替了。&/p&&p&要避免bug的话,推荐大一点,要注重性能的话,推荐小一点。&/p&&img src=&/41bef716fdafc24b7634f_b.jpg& data-rawwidth=&308& data-rawheight=&177& class=&content_image& width=&308&&&br&&p&注意勾上Trigger,这样不会错误的被认为是物体本身的碰撞体。&/p&&p&完成以后,做成Prefab。&/p&&br&&p&这里“磁场”的意义是,规定相互作用的最大范围。&/p&&p&i.e. 任何超出这个范围的物体均不在相互作用的考量范围内,有点类似希尔球的概念。&/p&&br&&br&&p&这样场景编辑器里的工作就暂时完成了,我们得到了两个Prefab:硬币,以及条形磁铁。&/p&&p&========================================================================&/p&&p&&b&&u&脚本编写&/u&&/b&&/p&&br&&p&在准备编写的时候,先得理清楚思路。比如“我们现在有了什么,我们要脚本实现的是什么”。&/p&&p&我们已经有了铁磁性物体和顺磁性物体的Prefab,铁磁性物体也有了两个磁单极点和磁场。&/p&&p&我们现在需要一个铁磁性物体的脚本,来对磁场内的物体施加作用力,即磁场力。&/p&&br&&p&在磁场中的物体受到的磁场力应该取决于如下几个因素:&/p&&p&-物体与磁铁磁极的&b&位移距离&/b&,的三次方,成反比(根据开头的物理知识)&/p&&p&-物体的&b&“磁导率”&/b&。(物体对磁铁越友好,受到磁力越大)&/p&&p&-磁铁的&b&“磁场强度”&/b&。(磁铁的强度越高,能施加的磁力越大)&/p&&p&-作为上帝,哦不,游戏程序员所必需的,&b&一个磁常数项&/b&,用于根据实际结果调整大小。&/p&&p&&b&上述简化做法来自生活经验,同物理学公式存在出入,请勿当作物理学知识运用!&/b&&/p&&br&&p&为此我们可以先做出一个吸引顺磁性物体的脚本,然后进一步细化到铁磁性物体的相互作用。&/p&&br&&p&&u&磁铁脚本开头声明部分:&/u&&/p&&br&&br&&p&现在为条形磁铁添加一个脚本吧(这个脚本也应该适用于所有带有铁磁性的物体):&/p&&div class=&highlight&&&pre&&code class=&language-text&&using UnityE
using System.C
public class MagneticField : MonoBehaviour {
public GameObject NP;
public GameObject SP;
private static float mu0 = 10.0f;
// Use this for initialization
void Awake () {
rb = GetComponent&Rigidbody& ();
&/code&&/pre&&/div&&img src=&/ff1f0ec04afce67af56b0c_b.jpg& data-rawwidth=&379& data-rawheight=&216& class=&content_image& width=&379&&&p&NP:该磁铁的N极。&/p&&p&SP:该磁铁的S极。&/p&&p&mu0:磁常数项。&/p&&p&strength:该磁铁的“磁场强度”。&/p&&p&rb:读取并记录该物体的rigidbody,便于后续频繁的使用。&/p&&img src=&/5d7bbaf915edc374aec2b_b.jpg& data-rawwidth=&305& data-rawheight=&96& class=&content_image& width=&305&&&p&回到场景编辑器中,将条形磁铁附属的两个磁极分别拖拽连接到对应的位置,并设定磁化强度。&/p&&br&&br&&br&&p&&u&磁铁同磁场内顺磁性物体交互的部分:&/u&&/p&&br&&p&我们之前设定了一个Trigger Collider作为磁场最大范围,现在可以直接用OnTriggerStay来编写每一帧的同磁场范围内的物体的相互作用。&/p&&br&&p&&b&这里我为了简化操作避免给顺磁性物体添加脚本,直接用质量代替了物体的“磁导率”&/b&。&b&如果你有实际应用的需求,可以更改代码里的相关项目,并为物体加上对应的脚本和属性来实现。&/b&&/p&&div class=&highlight&&&pre&&code class=&language-text&&// Range of magnetic field
void OnTriggerStay (Collider other) {
Rigidbody other_rb = other.gameObject.GetComponent&Rigidbody& ();
// check the tag of object
if (other.gameObject.tag == &Paramagnetic&) {
Vector3 r_n = other.gameObject.transform.position - NP.transform. // displacement vector
Vector3 r_s = other.gameObject.transform.position - SP.transform. // displacement vector
float mu = Time.fixedDeltaTime * strength * mu0 * other_rb.
// Calculate Force towards magnetic poles
Vector3 f_n =
(r_n.normalized) * mu /
(Mathf.Pow (Mathf.Max(r_n.magnitude, 0.2f), 3));
Vector3 f_s =
(r_s.normalized) * mu /
(Mathf.Pow (Mathf.Max(r_s.magnitude, 0.2f), 3));
// 截图中此处debug请无视
// Apply attracting force to other object
other_rb.AddForce (
-1f * f_n);
other_rb.AddForce (
-1f * f_s);
// Apply attracting force to magnetic object
rb.AddForceAtPosition (
NP.transform.position);
rb.AddForceAtPosition (
SP.transform.position);
&/code&&/pre&&/div&&br&&img src=&/ce2e4cebe4_b.jpg& data-rawwidth=&823& data-rawheight=&499& class=&origin_image zh-lightbox-thumb& width=&823& data-original=&/ce2e4cebe4_r.jpg&&&p&other_rb:同该磁铁相互作用的目标物体的rigidbody。&/p&&p&r_n:从北磁极到目标物体的矢量位移。&/p&&p&r_s:从南磁极到目标物体的矢量位移。&/p&&p&mu:由每帧间隔时间,磁铁的磁场强度,目标物体的磁导率(在这里用了质量)以及磁常数共同决定的一个公式系数。&/p&&p&f_n:北磁极对物体施加的矢量力。&/p&&p&f_s:南磁极对物体施加的矢量力。&/p&&br&&p&磁场力的大小最终为mu值除以距离的三次方。力的方向自然是位移的方向。&/p&&br&&p&我这里限定了位移距离的标量大小不小于一个特定值(如0.2),否则分母在接近0的时候会出现磁力过大弹飞物体的问题。电脑物理引擎每帧间隔都相对比较长,因此要考虑到这点。&/p&&br&&p&此外要注意我&b&不只为被吸引的物体加了吸引力,还为磁铁的磁极加了一个相反方向的力&/b&。&/p&&p&这是因为:&/p&&blockquote&&b&牛顿第三运动定律&/b&&br&To every action there is always opposed an equal reaction: or the mutual actions of two bodies upon each other are always equal, and directed to contrary parts.
&br&每一个作用力都对应着一个相等反抗的反作用力:也就是说,两个物体彼此施加于对方的力总是大小相等、方向相反。&/blockquote&&p&&a href=&///?target=https%3A//zh.wikipedia.org/wiki/%25E7%E9%25A1%25BF%25E7%25AC%25AC%25E4%25B8%%25BF%%258A%25A8%25E5%25AE%259A%25E5%25BE%258B& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&zh.wikipedia.org/wiki/%&/span&&span class=&invisible&&E7%89%9B%E9%A1%BF%E7%AC%AC%E4%B8%89%E8%BF%90%E5%8A%A8%E5%AE%9A%E5%BE%8B&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&/p&&br&&p&有了这个脚本,目前场景内的磁铁应该已经可以吸引硬币了。&/p&&p&你可以加一点简单的控制脚本来帮助测试,并且调整对应的常数值来观察物体相互作用的变化,以达到你自己的预期要求。&/p&&br&&p&&u&磁铁同磁场内其他磁铁交互的部分:&/u&&/p&&p&上一步的脚本只做了针对带有“Paramagnetic”标签的物体的相互作用,现在我们来做对于“Magnetic”的物体,也就是其他磁铁,的相互作用。把之前的if 部分改到下列代码的else if部分即可。&/p&&div class=&highlight&&&pre&&code class=&language-text&&if (other.gameObject.tag == &Magnetic&) {
MagneticField other_script = other.gameObject.GetComponent&MagneticField& ();
GameObject other_NP = other_script.NP;
GameObject other_SP = other_script.SP;
Vector3 r_n_n = other_NP.transform.position - NP.transform. // from this(N) to that(N)
Vector3 r_s_s = other_SP.transform.position - SP.transform. // from this(S) to that(S)
Vector3 r_n_s = other_SP.transform.position - NP.transform. // from this(N) to that(S)
Vector3 r_s_n = other_NP.transform.position - SP.transform. // from this(S) to that(N)
float other_strength = other_script.
// Calculate Force towards magnetic poles
float mu = Time.fixedDeltaTime * strength * other_
Vector3 f_n_n = // from this(N) to that(N)
(r_n_n.normalized) * mu /
(Mathf.Pow (Mathf.Max(r_n_n.magnitude, 0.2f), 3));
Vector3 f_s_s = // from this(S) to that(S)
(r_s_s.normalized) * mu /
(Mathf.Pow (Mathf.Max(r_s_s.magnitude, 0.2f), 3));
Vector3 f_n_s = // from this(N) to that(S)
(r_n_s.normalized) * mu /
(Mathf.Pow (Mathf.Max(r_n_s.magnitude, 0.2f), 3));
Vector3 f_s_n = // from this(S) to that(N)
(r_s_n.normalized) * mu /
(Mathf.Pow (Mathf.Max(r_s_n.magnitude, 0.2f), 3));
//截图中此处的Debug请无视
// Apply Rejecting Force
other_rb.AddForceAtPosition (
1f * f_n_n,
other_NP.transform.position);
other_rb.AddForceAtPosition (
1f * f_s_s,
other_SP.transform.position);
// Apply Attracting Force
other_rb.AddForceAtPosition (
-1f * f_n_s,
other_SP.transform.position);
other_rb.AddForceAtPosition (
-1f * f_s_n,
other_NP.transform.position);
&/code&&/pre&&/div&&br&&img src=&/90c832adc5a77bcbb76a_b.jpg& data-rawwidth=&833& data-rawheight=&697& class=&origin_image zh-lightbox-thumb& width=&833& data-original=&/90c832adc5a77bcbb76a_r.jpg&&&p&相比顺磁性的物体来说,两个铁磁性物体的交互则稍许多了点变量和运算量。&/p&&br&&p&other_rb:同该磁铁相互作用的目标磁铁的rigidbody。&/p&&p&other_script:目标磁铁下属的这个脚本。用于获取该物体同脚本连接的public变量。&/p&&p&r_n_n:从本磁铁北磁极到目标磁铁北磁极的矢量位移。&/p&&p&r_s_s:从本磁铁南磁极到目标磁铁南磁极的矢量位移。&/p&&p&r_n_s:从本磁铁北磁极到目标磁铁南磁极的矢量位移。&/p&&p&r_s_n:从本磁铁南磁极到目标磁铁北磁极的矢量位移。&/p&&p&mu:由每帧间隔时间,磁铁的磁场强度,目标磁铁的磁场强度以及磁常数共同决定的一个公式系数。&/p&&p&f_n_n:本磁铁北磁极对目标磁铁北磁极施加的矢量力。&/p&&p&f_s_s:本磁铁南磁极对目标磁铁南磁极施加的矢量力。&/p&&p&f_n_s:本磁铁北磁极对目标磁铁南磁极施加的矢量力。&/p&&p&f_s_n:本磁铁南磁极对目标磁铁北磁极施加的矢量力。&/p&&br&&p&这里磁场力的计算同上一部分异曲同工。&/p&&br&&p&此外,还要注意因为磁铁(是直的,)存在&b&“同性相斥,异性相吸”&/b&的规律。同名磁极之间的力应当是排斥力。&/p&&br&&p&&b&为什么我这里没有向之前一样施加反作用力?&/b&&/p&&p&&b&因为同该磁铁相互作用的另一磁铁也有这个脚本!也会执行同样的效果!&/b&&/p&&p&而且由于计算公式符合交换律,计算出的结果应当是一样的。&/p&&br&&br&&br&&p&我这里默认物体的磁场范围都足够大。如果你有特殊需求,或者说你的磁场范围不得不做的很小,那么请考虑到一个情况:B磁铁进了A磁铁的磁场范围,而A磁铁没有进入B磁铁的磁场范围。这可能会导致&b&潜在的bug&/b&。&/p&&p&如果你的磁场范围都足够大,磁场边缘的相互作用已经可以忽略不计了,那么就放心的省了反作用力吧。&/p&&p&这个问题,符合和我开头所说的抉择,即追求正确还是效率。&/p&&br&&p&这样以后就大工告成了。&/p&&p&&b&&u&完整代码:&/u&&/b&&/p&&div class=&highlight&&&pre&&code class=&language-text&&using UnityE
using System.C
public class MagneticField : MonoBehaviour {
public GameObject NP;
public GameObject SP;
private static float mu0 = 10.0f;
// Use this for initialization
void Awake () {
rb = GetComponent&Rigidbody& ();
// Update is called once per frame
void FixedUpdate () {
// Range of magnetic field
void OnTriggerStay (Collider other) {
Rigidbody other_rb = other.gameObject.GetComponent&Rigidbody& ();
if (other.gameObject.tag == &Magnetic&) {
MagneticField other_script = other.gameObject.GetComponent&MagneticField& ();
GameObject other_NP = other_script.NP;
GameObject other_SP = other_script.SP;
Vector3 r_n_n = other_NP.transform.position - NP.transform. // from this(N) to that(N)
Vector3 r_s_s = other_SP.transform.position - SP.transform. // from this(S) to that(S)
Vector3 r_n_s = other_SP.transform.position - NP.transform. // from this(N) to that(S)
Vector3 r_s_n = other_NP.transform.position - SP.transform. // from this(S) to that(N)
float other_strength = other_script.
// Calculate Force towards magnetic poles
float mu = Time.fixedDeltaTime * strength * other_
Vector3 f_n_n = // from this(N) to that(N)
(r_n_n.normalized) * mu /
(Mathf.Pow (Mathf.Max(r_n_n.magnitude, 0.2f), 3));
Vector3 f_s_s = // from this(S) to that(S)
(r_s_s.normalized) * mu /
(Mathf.Pow (Mathf.Max(r_s_s.magnitude, 0.2f), 3));
Vector3 f_n_s = // from this(N) to that(S)
(r_n_s.normalized) * mu /
(Mathf.Pow (Mathf.Max(r_n_s.magnitude, 0.2f), 3));
Vector3 f_s_n = // from this(S) to that(N)
(r_s_n.normalized) * mu /
(Mathf.Pow (Mathf.Max(r_s_n.magnitude, 0.2f), 3));
//Debug.Log ( f_n_n.magnitude + &, & + f_n_n.magnitude);
// Apply Rejecting Force
other_rb.AddForceAtPosition (
1f * f_n_n,
other_NP.transform.position);
other_rb.AddForceAtPosition (
1f * f_s_s,
other_SP.transform.position);
// Apply Attracting Force
other_rb.AddForceAtPosition (
-1f * f_n_s,
other_SP.transform.position);
other_rb.AddForceAtPosition (
-1f * f_s_n,
other_NP.transform.position);
else if (other.gameObject.tag == &Paramagnetic&) {
Vector3 r_n = other.gameObject.transform.position - NP.transform. // displacement vector
Vector3 r_s = other.gameObject.transform.position - SP.transform. // displacement vector
float mu = Time.fixedDeltaTime * strength * mu0 * other_rb.
// Calculate Force towards magnetic poles
Vector3 f_n =
(r_n.normalized) * mu /
(Mathf.Pow (Mathf.Max(r_n.magnitude, 0.2f), 3));
Vector3 f_s =
(r_s.normalized) * mu /
(Mathf.Pow (Mathf.Max(r_s.magnitude, 0.2f), 3));
//Debug.Log ( nf.magnitude + &, & + sf.magnitude);
// Apply attracting force to other object
other_rb.AddForce (
-1f * f_n);
other_rb.AddForce (
-1f * f_s);
// Apply attracting force to magnetic object
rb.AddForceAtPosition (
NP.transform.position);
rb.AddForceAtPosition (
SP.transform.position);
&/code&&/pre&&/div&&br&&p&再加点控制功能就可以进场景测试了。&/p&&br&&p&========================================================================&/p&&p&&b&&u&实例体验&/u&&/b&&/p&&br&&p&硬币,条形磁铁。&/p&&img src=&/6a67c447c2a3f1fa8545e0_b.jpg& data-rawwidth=&608& data-rawheight=&409& class=&origin_image zh-lightbox-thumb& width=&608& data-original=&/6a67c447c2a3f1fa8545e0_r.jpg&&&p&接近中&/p&&img src=&/e9757638afd67d9b286f_b.jpg& data-rawwidth=&259& data-rawheight=&229& class=&content_image& width=&259&&&p&成功吸附!&/p&&img src=&/cb603e9c53_b.jpg& data-rawwidth=&258& data-rawheight=&259& class=&content_image& width=&258&&&br&&br&&p&多丢点硬币下来。不要吐槽硬板的阴影效果和药片似的硬币材质。。。&/p&&img src=&/ab2b0afab0e7_b.jpg& data-rawwidth=&518& data-rawheight=&518& class=&origin_image zh-lightbox-thumb& width=&518& data-original=&/ab2b0afab0e7_r.jpg&&&br&&p&进去扫一圈。效果还不错。&/p&&img src=&/ab528c320e5c9368978cdc_b.jpg& data-rawwidth=&535& data-rawheight=&453& class=&origin_image zh-lightbox-thumb& width=&535& data-original=&/ab528c320e5c9368978cdc_r.jpg&&&p&多放点硬币,老mac电脑还算刚的住,掉帧不明显。&/p&&img src=&/fcabdfd7fee36f_b.jpg& data-rawwidth=&856& data-rawheight=&582& class=&origin_image zh-lightbox-thumb& width=&856& data-original=&/fcabdfd7fee36f_r.jpg&&&p&这里还是有瑕疵的,按理说被磁铁吸引的物体自己也会被暂时磁化,所以在这里应该是硬币吸硬币吸起一串来。(有兴趣的同学可以自己尝试实现,一个思路是把顺磁性物体做成两个磁极重合的磁化强度较低的铁磁性物体,然后根据受磁化率提升自身的磁化强度。)&/p&&br&&p&清空,再丢个条形磁铁下来。&/p&&img src=&/206cf706dc2ba82cb40f583b0993be75_b.jpg& data-rawwidth=&831& data-rawheight=&533& class=&origin_image zh-lightbox-thumb& width=&831& data-original=&/206cf706dc2ba82cb40f583b0993be75_r.jpg&&&br&&p&从左侧平行接近目标。&/p&&img src=&/c0decd04e948b_b.jpg& data-rawwidth=&646& data-rawheight=&304& class=&origin_image zh-lightbox-thumb& width=&646& data-original=&/c0decd04e948b_r.jpg&&&br&&p&十动然拒了。。&/p&&img src=&/268d693d35d0b2d89dcabeb0_b.jpg& data-rawwidth=&506& data-rawheight=&313& class=&origin_image zh-lightbox-thumb& width=&506& data-original=&/268d693d35d0b2d89dcabeb0_r.jpg&&&br&&p&从上方靠近&/p&&img src=&/bd0d9eb7f0abc3d1e482_b.jpg& data-rawwidth=&342& data-rawheight=&339& class=&content_image& width=&342&&&p&合体!&/p&&img src=&/37fa5cafef6e5ac6b9c39ba_b.jpg& data-rawwidth=&251& data-rawheight=&325& class=&content_image& width=&251&&&br&&p&再来丢下来点磁铁。&/p&&img src=&/70c5d9abbdf693e34bdf9fb_b.jpg& data-rawwidth=&821& data-rawheight=&602& class=&origin_image zh-lightbox-thumb& width=&821& data-original=&/70c5d9abbdf693e34bdf9fb_r.jpg&&&br&&br&&p&测试项目的浏览器在线试玩(不支持Chrome,需下载Unity Web Player):&/p&&p&&a href=&///?target=http%3A//teamgiant.itch.io/magnet-simulation-test& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Magnet Simulation Test&i class=&icon-external&&&/i&&/a& (海外网站)&/p&&br&&p&&u&操作:&/u&&/p&&p&上下左右:通过一个特定数值的力移动磁铁。(磁铁互相吸引后由于用于移动的力还是恒定值,因此会越来越难移动)&/p&&p&A/Z:抬起/下压磁铁。&/p&&p&空格:天上随机掉下一个硬币。&/p&&p&B:天上随机掉下一个条形磁铁。&/p&&br&&p&这个项目只是用来测试上述的磁场相互作用脚本的,基本已经和现实生活很接近了。&/p&&p&该脚本也基本适用于其他形状不太正常的磁铁,使用时最主要的还是两个磁极的位置以及强度的设定。&b&公式是死的,人是活的,&/b&请结合实际情况使用和修改。&/p&&br&&p&&b&警告:本答案的代码只为实现功能,均未经优化也未按设计规范编写,直接搬运存在大幅度影响性能的风险,答主概不负责!对物理知识的错误应用和解析,作者也概不负责!&/b&&/p&&p&========================================================================&/p&&p&有人说不要自己造轮子,Asset Store上已经有了。&/p&&br&&p&可也要看看别人的轮子随着引擎的更新还能不能用了。&/p&&img src=&/ffbde7e1e24_b.jpg& data-rawwidth=&812& data-rawheight=&146& class=&origin_image zh-lightbox-thumb& width=&812& data-original=&/ffbde7e1e24_r.jpg&&&br&&p&========================================================================&/p&&p&转载请私信。&/p&&p&本文已授权游资网&a href=&///?target=http%3A//& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&&/span&&span class=&invisible&&&/span&&i class=&icon-external&&&/i&&/a&转载。&/p&
本文基于Unity 5.3版本的3D物理和C#语言,服用前请注意本文未必适用于其他的版本。(对于2D的情形,Unity 5可以使用Point Effector实现)======================================================================== 前言 我们知道在诸如Unity此类的游戏引…
——————————————这次更新补上链接啦————————————————————&br&&br&跟着两个大神走:siki,雨松MOMO。&br&siki出视频教程和案例。雨松MOMO出文档教程。这两个都是系列教程,按顺序学就好。重点是,都是免费的!!!siki的教程我都是看微信公众号更新然后下载下来的,录制清晰,口音不重,讲解详细。雨松MOMO有出书,然而没看过╮(╯▽╰)╭就先不做评价了,但是文档教程写的棒棒哒,代码就在文档里,还有详解:&a href=&///?target=http%3A//& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&雨松MOMO程序研究院&i class=&icon-external&&&/i&&/a&。&br&&br&扩展阅读就关注风宇冲和A希亿。这两位就是解决问题小能手。风宇冲的书我看过。感觉写的不是特别好,有的地方只知其然而不知其所以然。不过他的博客确实实用,我没有系列的看过,只是工作需要的时候搜解决方案会用上他给的思路:&a href=&///?target=http%3A//.cn/lsy835375& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&风宇冲_新浪博客&i class=&icon-external&&&/i&&/a&。A希亿有些内容是转载风宇冲的,但是依然给了我不小的帮助:&a href=&///?target=http%3A///wonderKK/category/591789.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Unity3D - 随笔分类&i class=&icon-external&&&/i&&/a&。另外好奇一下知乎上的&a data-hash=&05fb5aaadb8bc4c84f9f73& href=&///people/05fb5aaadb8bc4c84f9f73& class=&member_mention& data-editable=&true& data-title=&@A希亿& data-tip=&p$t$05fb5aaadb8bc4c84f9f73& data-hovercard=&p$b$05fb5aaadb8bc4c84f9f73&&@A希亿&/a& 是不是博客园里的A希亿啊?&br&&br&国外的教学视频就上人人素材去搜有字幕翻译的部分。里面是各种小技巧,看需要选择学习。一般教学视频都带有源代码。&br&&br&我不是很习惯用论坛,因为无效的信息太多了。所以出bug了或者无法实现什么功能的,直接上搜索引擎搜。很大一部分需求能从雨松MOMO、风宇冲、A希忆的分享中得到帮助。 实在搜不到了再上知乎提问。&br&&br&接下来说几个我自己没用过的。&br&泰课在线,太贵啦!而且siki有出免费的视频,就没有用。&br&腾讯也有搞一个订阅教学视频,不过有时间限制,就一直没去看。然后,刚才收到邮箱,我定的课程已经取消了╮(╯▽╰)╭上一下腾讯免费课程的链接&a href=&///?target=https%3A///course/list%3Fmt%3Dst%3Dtt%3D3039%26price_min%3D0%26price_max%3D0%26%26task_filter%3D& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&/course/list?&/span&&span class=&invisible&&mt=1001&&st=2008&&tt=3039&price_min=0&price_max=0&&task_filter=0000000&&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&我发现里面有siki的教学视频!!!&br&&br&不建议你上淘宝买教程合集什么的,因为你根本不会选!!!太多太杂了。买买人人素材的解压密码还是可以的。虽然也有办法免费解压,不过拖的时间太长。不过如果你有条件的话,还是支持一下正版吧。&br&&br&ps:如果你觉得以上哪个教程对你有帮助的话,给他们一点支持吧。如果大家都只是看看,这些教程很快就做不下去了。&br&&br&( o??o? )不小心又是一篇技术长答啊,自己激动一下~
——————————————这次更新补上链接啦———————————————————— 跟着两个大神走:siki,雨松MOMO。 siki出视频教程和案例。雨松MOMO出文档教程。这两个都是系列教程,按顺序学就好。重点是,都是免费的!!!siki的教程我都是看…
&p&游戏开发里,编辑器是个大坑,能不碰尽量不碰,&/p&&p&有现成的宁可用现成的,比如有游戏用 Excel ,你程序跑一下excel演示下效果就得了。&/p&&p&关键是你没法控制这个编辑器有多少个纬度,而 Scratch 这样的事先就确定好了:什么可以编辑,怎样编辑,什么不能编辑。确定好这三个问题后,他们再一组人上去设计他们的编辑器。&/p&&p&你去可以先问一下问问你的策划们,他们想的清楚这三个问题么?这么高阶的逻辑抽象,身边尚无可以参考模仿的时候,对策划是一个比较大的挑战,即便在你的帮助下花了好几天给了你个方案,你觉得能用多长时间不加新的纬度呢?半年?三个月?&/p&&p&如果策划逻辑足够强,直接告诉你,1,2,3,4,5,并且以后也不会改,那好,恭喜你,你可以做得出来;或者你足够强势和聪明,告诉他们,只能编辑 1,2,3,4,5,以后你们的需求但凡超过这个范围都没辙(看你心情好坏),那也可以。&/p&&p&还有编辑器常见的各种redo/undo,单选/多选,复制/粘贴,UI,多条目共同编辑,交互,文件序列化反序列化,你会发现要搞这事情,耗时耗力超预期。所以,&/p&&p&苦海无涯,回头是岸。&/p&&p&先找找有没有开源的,尽量在上面复用,比如 Tiled Map Editor 就被很多游戏用来做地图。找不到的话,能不能用 Excel 来做呢?让策划按照规则简单填写些东西,给点模版,然后你写个程序来跑结果。做的好的话,大部分时候可以让策划填写 excel 去,填写不对了,游戏跑出问题了,还能让测试给策划提 bug,然后每天你下班了回头问加班的策划,要不要一起烧烤,没准你们的策划会告诉你,你先去吧,我在改bug呢,哈哈哈。&/p&&br&&p&当然,如果你象人家专门做编辑器的有个小团队就做一件事情的话,当我没说。&/p&
游戏开发里,编辑器是个大坑,能不碰尽量不碰,有现成的宁可用现成的,比如有游戏用 Excel ,你程序跑一下excel演示下效果就得了。关键是你没法控制这个编辑器有多少个纬度,而 Scratch 这样的事先就确定好了:什么可以编辑,怎样编辑,什么不能编辑。确定…
这套系统叫locomotion (和布娃娃也不是一回事,ragdoll主要还是用来做无动画的人体碰撞)&br&正常的游戏只要判断一个虚拟碰撞胶囊体的底部位置和地面的碰撞即可&br&locomtion就涉及了各种状态下人的重心和双脚之间的关系&br&&br&具体说unity里面这个叫foot ik&br&autodesk的解决方案叫humanIK
可以去搜索下&br&这套系统颇复杂,不是三言两语可以说清楚的,如果没有人物骨骼系统的了解,说不太清,可以自己去搜索下
这套系统叫locomotion (和布娃娃也不是一回事,ragdoll主要还是用来做无动画的人体碰撞) 正常的游戏只要判断一个虚拟碰撞胶囊体的底部位置和地面的碰撞即可 locomtion就涉及了各种状态下人的重心和双脚之间的关系 具体说unity里面这个叫foot ik autodesk…
谢邀,这会是个比较漫长的学习过程&br&&br&&b&(一)国内引进出版的书籍&/b&&br&国内引进或出版的图形学书籍很多,但是大部分是糟粕,看它们是浪费时间&br&&b&&br&3D数学基础:图形与游戏开发&/b&&br&这本可以补数学基础,矩阵变换,线性代数啥的&br&&br&&b&图形着色器:理论与实践(第2版)&/b&&br&这本是比较新的讲 opengl shader 的&br&&br&&b&DirectX 9.0 3D游戏开发编程基础&/b&&br&这本是国内出版或引进的 d3d 书籍中唯一能看的&br&&br&&b&(二)国内没有引进的书籍,可以下载电子版或上淘宝买打印版&/b&&br&&b&OpenGL Shading Language&/b&&br&可以认为是 glsl 的圣经&br&&br&&b&Introduction to 3D Game Programming: With Directx 11&/b&&br&可以认为是 d3d11 的圣经,这本是 &b&DirectX 9.0 3D游戏开发编程基础 &/b&的升级版&br&&br&&b&(三)个人推荐&/b&&br&&b&3D数学基础:图形与游戏开发&/b&&br&&b&DirectX 9.0 3D游戏开发编程基础&/b&&br&&b&Introduction to 3D Game Programming: With Directx 11&/b&
谢邀,这会是个比较漫长的学习过程 (一)国内引进出版的书籍 国内引进或出版的图形学书籍很多,但是大部分是糟粕,看它们是浪费时间
3D数学基础:图形与游戏开发 这本可以补数学基础,矩阵变换,线性代数啥的 图形着色器:理论与实践(第2版) 这本是比较新的…
&p&&a href=&///?target=http%3A///unity-you-xi-kuang-jia-da-jian-yi-gai-shu/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Unity 游戏框架搭建 (一) 概述&i class=&icon-external&&&/i&&/a&&/p&&p&&a href=&///?target=http%3A///unity-you-xi-kuang-jia-da-jian-er-dan-li-de-mo-ban/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Unity 游戏框架搭建 (二) 单例的模板&i class=&icon-external&&&/i&&/a&&/p&&p&&a href=&///?target=http%3A///unity-you-xi-kuang-jia-da-jian-san-monobehaviourdan-li-de-mo-ban/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Unity 游戏框架搭建 (三) MonoBehaviour单例的模板&i class=&icon-external&&&/i&&/a&&/p&&p&&a href=&///?target=http%3A///unity-you-xi-kuang-jia-da-jian-er-dan-li-de-mo-ban-2/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Unity 游戏框架搭建 (四) 简易有限状态机&i class=&icon-external&&&/i&&/a&&/p&&p&&a href=&///?target=http%3A///unity-you-xi-kuang-jia-da-jian-wu-jian-yi-xiao-xi-ji-zhi/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Unity 游戏框架搭建 (五) 简易消息机制&i class=&icon-external&&&/i&&/a&&/p&&p&&a href=&///?target=http%3A///unityyou-xi-kuang-jia-da-jian-liu-guan-yu-kuang-jia-de-yi-xie-si-kao/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Unity 游戏框架搭建 (六) 关于框架的一些好文和一些思考&i class=&icon-external&&&/i&&/a&&/p&&p&&a href=&///?target=http%3A///untitled-2/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Unity 游戏框架搭建 (七) 减少加班利器-QApp类&i class=&icon-external&&&/i&&/a&&/p&&p&&a href=&///?target=http%3A///unity-you-xi-kuang-jia-da-jian-ba-jian-shao-jia-ban-li-qi-qlog/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Unity 游戏框架搭建 (八) 减少加班利器-QLog&i class=&icon-external&&&/i&&/a&&/p&&p&&a href=&///?target=http%3A///unity-you-xi-kuang-jia-da-jian-jiu-jian-shao-jia-ban-li-qi-qconsole/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Unity 游戏框架搭建 (九) 减少加班利器-QConsole&i class=&icon-external&&&/i&&/a&&/p&&p&&a href=&///?target=http%3A///unity-you-xi-kuang-jia-da-jian-shi-qframework-v0-0-2xiao-jie/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Unity 游戏框架搭建 (十) QFramework v0.0.2小结&i class=&icon-external&&&/i&&/a&&/p&&p&&a href=&///?target=http%3A///you-xi-kuang-jia-da-jian-shi-yi-jian-yi-assetbundleda-bao-gong-ju-yi/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Unity }

我要回帖

更多关于 android 游戏开发引擎 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信