由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&&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此类的游戏引…
&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 这样的事先就确定好了:什么可以编辑,怎样编辑,什么不能编辑。确定…
谢邀,这会是个比较漫长的学习过程&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 游戏框架搭建 (十一) 简易AssetBundle打包工具(一)&i class=&icon-external&&&/i&&/a&&/p&&p&&a href=&///?target=http%3A///unity-you-xi-kuang-jia-da-jian-shi-er-jian-yi-assetbundleda-bao-gong-ju-er/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Unity 游戏框架搭建 (十二) 简易AssetBundle打包工具(二)&i class=&icon-external&&&/i&&/a&&/p&&p&&a href=&///?target=http%3A///unity-you-xi-kuang-jia-da-jian-shi-san-wu-xu-ji-cheng-de-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-shi-si-you-ya-de-qsignleton-ling-quickstart/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Unity 游戏框架搭建 (十四) 优雅的QSignleton(零) QuickStart&i class=&icon-external&&&/i&&/a&&/p&&p&&a href=&///?target=http%3A///you-ya-de-qsignleton-yi-singletondan-li-shi-xian/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&优雅的QSignleton (一) Singleton单例实现&i class=&icon-external&&&/i&&/a&&/p&&p&&a href=&///?target=http%3A///you-ya-de-qsignleton-er-monosingletondan-li-shi-xian/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&优雅的QSignleton (二) MonoSingleton单例实现&i class=&icon-external&&&/i&&/a&&/p&&p&&a href=&///?target=http%3A///you-ya-de-qsignleton-san-singletonpropertydan-li-shi-xian/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&优雅的QSignleton (三) SingletonProperty单例实现&i class=&icon-external&&&/i&&/a&&/p&&p&&a href=&///?target=http%3A///you-ya-de-qsignleton-si-tong-guo-shu-xing-qi-shi-xian-monosingleton/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&优雅的QSignleton (四) 通过属性器实现MonoSingleton&i class=&icon-external&&&/i&&/a&&/p&
这套系统叫locomotion (和布娃娃也不是一回事,ragdoll主要还是用来做无动画的人体碰撞)&br&正常的游戏只要判断一个虚拟碰撞胶囊体的底部位置和地面的碰撞即可&br&locomtion就涉及了各种状态下人的重心和双脚之间的关系&br&&br&具体说unity里面这个叫foot ik&br&autodesk的解决方案叫humanIK
可以去搜索下&br&这套系统颇复杂,不是三言两语可以说清楚的,如果没有人物骨骼系统的了解,说不太清,可以自己去搜索下
这套系统叫locomotion (和布娃娃也不是一回事,ragdoll主要还是用来做无动画的人体碰撞) 正常的游戏只要判断一个虚拟碰撞胶囊体的底部位置和地面的碰撞即可 locomtion就涉及了各种状态下人的重心和双脚之间的关系 具体说unity里面这个叫foot ik autodesk…
参见小文 &a href=&/p/?refer=kodoev& class=&internal&&&span class=&invisible&&http://&/span&&span class=&visible&&/p/20&/span&&span class=&invisible&&662822?refer=kodoev&/span&&span class=&ellipsis&&&/span&&/a&&br&我有一个看法,是我从游戏公司离开以后,和客户的惨烈搏斗中得出的经验,你可以说它价值观不正确,但那是经过&b&惨烈的市场洗礼&/b&的(好像你可以以为毛选不正确,但是那是在惨烈的斗争中存活下来的)&br&&br&我之前在游戏公司,游戏主要是追求&b&有趣&/b&,很多功能是为了迎合消费者,让消费者高兴的,没什么实际的用处。&br&现在做虚拟现实,坦白说我会尽量让画面不好看一点(在前期提案的时候),很简单,这个不是游戏,用户其实并不打算为你的画面掏多少钱,他要他要的那个功能,当然如果那个功能本身包括了取悦用户的审美,做好点也是应该,但是很多时候虚拟现实是不需要这个有趣,只是需要&b&有用&/b&的,这种时候你在&b&有趣&/b&上面下越多功夫,你的&b&利润就越低&/b&,而客户也未必欣赏,&br&反正如果你在&b&有用&/b&上面下足够多的功夫,也许&b&客户才会更满意&/b&。&br&&br&你当然可以拿虚拟现实的游戏来反驳我,如果这样我也不打算反驳什么,因为我和你对虚拟现实的定义不一样,你是以表现形式来判断,我更多的以有趣/有用来判断。&br&&br&故事时间: &br&&u&这个事情对我有很深的印象,有次有个朋友打算忽悠宝钢下面的一个子公司做一个钢厂的虚拟系统(这哥们以前做的是动画,开始是打算推荐的unreal,我是劝他用unity,当时也没用定论)&br&&br&于是把这家公司的老总请过来,放了点视频给他看看画面能多好看,他一脸冷漠的说“这种东西让我手下经理定下就完了,不用专门叫我来看,反正就是做做好看么,好看你就用unreal好了,不然我们就用&b&OSG&/b&了“&br&一听&b&OSG&/b&我多少震了一下,(&b&参考白百合在益达广告里面说那句”行家啊“&/b&),合着这位老总不是外行啊。&br&于是攀谈起来,这个老总突然进入了愤怒模式&b&“我最讨厌你们这些做游戏的!&
&/b&&br&我退后半步,心想,怎地,你家还有网瘾少年。。。 我赶紧说我都是做智益游戏的?说我已经就是痛恨这个万恶的行业才幡然悔悟,毅然离开重新做人的?&br&&br&正思想斗争中。。老总开说“之前给工厂找了osg开发人员,把每个厂里的工程数据接口还有传感器都连上了,我们积累很多的!别想宰老子冲头!
后来这些技术员都tmd去搞游戏了,我们给他们1w 1.5w他们去游戏公司就是拿2w以上!
你们这些做游戏的又不创造价值! 将来实体行业死了中国怎么发展! 都是你们这些人, 呸!&&br&&br&没想到&b&继净空法师之后&/b&再次听到如此强烈的对游戏行业的抨击。。。&br&&br&当然客户为大,还是好好安抚,&osg虽然我们做不到那么成熟,但是慢慢来么,您这边工程的保留我们理解,但是要与时俱进么,还是把画面做好么,从零件建模开始,慢慢调整好吧“&br&&br&老总稍微平静了点“也是 之前的模型还是太粗糙了,先建模吧,把之前模型细化起来,从这里切入&&br&&br&心想这样好歹先把事情进入正轨,做完模型再图进一步呗。这人内行,模型估计也要不高,单个算&b&500&/b&,先报高点让他砍下来,反正模型不挣钱还可以将来虚拟挣回来么。&br&&br&于是问老总“您觉得模型多少一个合适”老总神情刚毅“之前我们发包价格是&b&50&/b&一个,当然这个批量做你得给我降下来!”.....................&/u&&br&&br&&br&&br&真实事情,不想说什么太多道理,不同行业的虚拟现实,你要理解了这个行业才能做,我相信知乎里面做过&b&商业虚拟项目的领域&/b&,我是最多的,但是我所得出的结论也不过就是,你得知道你客户到底要什么。&br&&br&ps:大家别误会我对这位老总是讽刺或者什么的,坦白说,我很喜欢这位老总,虽然生意没成,坦白说这位老总 思路清晰,口才一流,是我见过无数的项目甲方里面专业水平最好的,我见过所有的虚拟现实开发团队和投资人99.9%没他的水平高。&br&&br&那天见完这位老总,我半宿没睡(平时沾枕头就倒),我一直在想,我,凭什么?&br&&br&好了 不扯了,继续赶项目去 :D
我有一个看法,是我从游戏公司离开以后,和客户的惨烈搏斗中得出的经验,你可以说它价值观不正确,但那是经过惨烈的市场洗礼的(好像你可以以为毛选不正确,但是那是在惨烈的斗争中存活下来的) 我之前在游戏公司,游戏主要…
&p&我推荐cocos2d-x
现在手机游戏市场前10位有7位都是cocos2d-x开发, 开源、跨平台、MIT许可等等,当然适合2d游戏,3d游戏还是用unity;我重点介绍cocos2d-x&/p&&br&&p&&b&主流工具&/b&&/p&&br&&p&Window平台下
C++语言用 Visual Studio ,官方有UI编辑器CocoStudio,苹果系统不太熟&br&&/p&&br&&p&-------------其他独立的工具----------&/p&&p&位图字体工具Bitmap Font Tools &br&&/p&&a href=&///?target=http%3A///products/bmfont& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&BMFont&i class=&icon-external&&&/i&&/a& (Windows) &br&&a href=&///?target=http%3A///p/fonteditor& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Fonteditor&i class=&icon-external&&&/i&&/a&&br&&a href=&///?target=http%3A///& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Glyph Designer&i class=&icon-external&&&/i&&/a&&br&&a href=&///?target=http%3A///demos/hiero.jnlp& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Hiero&i class=&icon-external&&&/i&&/a&&br&&a href=&///?target=http%3A//www.cocos2d-iphone.org/forum/topic/4357& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&LabelAtlasCreator&i class=&icon-external&&&/i&&/a&&br&&br&粒子编辑工具Particle Editing Tools &br&&a href=&///?target=http%3A//www.cocos2d-iphone.org/forum/topic/16363& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&ParticleCreator&i class=&icon-external&&&/i&&/a&&br&&a href=&///?target=http%3A///& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Particle Designer&i class=&icon-external&&&/i&&/a&&br&&br&物理编辑工具Physics Editing Tools &br&&a href=&///?target=http%3A//www.mekanimo.net/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Mekanimo&i class=&icon-external&&&/i&&/a&&br&&a href=&///?target=http%3A//www.cocos2d-iphone.org/forum/topic/9064& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&PhysicsBench&i class=&icon-external&&&/i&&/a&&br&&a href=&///?target=http%3A//www.physicseditor.de/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&PhysicsEditor&i class=&icon-external&&&/i&&/a&&br&&a href=&///?target=http%3A//www.cocos2d-iphone.org/archives/779& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&VertexHelper&i class=&icon-external&&&/i&&/a&&br&&br&场景编辑工具Scene Editing Tools &br&&a href=&///?target=http%3A///& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&CocosBuilder&i class=&icon-external&&&/i&&/a&&br&&a href=&///?target=http%3A//www.cocos2d-iphone.org/forum/topic/15668& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Cocoshop&i class=&icon-external&&&/i&&/a&&br&&a href=&///?target=http%3A//www.levelhelper.org/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&LevelHelper&i class=&icon-external&&&/i&&/a&&br&&br&纹理地图集工具Texture Atlas Tools &br&&a href=&///?target=http%3A///& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&DarkFunction Editor&i class=&icon-external&&&/i&&/a&&br&&a href=&///?target=http%3A//www.spritehelper.org/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&SpriteHelper&i class=&icon-external&&&/i&&/a&&br&&a href=&///?target=http%3A///& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&TexturePacker&i class=&icon-external&&&/i&&/a&&br&&a href=&///?target=http%3A///& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Zwoptex&i class=&icon-external&&&/i&&/a&&br&&br&瓦片地图编辑工具Tilemap Editing Tools &br&&a href=&///?target=http%3A///page/iTileMaps.aspx& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&iTileMaps&i class=&icon-external&&&/i&&/a&&br&&a href=&///?target=http%3A//www.mapeditor.org/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Tiled Map Editor&i class=&icon-external&&&/i&&/a&&br&&br&声音特效编辑工具Audio Effect Editing Tools &br&&a href=&///?target=http%3A//thirdcog.eu/apps/cfxr/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&cfxr&i class=&icon-external&&&/i&&/a&&br&&br&背景音乐编辑工具Background Music Editing Tools &br&&a href=&///?target=http%3A///cn/app/garageband/idFl%3Den%26mt%3D12/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&GarageBand&i class=&icon-external&&&/i&&/a& (MAC 系统自带) &br&&br&BOX2D多边形定义工具VertexHelper &br&&a href=&///?target=https%3A///jfahrenkrug/VertexHelper/downloads& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&VertexHelper&i class=&icon-external&&&/i&&/a&&br&&br&GIF动画帧导出工具Ulead GIF Animator &br&&a href=&///?target=http%3A///soft/4010.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&UleadGifAnimator&i class=&icon-external&&&/i&&/a&&br&&br&&p&如果开发者熟悉javascript ,lua编程语言,推荐cocos2d-x editor;我在网上查资料无意间找到的,不得不承认高手在民间,我现在在使用,确实强大,可惜人气还是少了点,希望工具开发者更新更多例子和教程。下面是工具创造者写的简介,我就直接贴在下面了,尽量看原文吧,我很懒,不想一张一张贴图片,麻烦。&/p&&br&&p&&b&原文csdn地址:&a href=&///?target=http%3A//blog.csdn.net/touchsnow/article/details/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&cocos2d-x editor&i class=&icon-external&&&/i&&/a&&/b&&/p&&br&&blockquote&&p&&strong&背景:&/strong&&/p&&p&
笔者学java
,android,javascript出身,近期开始学习手机游戏开发,由于手游开发是多平台,所以深思熟虑选择cocos2d-x作为开发游戏引擎。&/p&&p&
但遇到如下一些问题,&/p&&p&
其一,cocos2d-x开发平台很多是ios系统上完成的,笔者熟悉window系统,不熟悉ios;&/p&&p&
其二, window系统上主流是使用开发语言c++完成,而且要使用烦人的visual studio,速度卡的半死;&/p&&p&
其三,cocos2d-x场景代码编辑是分开的,其他动画,字体,粒子,物理,地图等等都是独立的作为一个工具存在,而且调试模拟不方便&/p&&p&
其四,cocos2d-x 对于javascript脚本语言开发没有很好的集成开发工具&/p&&p&
经过大量的资料寻找都没有找到很好的选择方案,最终决定自己开发制作一套有效的集成游戏开发工具。&u&根据我的条件,满足window系统上,javascript脚本语言,基于cocos2d-x跨平台游戏引擎, 集合代码编辑,场景设计,动画制作,字体设计,还有粒子,物理系统,地图等等的,而且调试方便,和实时模拟器。&/u&&/p&&p&
功夫不负有心人,经过几个月的努力,终于这套游戏开发工具初见雏形,我给他命名为 cocos2d-x
editor ,简称 CE,经过不断的提升和尝试,我用这套工具开发了各种手机游戏,有跑酷,消除,益智,塔防,格斗等等游戏,运行于各大手游平台,让开发游戏更加快捷方便。开发一款小型的游戏,在设计素材具备的条件下,笔者曾经保持一个礼拜开发一款游戏的记录。&/p&&p&
上面也说过,笔者出身android ,以前使用开发android的工具是intellij idea,就地取物,这套工具是基于idea上的插件存在,工具免费。&/p&&p&&strong&介绍:&/strong&&/p&&p&
工具特色:&/p&&br&1. 支持跨平台,IDEA是用JAVA开发的开发工具,可运行在各种主流操作系统上,目前CE在Windows上经过了大量的可用测试,接下来会针对Mac,Linux系统进行测试完善。&br&
2.支持CCB的所有功能,可进行场景,界面,动画编辑。&br&
3.支持Javascript,Lua脚本开发&br&
4.支持集成贴图制作功能&br&
5.支持字体编辑功能&br&
6 支持粒子系统&br&
7 支持tieldmap地图&br&
8.支持Javascript调试&br&
9.支持本地运行,可以实时看到开发的效果&br&10,支持游戏简单框架&br&&br&&img src=&/23a471d98c0cce7ea8412f1_b.jpg& data-rawwidth=&1358& data-rawheight=&724& class=&origin_image zh-lightbox-thumb& width=&1358& data-original=&/23a471d98c0cce7ea8412f1_r.jpg&&&/blockquote&
我推荐cocos2d-x 现在手机游戏市场前10位有7位都是cocos2d-x开发, 开源、跨平台、MIT许可等等,当然适合2d游戏,3d游戏还是用unity;我重点介绍cocos2d-x 主流工具 Window平台下 C++语言用 Visual Studio ,官方有UI编辑器CocoStudio,苹果系统不太熟 ----…
&p&深圳乾娱科技有限公司&/p&&p&老板呢(蒋祖成)是一个除了钱什么都没有的煤老板,自己吹自己在财富榜前200,但是我反正是没查到。&/p&&p&程序呢是一个划水混高薪工资的大哥带着四五个学了三四个月C#的程序,每天除了写BUG就是在群里斗图。&/p&&p&一个棋牌项目从四月底做到现在仍然BUG不断,然后拖欠薪水这都是常事,还附带各种威胁,连坐。在第一个项目没盈利之前就贸然的开第二个长线项目,然后又因为资金周转不良给裁掉了,而且还是在十一之前,到现在还没拿到补偿金。50多号人的团队,40多个总,官僚派头十足,三天两头开会,老板女儿满月还要求员工随礼,不随的会特意去问你的名字,宴会上各种劝酒,把员工喝的不省人事的比比皆是。最奇葩的是进公司第一件事是让你把微信头像换了,换成公司LOGO,一个公司微信群全是一个脸孔,朋友都说你怕不是进了传销组织。离职第一件事就是把头像换回来。&/p&&p&还有一些暂时没想到,以后想到了再补回来。&/p&&p&反正归根到底一句话,别去小公司,真是死都不知道怎么死的。&/p&&hr&&p&截止目前为止9月份的工资仍然没发,从上周一拖到这周一,然后又拖到25号,现有又有消息称老板26号回来给大家一个说法,保守估计也是找个借口让大家在忍忍。全公司上上下下在职的离职的加起来四五十号人,全部拖欠。&/p&&p&目前正在考虑申请劳动仲裁,希望有过类似经历的人给予一些建议。&/p&
深圳乾娱科技有限公司老板呢(蒋祖成)是一个除了钱什么都没有的煤老板,自己吹自己在财富榜前200,但是我反正是没查到。程序呢是一个划水混高薪工资的大哥带着四五个学了三四个月C#的程序,每天除了写BUG就是在群里斗图。一个棋牌项目从四月底做到现在仍然…
&b&Unity 3D正在革命游戏开发市场。&/b&
&br&&br&我从Unity1.0开始关注它,并且从1.5开始使用。我感觉Unity 3D是一款革命性的游戏引擎,它(和一些同样具有创新精神的引擎)正在改写开发游戏的历史。
&br&&br&【高风险的大型游戏开发】
&br&&br&传统上来说,开发游戏是一件费时费力的事情,而且80%的情况下开发游戏这件事就是一个灾难。因为游戏是一个交互艺术,这个交互不仅体现在娱乐方式上,也体现在开发过程中。修修补补是开发游戏的家常便饭。但是,由于传统的游戏开发至少涉及策划、美术和程序,因此任何一点微小的调整都需要各个环节通力合作才能勉强达成。而游戏的品质如何,往往要到最后开发出来一个版本才能看到。这时,项目往往已经开发到50%以上的进度了,无论做什么调整,都意味着巨大的先期投入。
&br&&br&然而幸运的是。虽然开发游戏的风险很高,但是传统游戏市场的回报也是丰厚的。次世代平台的游戏动辄可以获得几千万、甚至上亿美元的回报;某些大型网游也能达到近似的回报。为了拿到这么高的回报,当然无论从技术还是资金上都可以玩命的冒险。
&br&&br&因此,游戏开发的主要工具——引擎——就成了这个领域的一个关键性竞争要素。像&b&Unreal、Cry这些超级引擎,在其发展的初期就确立了两个指标,其一是贵;其二就是复杂。&/b&这些引擎有强悍的稳定性,但是调试过程和开发过程都相当复杂(我猜想是因为为了抢先实现一些视觉或功能上的效果,它们采用了很多层的技术来堆积引擎结构,导致引擎既庞大又难以驾驭),不过一开始他们不必担心这些问题,因为他们的客户都不差钱儿,而且有的是人手来“十年磨一剑”。
&br&&br&北京、上海、杭州每月都有几百万投资的新游戏项目启动,公司动辄4、50人,不少都能达到百人规模,购买昂贵引擎或者偷用昂贵工具的公司当然也不是少数。但其中大约七八成儿最终都没有获得预想的成功。足见游戏开发的风险之大。
&br&&br&【小型游戏、独立游戏开发】
&br&&br&当然,虽然每个做游戏的人都希望能搞一款大作,但不是每个公司都有机会做大型游戏的。因此几乎从游戏开发诞生那天起,小型游戏(中型游戏)开发就是这个领域的最主要项目形式。
&br&&br&中小型游戏一般规格不大,大多每次游戏时间都在1小时以内,也没有复杂的多人联线模式。因此开发起来相对有时间短、玩法鲜明的特点。在过去,中小型游戏大部分都采用开源引擎、Flash或者Java驾驭的自编引擎。这些特色让小型游戏迅速拥有了数量上的优势,占有了巨大的玩家时间。但是,小型游戏也有2个让开发者踌躇的问题:&ol&&li&这些引擎和工具大部分是基于二维技术的,因此我们看到的90%以上的中小型游戏都是二维的。视觉表现上越来越跟不上玩家的要求。&/li&&li&中小游戏的营收模式长期缺少保证,越来越低的投入导致品质越做越差。&/li&&/ol&【Unity】
&br&&br&Unity3D在发展之初,给自己的定位主要是中小游戏的开发。这个定位在一开始(Unity1.x时代)并不那么一呼百应,因为前面提到的两个问题里,Unity只能解决第一个,对第二个问题它开始也是束手无策的。
&br&&br&不过它有两个与大型引擎相反的特性,第一是便宜,第二是简单。它通过完善工具,解决了一些的确对游戏开发流程非常非常重要的问题:&ul&&li&容易上手。U3D有着与传统3D软件十分接近的界面,甚至某些方面比传统3D软件还要简捷易用,因此很快吸引了那些有3D软件使用经历的人。容易上手对一个引擎的普及非常重要,没人喜欢复杂难用的东西。&/li&&li&多语言编程。兼容JavaScript和.Net(C#)这两个比较主流的语种,方便程序开发。不过更重要的是,如果你对自己的逻辑和数学有信心,你也可以自己学这些语言来开发游戏。没你想的那么难。&/li&&li&节点堆积。U3D对所有场景物体“一视同仁”,通过堆积在上面的一条条功能来给它们添加各种属性。这让U3D成了世界上最容易理解的引擎结构之一。&/li&&li&傻瓜式调试和编译。只要点“播放”就可以马上测试(这个功能与大型引擎看齐)。&/li&&li&强大的扩展性。U3D有一个比较开放的结构,你可以自由添加一些自己编写的工具和插件进去,进一步完善U3D的功能,并且这些功能也可以跨平台使用。&/li&&/ul&还有很多特性可以自己去网上了解。
&br&&br&此外,Unity很“幸运”。iPhone和iPad突然火了,FaceBook也爆炸式增长,这让中小游戏突然有了全新的营收保障。目前全球增长最快的游戏领域是SNS游戏和手机游戏。而Unity正因为在这两个领域的强悍和实用性而变得成长更为迅速。
&br&&br&因此,我认为Unity可能并不是最为“强大”的引擎,但它一定是目前世界上成长速度最快,也是最好用的游戏引擎之一。
Unity 3D正在革命游戏开发市场。 我从Unity1.0开始关注它,并且从1.5开始使用。我感觉Unity 3D是一款革命性的游戏引擎,它(和一些同样具有创新精神的引擎)正在改写开发游戏的历史。 【高风险的大型游戏开发】 传统上来说,开发游戏是一件费时费力的事情,…
&p&碰巧对Unity里的声音脚本,FMOD和Wwise都比较了解,强答一下。音乐和音效还得分开说,因为这两个很多时候需求和设计很不一样。&/p&&br&&p&首先,简单的2D游戏大部分时候是用不到这两个中间件的,除非是音乐游戏。而3D游戏尤其是第一人称视角的游戏中就比较有必要。中间件最强大的地方在于自带的那些效果器,用于3D音效的空间处理,这点在沉浸式体验的游戏中非常重要。FMOD和Wwise中带有各种DSP的实时运算处理插件,用于声音在真实场景中的渲染,而Unity引擎中除了加一个Low/High Pass Filter和非常基本的Reverb之外几乎没有任何可以控制的地方。FMOD拥有天气环境音效的生成器,Wwise还带有一些物理建模的插件来模拟挥舞声、风声和击打声等,可以为游戏节省一些资源空间。如果要做AR/VR的游戏,就更加需要中间件进行空间化处理了。据说Wwise现在在开发智能分配通道的功能,也就是说不管玩家的播放设备是什么样的,单声道/立体声/5.1环绕声/VR也好,都能将当前声音在声场中的位置自动分配相应的音量到每个通道上。&/p&&p&在音效上,最让程序员头疼的就是资源管理。&b&音效师做出来的资源往往只有自己才能数的清,程序员在不进行大量沟通的情况下很难理解每个子文件夹都是做什么的,这点对于大公司的开发团队尤甚。&/b&举个例子,当我需要做某个怪物的脚步声的时候,哪怕是最简单的随机选取不重复机制,如果在Unity里直接写,都需要先把某个精确路径下的文件载入到一个AudioClip[]里,然后随机选取再检测确认与上一个不重复。还需要考虑一个AudioSource同时只能播放一个AudioClip,如果声音的尾巴比较长的话,会打断,所以可能还得放多个AudioSource,或者根据之前的脚步声有没有播放完来决定是否Instantiate另一个AudioSource然后等到播放完再Destroy。这些在程序上实现并不难,但是很烦人,也可能会产生bug。不像动作特效上的bug一眼就能看出来,程序不懂音频技术还不一定听得出音频上的bug,最后给项目开发带来很多额外的工作量,影响开发效率。&b&而且,我就没见过几个程序员戴着耳机工作的。&/b&&/p&&p&还是脚步声的例子,如果我要做出不同的怪物在不同的地面上发出不同的脚步声,以上工作量就大得多。但是如果使用中间件,尤其是Wwise的话,程序员只要做一个简单的Raycast然后把结果对应相应名字的Event就行了,几十行的代码简化成了一行。&b&所有的这些随机/避免重复/不同怪物/不同地面/voice数量等等都不需要程序员来考虑,交给音频设计师在中间件里完成就行了。&/b&中间件对于音效带来的另一个好处是能够对不同声音事件进行优先级判断,砍掉不重要的声音或者音量太小的声音,提高游戏性能优化。这个在Unity里虽然也可以做到一些基本的,但可控性比较弱。&/p&&p&另外就是声音的动态变化。Unity居然不支持最简单的声音淡入淡出,需要专门去写一个Coroutine。比如赛车游戏中引擎的声音,往往有很多个样本文件,在不同转速下进行cross fade。在Unity里面要实现这个无缝渐变是比较困难的,但是在中间件里,只需要程序员把引擎转速的变量与FMOD中的parameter或者Wwise中的RTPC在Update里面进行赋值对接就行了。&/p&&p&还有一点就是对于资源包的管理。不管是配乐还是音效,导出的原始文件都是wav格式,占用大量体积。&b&而FMOD和Wwise里都可以针对不同的平台进行不同格式以及大小的压缩。Wwise甚至能够对每一个音频文件自动检测可承受的压缩范围,以保证资源包的最小化,这点在手游上尤为重要。&/b&在游戏运行过程中,中间件也可以选择针对不同的音频进行不同的预处理,如常触发并需要快速反应的音效就载入内存中,音乐和环境声就从磁盘上stream,这一点优化是Unity做不到的。不管是FMOD还是Wwise,都能够跟Unity直接连接,通过Profiler来实时查看音频部分在游戏中CPU与内存的消耗,以便进行更好的优化。音频设计师也能够更方便的测试自己做出来的声音在游戏里不同情况下的播放究竟是什么效果。&/p&&br&&p&说完了音效来说音乐。如果只是播放一个BGM的loop,是用不到中间件的,但是现在讲究点质量的游戏都会进行动态音乐或者互动音乐的设计,而这一点在Unity里是没有任何技术支持的。我曾经自己用C#写过动态音乐判定的播放规则,包括分层播放以及段落转接。虽然不是非常复杂,但毕竟音乐和程序都是我自己写的,不会有沟通理解上的困难。&b&在大多数现实情况中,程序员不懂音乐,音乐人也不懂程序,如果不用中间件,很难完美地完成音乐人想要的播放效果。&/b&&/p&&p&在手游上,尤其是休闲游戏中,许多音效是音乐化的,这就在触发时间上有了要求,我们叫做stinger。比如玩家在吃掉一个物品获得技能时,在音乐中插播一小段旋律或者鼓点。在Unity中无法做到让这些stinger卡在节拍上,除非专门去算每首音乐的节拍换算成每一拍的毫秒单位,然后加一个计时器进行除余(程序员听到这么复杂的需求很可能就觉得算了懒得弄)。&/p&&p&更复杂的是音乐段落之间的对接。音乐文件往往要留着最后的尾巴,因此时长比实际音乐的时间长。如果不留有尾巴,就会听到“噗”的一声,音乐好像突然被切掉了。在音乐之间切换的时候,如果不用中间件,程序员必须知道实际音乐的精确时间长度,而无法通过简单的AudioSource.isPlaying来判断是否进入下一段音乐。在FMOD和Wwise中,这个问题都可以非常简单地解决。Wwise还带有Pre-entry功能,让音乐开始前的前奏提前播放,达到更加智能的播放效果。&/p&&p&Wwise在音乐上的探索还远不止简单的播放分层/段落等方法。在算法生成音乐上都有了技术上的尝试。音乐人在编曲的时候先写好MIDI音符,再通过MIDI音符触发对应的采样文件来生成音乐。游戏的高互动性决定了这种预先写好的音乐是不够动态的。在Wwise中,能够支持简单的采样器功能,将音符采样导入,然后根据不同的游戏状态播放不同的音符。未来我们很可能会见到旋律永不重复的音乐游戏,就是通过这样的技术来进行音乐的动态生成,只要音乐人提供一个算法并将控制点与游戏中的参数对应。这对于绝大部分游戏而言是用不上的,但是中间件为这样的游戏设计提供了可能。如果在游戏中单独写一套AI作曲系统,开发的难度和工作量可以单独做一个游戏了。&/p&&br&&p&最后,说白了,对于中小规模的手游,使用中间件更大的好处是让本来就不多的程序员从音频部分中解放,只需要负责游戏本身的开发就可以了。本身小制作成本的游戏使用中间件也花不了多少钱,但是为程序员节省了大量的时间来重新造轮子,也让音乐人/音效师对自己制作的东西有更好的把控。对于大型游戏而言,中间件能做到一些Unity本身无法做到的功能,同时在音频的资源管理上省去了很多扯皮的麻烦。&/p&
碰巧对Unity里的声音脚本,FMOD和Wwise都比较了解,强答一下。音乐和音效还得分开说,因为这两个很多时候需求和设计很不一样。 首先,简单的2D游戏大部分时候是用不到这两个中间件的,除非是音乐游戏。而3D游戏尤其是第一人称视角的游戏中就比较有必要。中…
之前在专栏上写过相关文章:&a href=&/indiegamepixel/& class=&internal&&Light of Sight - 2D光影 - 独立游戏大像素 - 知乎专栏&/a&,贴一部分出来:&br&&br&&blockquote&&p&光影在2D游戏中就比较少见了,因为2D的图片只能储存到X和Y轴的信息,但3维空间当中的法线对3D光影的计算是必不可少的,所以3D的算法并不能直接地应用到2D当中。&/p&&p&由于纬度的缺失,2D注定没有办法制造真实的光影效果,但是在游戏这个领域,真实未必是王道。所以现有的2D光影技术,都是在利用2维的数据,制造出光影的感觉。&/p&&p&我所了解的2D方案有两种:&/p&&ol&&li&一种是类似于独立游戏Luminesca和Monaco:What's Yours Is Mine的“2D光源”; 这个方案的核心在于对阻碍物边缘的检测,常用raycast算法,计算量相对后者,甚至于3D,都会更大。&/li&&li&另一种是类似于Confederate Express和Legend of Dungeon的Normal Map。它的核心在于下图左下角的那三个人,五颜六色的是normal map,它的rbg通道并不用来记录颜色,而是用来记录人物的XYZ的数据,也就是三维的信息。有了这些信息,就可以计算出每一个点的法线,也就可以用3D的算法了。&/li&&/ol&(左上角为Luminesca,右上角为Monaco: What's Yours Is Mine,左下角为Confederate Express,右下角为Legend of Dungeon。)&br&&img src=&/7cca4dbf59d2e62537bac9a_b.jpg& data-rawwidth=&640& data-rawheight=&480& class=&origin_image zh-lightbox-thumb& width=&640& data-original=&/7cca4dbf59d2e62537bac9a_r.jpg&&&/blockquote&&br&如果你对第一种方案感兴趣,可以看看我写的一个开源的Unity插件:&a href=&///?target=https%3A///f15gdsy/2D-Light-of-Sight-Unity& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&f15gdsy/2D-Light-of-Sight-Unity · GitHub&i class=&icon-external&&&/i&&/a&,可以实现:&br&这样的效果&br&&img src=&/2516b1dfd588a8e587e76a8949eaba18_b.jpg& data-rawwidth=&1730& data-rawheight=&1154& class=&origin_image zh-lightbox-thumb& width=&1730& data-original=&/2516b1dfd588a8e587e76a8949eaba18_r.jpg&&&img src=&/4fdac72c94_b.jpg& data-rawwidth=&717& data-rawheight=&408& class=&origin_image zh-lightbox-thumb& width=&717& data-original=&/4fdac72c94_r.jpg&&
之前在专栏上写过相关文章:,贴一部分出来: 光影在2D游戏中就比较少见了,因为2D的图片只能储存到X和Y轴的信息,但3维空间当中的法线对3D光影的计算是必不可少的,所以3D的算法并不能直接地应用到2D…
已有帐号?
无法登录?
社交帐号登录

我要回帖

更多关于 unity3d引擎架构设计 的文章

 

随机推荐