游戏开发

专业和独立游戏开发人员的问答

3
使用float可以使最大的“相对”水平是多少?
就像在《地牢围攻》和KSP等游戏中所演示的那样,由于浮点的工作原理,足够大的级别将开始出现故障。您不能在不损失精度的情况下将1e-20添加到1e20。 如果选择限制关卡的大小,如何计算对象开始变得不稳时可以移动的最低速度?

3
C#和UnityScript在Unity开发中有何不同?[关闭]
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,使其成为Game Development Stack Exchange 的主题。 5年前关闭。 除了明显的语言差异之外,在Unity3D中开发游戏时,UnityScript和C#有何不同? 有明显的性能差异吗? UnityScript代码是否按原样打包?如果是,这是否有助于游戏的可修改性? 是否可以使用针对一种语言开发的库,而同时使用另一种语言开发? 两种语言可以在同一个Unity项目中混合使用吗?在C#中编码某些部分,在UnityScript中编码其他部分?

1
Sprite Mode为Multiple时,如何以编程方式访问单个Sprite?
Unity 4.3新增了一项功能,可以将子画面表分割为多个单独的子画面。这很有用,因为您只需要一个主Spritesheet,但是仍然可以引用单个Sprite。通过将Sprite Mode设置为Multiple来完成。 可以从Unity Sprite Editor中以编程方式访问从主文件生成的所有Sprite吗? 例如:我有一个带有50x50精灵网格的Spritesheet。使用Unity Sprite Editor,我现在有250个Sprite :spritesheet_0, spritesheet_1, ..., spritesheet_249。如何获得一个句柄,spritesheet_102而不必在Unity编辑器中手动将其拖放?

4
如何用粒子实现软边缘区域
我的游戏是使用Phaser创建的,但问题本身与引擎无关。 在我的游戏中,我有几个环境,本质上是玩家角色可以进入并受到其影响的多边形区域。例如,冰,火,毒药等。这些区域的图形元素是颜色填充的多边形区域本身,以及适当类型的粒子(在此示例中为冰碎片)。这就是我目前正在实现的方式-使用覆盖有粒子图案的tileprite的多边形蒙版: 硬边看起来不好。我想通过做两件事来改进:1.使多边形填充区域具有柔和的边缘,并融合到背景中。2.让一些碎片离开多边形区域,这样它们就不会在中间切开并且该区域没有直线 例如(样机): 我认为模糊多边形可以实现1,但是我不确定如何处理2。 您将如何实施呢?

4
“第二人称”观点将包括什么?
传统叙事具有以下三种观点之一: 第一人称(I fought the monster) 第二人称(You fought the monster) 第三人称(He/She/It fought the monster) 第一人称和第三人称视角在视频游戏中非常普遍,但我想知道第二人称视角会是什么样。 第一人称('I' am the character, seeing through 'my' eyes) 第二人称(???) 第三人称(He/She/It is the character, seen through a third party's eyes) 我唯一能想到的是一个游戏,其中视点是您不直接控制的角色,通常(总是?)是谁在看您的角色。但是,这与相机非常有限的第三人称视角有何不同?

5
为什么现代游戏没有额外的生命?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 6年前关闭。 在80年代末和90年代初,大多数游戏都具有额外的生活机制。玩家开始时的生命有限(通常为三岁),而濒临死亡的人耗尽了其中的一生。如果仍有剩余,它们将在最后一个保存点重生。一旦所有生命都用尽了,游戏就结束了,他们必须从头开始。玩家可以在游戏中获得额外的生命。 这种机制使用得如此广泛,以至于游戏不使用它时就是例外。它曾经是而且现在仍然是最受认可的电子游戏陈词滥调之一(上面的图像已经印在了无数的衬衫上)。 如今,这个机制似乎已经被人们遗忘了。 几乎每一款现代游戏都会使玩家从上一次保存中无限次重试。许多人甚至可以让玩家通过快速保存机制自己保存点。那些试图有所不同的少数人倾向于另一个极端:“流氓”机制使玩家没有重试的机会。 拥有额外生命的中间地层发生了什么?哪些游戏设计革命导致游戏行业放弃了此功能? 在提出该问题的答案时,请尽量使用引证和事实,客观证据来备份您的答案,以免将该帖子拖入“过分基于观点”的领域。专注于“发生了什么”和“何时发生”的具体例子。

2
我应该如何处理丢失的资源?
您的游戏预期会加载某种资产,但找不到。情况应如何处理?例如: Texture* grassTexture = LoadTexture("Grass.png"); // returns NULL; texture not found Mesh* car = LoadMesh("Car.obj"); // returns NULL; 3D mesh not found 在开发过程中,它可能已被用户意外删除,损坏或拼写错误。 一些潜在的回应: 断言(理想情况下仅在开发期间) 优雅退出游戏 引发异常并尝试处理它。 哪种方法最好?

3
如何在网格上使用A *制作看起来自然的路径?
我一直在阅读:http : //theory.stanford.edu/~amitp/GameProgramming/Heuristics.html 但是有些事情我不理解,例如,文章说使用这样的东西进行对角线运动的寻路: function heuristic(node) = dx = abs(node.x - goal.x) dy = abs(node.y - goal.y) return D * max(dx, dy) 我不知道如何像本文中那样设置D来获得自然的外观路径,就像上面所说的那样,我将D设置为相邻正方形之间的最低成本,而且我不知道它们对启发式技术的意义是什么。是4 * D,那似乎并没有改变任何事情。 这是我的启发式功能和移动功能: def heuristic(self, node, goal): D = 5 dx = abs(node.x - goal.x) dy = abs(node.y - goal.y) return D * max(dx, dy) def move_cost(self, …

5
每秒设置帧上限有什么好处?(如果有)
我正在使用OpenGL开发一个简单的游戏,使用SDL进行显示初始化和输入,从时间的角度来看,我有两个选择。当以秒为单位的optimableTimePerFrame = 1 / theFramerateCap时,排名第一的仅是为optimizeTimePerFrame休眠的-theTimeTakenToRender。(我不完全确定这是否必要,因为这等效于使用vsync,这可能更准确。如果我的假设正确,请告诉我SDL + OpenGL是否默认具有vsync,如果没有,另一种方法是测量自渲染最后一帧以来的时间,并仅相应地调整运动。(渲染框架所花费的时间越短,实体在该框架中移动的距离越少)。在性能,减少闪烁等方面,这两种方法的优缺点是什么?
13 opengl  sdl  frame-rate  vsync 

2
由于或尽管有大量图像,我是否应该使用Spritesheets?
我正在开发2D游戏,并且我有很多精灵。我使用3D动画和模型将其渲染为2D,从而使它们看起来像“ Fallout”或“ Diablo”。比手工绘制还容易,哈哈。 我已经不得不将帧速率降低到15fps,这是我可以降低的最低帧速率,而又不会使它们看上去不连贯。但是,由于24帧的平滑度令人难以置信,这令人感到悲伤。 我这样做的原因有两个: 1)减少硬盘空间。图片越少,我的整体游戏就越小。 2)减少RAM消耗。加载的图像越少,我越有可能避免导致RAM限制过大的问题。 但是,如果有一种方法可以压缩HDD空间和RAM中的图像,我会这样做。我之前已经对其进行过测试,从RGBA8888到RGBA5555的赠品在质量上几乎没有任何变化,而在TexturePacker程序中转换为RGBA4444时仅受到了一点打击。我目前不这样做,因为SFML似乎使用相同数量的内存,而不管它是哪种类型的.PNG图像。我研究了如何以不同的方式加载它,但是未能找到关于该主题的任何内容。 我已经阅读了很多有关如何处理2D视频游戏的内容。共识是压倒性的:将您的Sprite打包成更大的纹理以获得出色的性能!因此,我使用TexturePacker将微小的Sprite打包到更大的Spritesheet中。 但是,我计划每个角色有10-15个动画,移动5个方向,每个动画15-40帧(平均24个)。具有15个动画,5个方向,每个动画平均24帧;即每个字符1800个单独的帧。如果装在一张精灵纸中,则只能显示75张图像。(每个动画每个方向一个精灵表。15* 5) 对于游戏中一个巨大的老板角色,我不能使用Spritesheet,而必须编程一种仅一次加载一张图像的方法。我不知道我是否可以这样做以提高性能。 对于角色,我已经将它们打包在一张spritesheet中。对于单个角色来说,这似乎在大多数时间都有效,尽管有时会停顿。但是,我将其归因于我构思错误的代码,该代码交换了纹理,而不是预加载该角色的所有纹理。 如果我要预加载纹理,则对于精灵表来说是有意义的。我只能想象为每个角色预加载1800个小图像是一个坏主意。 但是,我想一次将它们流式传输到内存中是非常快的,所以我只需要一次在内存中有一个图像。这是否意味着在任何给定时刻我只会让每个字符消耗几个KB而不是45 + MB? 我想这会破坏我的性能,因为流传输必须非常快(每秒15张图像进出内存和渲染,每秒),尽管这些图像非常小-加载字符Spritesheets可能是一个更好的主意进入内存。但是无论如何,我将不得不为我的大老板角色编写一个类似于单图像流的渲染系统。 我一直在尝试,但这不是一个简单的过程。特别是考虑到我正在研究游戏引擎的其他部分,而这些部分现在还不处理图形。

6
为什么我应该禁止在MMO中​​进行真实货币交易?
我很快将通过MMO游戏公开发售,并且目前正在编写我希望玩家遵循的使用条款(不发誓,不发垃圾邮件,不作弊...您明白了)。 我的游戏允许玩家相互交易稀有物品。 我注意到,几乎所有具有交易功能的在线游戏通常在其使用条款中都有一条条款,明确禁止玩家以真实货币交易游戏内物品或游戏内货币。 我想知道这条规则的原因。为什么要禁止在MMO中​​进行真实货币交易?

1
进行平面反射时要考虑波浪
我一直在研究SDK中Nvidia的示例,尤其是Island11项目,并且我发现了一些对HLSL代码感到好奇的东西,该代码根据波高的状态上下校正反射。 自然地,在检查了简短的代码段之后: // calculating correction that shifts reflection up/down according to water wave Y position float4 projected_waveheight = mul(float4(input.positionWS.x,input.positionWS.y,input.positionWS.z,1),g_ModelViewProjectionMatrix); float waveheight_correction=-0.5*projected_waveheight.y/projected_waveheight.w; projected_waveheight = mul(float4(input.positionWS.x,-0.8,input.positionWS.z,1),g_ModelViewProjectionMatrix); waveheight_correction+=0.5*projected_waveheight.y/projected_waveheight.w; reflection_disturbance.y=max(-0.15,waveheight_correction+reflection_disturbance.y); 我的第一个猜测是,当它受到垂直扰动(波浪)时,它会补偿平面反射,将反射的几何图形移动到一个什么都没有的位置,而水只是像没有东西或只有天空一样被渲染: 现在,那是天空在反射,我们应该看到该地形的绿色/灰色/黄色反射与水线基线相关的地方。我的问题是,现在我无法真正查明其背后的逻辑是什么。投影波浪/水几何图形的一个点的实际世界空间位置,然后乘以-.5f,仅进行同一点的另一个投影,这一次其y坐标更改为-0.8(为什么是-0.8?)。 代码中的线索似乎表明它是通过反复试验得出的,因为存在冗余。例如,作者采用投影的y坐标的负一半(在w除后): float waveheight_correction=-0.5*projected_waveheight.y/projected_waveheight.w; 然后对第二点做同样的事情(我想只是为了肯定,为了得到某种区别),并将它们结合起来: waveheight_correction+=0.5*projected_waveheight.y/projected_waveheight.w; 通过除以2,我看不出质量改善方面有什么区别(如果有人愿意纠正我,请这样做)。问题的症结似乎是预计y的差异,为什么呢?这种冗余以及-.8f和-0.15f的任意选择使我得出结论,这可能是启发式/猜测式工作的组合。是否有逻辑上的依据,或者只是绝望的破解? 这是代码段修复的初始问题的夸张,在最低细分级别上观察到。希望这可能会引发一个我想念的想法。-.8f可能是一个参考高度,从中可以推断出多少扰动纹理坐标以采样平面反射的几何体渲染,而-.15f可能是下限,这是一种安全措施。

3
重建阴影效果
我会简短。如何实现下图所示的效果?实时进行是否可行?它看起来看似简单,但事实并非如此。我可以搜索任何关键字以获取有关对着色器进行编程以实现此外观的更多信息吗?谢谢。

1
制作PS4游戏的过程是什么?
既然索尼已经说过开发人员可以自行为PS4发行,我敢打赌,会有更多的人对为该平台制作游戏感兴趣。 获取PS4的SDK,文档和测试环境的过程是什么?

3
数组对象还是对象数组?
我正在制作一个管理模拟游戏,类似过山车大亨。我想知道构造我的世界对象的最佳方法是什么,以便最大化性能。 假设我的游戏中有5,000人,我可以: 创建一个对象并将其存储在数组中,如下所示: class person() { this.x = 0; this.y = 0; this.thirst = 15; this.hunger = 15; // etc.. add methods: public findPath(int destX, int destY) { // and so on } people = new person[5000]; for (int = 0; i < 5000; i++) { people[i] = new person; …

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.