游戏开发

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

1
如何使字体大小与屏幕分辨率匹配?
因此,我正在使用LibGDX进行游戏,但遇到了问题。 为了使我的游戏适合大多数分辨率,我为每个高宽比创建了一个基础资产,例如主菜单背景图像,并以800X600(4:3),1280X720(16:9)等进行制作。 现在,我正在尝试将TextButtons纳入游戏,以供选择;我的问题是我无法弄清楚哪种字体大小与哪种屏幕分辨率匹配。有没有办法解决这个问题,还是我必须逐一检查我拥有的每个分辨率,然后手动将文本与该分辨率匹配?

1
纹理大小的最佳做法
我想知道如何确定合适的纹理尺寸?当前,我总是创建1024x1024px的UV纹理,但是例如,如果我创建一个具有1024px纹理大小的大房子,它将看起来非常糟糕。 因此,我应该为这样的不同网格大小创建不同的纹理大小(512、1024等)吗?: 还是始终执行高分辨率纹理,然后在软件中减小它(例如:增加UDK中的LODBias设置来减小纹理的大小)会更好吗? 感谢您的回答。 ps:对不起我的英语!
12 3d  textures  udk 

3
将相同组件集的实体分组到线性内存中
我们从基本的系统-组件-实体方法开始。 让我们创建组合(源自长期本文章)仅仅是出于对信息类型的组件。它是在运行时动态完成的,就像我们将组件一个接一个地添加/删除到实体中一样,但是让我们更精确地命名它是因为它仅涉及类型信息。 然后,我们构造为每个实体指定集合的实体。创建实体后,它的组合是不可变的,这意味着我们无法直接对其进行修改,但是仍然可以获得现有实体对本地副本的签名(以及内容),对其进行适当的更改,然后创建一个新实体它的。 现在是关键概念:每创建一个实体,就会将其分配给一个名为assemblage bucket的对象,这意味着具有相同签名的所有实体都将位于同一容器中(例如,在std :: vector中)。 现在,系统只是遍历他们感兴趣的每个环节并完成工作。 这种方法有一些优点: 组件存储在几个(精确地:存储桶数)连续的内存块中-这提高了内存友好性,并且更容易转储整个游戏状态 系统以线性方式处理组件,这意味着改进了缓存一致性-再见字典和随机存储器跳转 创建新实体就像将组合映射到存储桶并将所需组件推回其向量一样容易 删除一个实体就像调用std :: move一样容易,将最后一个元素与删除的元素交换,因为此时顺序并不重要 如果我们有很多具有完全不同的签名的实体,那么缓存一致性的好处就会减少,但是我认为大多数应用程序都不会发生这种情况。 重新分配向量后,指针失效也存在问题-可以通过引入以下结构来解决: struct assemblage_bucket { struct entity_watcher { assemblage_bucket* owner; entity_id real_index_in_vector; }; std::unordered_map<entity_id, std::vector<entity_watcher*>> subscribers; //... }; 因此,只要出于游戏逻辑中的某种原因,我们想要跟踪一个新创建的实体,就在存储桶中注册一个entity_watcher,并且一旦在删除期间必须将该实体std :: move移开,我们便会查找其观察者并进行更新他们real_index_in_vector的新价值。在大多数情况下,这对每个实体删除都仅施加了一个字典查找。 这种方法还有其他缺点吗? 尽管很明显,为什么没有提到解决方案? 编辑:我正在编辑问题以“回答答案”,因为评论不足。 您将失去可插拔组件的动态特性,该特性是为摆脱静态类构造而专门创建的。 我不。也许我没有足够清楚地解释它: auto signature = world.get_signature(entity_id); // this would just return …

1
glDrawArrays和glDrawElements的区别
在刷新OpenGL ES的想法时,我遇到了glDrawArrays和glDrawElements。 我了解它们的用法,并有点理解它们为何与众不同。 我似乎不明白的是,我看不到如何glDrawElements保存绘图调用(保存绘图调用是我所读过的大多数书籍都提到的描述,因此我在这里提到了)。 想象一个简单的场景,其中我尝试使用2个三角形绘制一个正方形。 使用glDrawArrays时glDrawElements,我需要使用6个顶点的集合,除了具有6个元素的索引数组之外,我只需要4 个顶点。 鉴于以上所述,这是我不了解的内容: glDrawElements如果仍然需要使用索引数组(在正方形的情况下为6个索引)来索引具有4个元素(6次)的顶点数组,如何保存绘图调用?换句话说,这glDrawElements是否仍意味着总共需要进行6次抽签glDrawArrays? glDrawElements如果一个仍然需要2个数组,即一个用于顶点,一个用于索引,该如何节省空间? 为了从2个三角形绘制一个正方形,为简单起见,分别需要多少次绘制调用glDrawElements(顶点数组中4个项目,而索引数组中glDrawArrays6个项目)和(顶点数组中仅6个项目)? 谢谢。

3
如何在不破坏美观的情况下旋转像素艺术精灵?
我现在正面临一个巨大的“游戏设计”问题。我正在制作一个像素艺术的游戏,使用双线性插值可以解决很多动画问题。另一方面,它不再是“像素游戏”。 如果我使用“双线性插值”,则动画可以工作,但看起来像“混合式”,并且失去了艺术风格。我要么弄乱动画,要么弄乱艺术风格。我不能拥有两者似乎。 还有其他解决方法吗?
12 2d  rotation  pixel-art 

1
GLSL-在主要功能范围之外声明全局变量
在GLSL中声明超出主函数范围的变量是否有帮助?这些变量实际上是否可以重用并且效率更高? 这是有问题的代码: varying vec2 vposition; uniform float seed; uniform float top; uniform float bottom; uniform float phi; uniform float theta; uniform float scaledPI; uniform float yn; uniform float ym; uniform float rx; uniform float ry; uniform float radius; const float PI = 3.141592653589793238462643383; float left; float right; float mscaled; float …
12 glsl 

5
如何在基于组件的游戏中正确处理碰撞?
在围绕组件设计的游戏中,尝试绕过正确处理碰撞的方法。 我看到许多示例PhysicsComponent在实体的组件列表中添加了某种示例,但实际的实现使我感到困惑。 为了PhysicsComponent使它起作用,需要访问周围的环境。这对我来说没有直觉。组件不应该不仅意识到其容器(实体),还没有意识到其容器的容器(世界)吗? 对我来说,听起来好像关卡或场景应该维护这些实体的列表,并且每次游戏更新都会遍历这些实体以确定哪个碰撞。 我的问题是,首先,这是否是好的设计,其次,如何确定哪些实体会发生冲突。我想实体实体可以实现一个空的IRigidBody接口,以便该级别可以确定列表中的哪些实体支持冲突。但这会破坏组件设计吗? 相反,它们应该包含一个空的RigidBody成分吗?实际上,这可能会更好,因为它可能并不总是空的,而且这种方法更适合未来。唯一的问题是复杂性。场景不仅必须遍历每个实体,还必须遍历每个实体的组件,以确定它是否具有此RigidBody组件。 第三,当它们确实发生碰撞时,应该以某种方式告知两个实体,我也不确定如何做到这一点。 假设两个实体都包含一个HealthComponent,并且当它们碰撞时,两个实体的健康状况都会降低一些任意值5。我想当场景中检测到两个实体之间发生碰撞时,要负责处理此问题? 但是,现场是否要承担太多责任?当场景负责实体不应该访问的许多事物时,我可以看到这种情况可能会变得一发不可收拾并且变得笨拙。 编辑:问题已更新,具有更多详细信息。

2
如何创建合理的AI?
我正在基于Fox and Hounds游戏创建一个逻辑游戏。玩家扮演狐狸,AI扮演猎犬。(据我所知)我设法使AI完美,因此它永远不会丢失。对人类玩家来说,保持原样就不会很有趣。 现在,我必须简化AI,以便人类可以获胜,但我不确定如何获胜。当前的AI逻辑基于模式匹配-如果我引入随机移动以使棋盘超出模式空间,则AI最有可能在游戏结束之前一直处于哑巴状态。 有什么想法如何以一种不从“天才”变成“完全愚蠢”的方式愚弄AI?
11 ai 

3
我想摆脱我的“制作一切静态和全局”设计模式,但是如何做呢?
我正在太空中制作一个小地牢爬行者,我想听听一些有关如何使引擎后端更好的建议。基本上,当前所有内容都是基于管理人员的: BackgroundManager:具有AddBackground(image, parallax)制作炫酷背景效果的方法。 ConfigManager:读取/制作配置文件,还保存从该配置文件读取的数据。 DrawManager:有Draw(sprite)方法来绘制的东西到屏幕上,事情就是这样SetView(view),GetView()等等。 EntityManager:包含所有活动实体,并具有添加,删除和查找实体的方法。 DungeonManager(实际上称为GridManager,但这是为了简单):有方法,如GenerateDungeon(),PlaceEnemies(),PlaceFinish()等。 现在我什至没有列出所有我的经理,所以我认为这必须改变。我的游戏也基于屏幕,这使它更令人讨厌,因为我不需要经理管理的一半内容,例如主菜单(我的主菜单中不需要物理/实体/地下城) !) 现在,我考虑使管理器不是静态的,并为我的ScreenMainGame提供所有特定于游戏的管理器的实例。但这使打电话给/获取与管理人员有关的任何东西变得一团糟...例如,如果我想从不在的任何地方绘制地牢ScreenMainGame.Draw(),我就必须这样做... ((ScreenMainGame)ScreenManager.CurrentScreen).GridManager.Draw() 真丑。 那么,游戏开发者们,你们有谁知道如何解决这个混乱局面吗?我将不胜感激!

1
与发行商合作能帮助我防止游戏被克隆吗?
我读了许多有关“如何(或为什么没有)如何在没有发行商的情况下制作手机游戏”的文章。但是困扰我的问题是: “如果我制作一款游戏,那真的会引起市场的关注,然后人们开始玩它,但是有些发行商会看到我的游戏,并在两周内制作出非常相似的游戏,并使其更加成功!” 这是我选择与出版商同行的主要原因吗? 编辑:我主要关心的不是我花在开发上的时间(我喜欢它!)。我担心的是:我在没有发行商的情况下工作(因此使用的营销技巧不太好)可能需要一些时间才能将我的游戏发布给人们。VS其他开发者(USING发行商)可以克隆我的游戏,并与发行商一起帮助将克隆的游戏公开发行快点。在人们甚至没有意识到之前,它就是模仿。

2
这两个代码中的哪个“更好”?制作局部变量还是类变量?
我制作了更多游戏,问了更多愚蠢的问题。 希望这一段很简短。我正在创建一个非常基本的类,该类通过向刚体施加力来移动Player对象,但这让我想知道,我应该对rb进行类引用还是对Update每帧进行局部引用?(请记住,它已经存在于Monobehaviour.GameObject统一父类中)。 我想知道是否做很多局部变量会减慢整个循环的速度(通过局部变量,我的意思是在函数本身内部,而不是在类的顶部,希望我使用正确的术语)。 这就是我想做的两种方式: public class Player : MonoBehaviour { private void FixedUpdate() { Rigidbody rb = GetComponent<Rigidbody>(); float v = Input.GetAxis("Vertical"); rb.AddForce(v * rb.transform.forward * Const.walkForce); } } 要么... public class Player : MonoBehaviour { Rigidbody rb; private void Awake() { rb = GetComponent<Rigidbody>(); } private void FixedUpdate() { …
11 unity  c#  game-loop 

1
这种概念艺术和创作者是否有特定名称?
假设您已经具备了游戏的基础知识:您创建了自己和(可能的)游戏测试人员认为玩起来很有趣的游戏玩法,并且您认为自己可以充实自己的游戏。但是,在此阶段,它们全都是无色的块和圆锥体。它仍然只是一个原型,您对游戏的外观没有清晰的认识。 在尝试将引人入胜的游戏引擎粘合在一起之前,您需要创建一个游戏外观模型,就像Bloodstained在其Kickstarter页面上的表现一样: 这些不是游戏中的屏幕截图,而是在游戏开始之前制作的。这些原型图像如何命名?他们的艺术家如何命名?如果我想雇用一名艺术家来为我的游戏制作一个或多个可能的外观原型,我必须寻找什么样的“关键字”?

2
如何进行延迟的鼠标输入?
我有一个赛车游戏,想法是玩家喝醉了。我希望鼠标有一个延迟的输入,您将鼠标左右移动来转动。 如何在用户提供的输入和汽车转弯量之间设置恒定的延迟? 现在我有这个: h = Mathf.Lerp(h, (((Input.mousePosition.x / Screen.width) * 2) - 1), Time.deltaTime * 2); 发生的情况是转弯被延迟了,但是非常慢,换句话说,如果我非常快地移动鼠标,汽车会非常缓慢地转弯,但是如果我将乘数提高到Time.deltaTime,汽车会转弯更快,但是延迟效果会最小化。 我还能怎么做?
11 unity  c#  input  mouse 

1
实体组件系统-如何实现对象的变换?
在为引擎设计实体组件系统时,我在存储和检索特定类型的组件方面遇到了一些麻烦。 首先,让我澄清一下我将在此问题中使用的一些术语: 我将“ 组件 ”称为一种数据结构,用于存储特定系统的相关数据。 我称“ 系统 ”为方法和数据结构的聚合,它利用组件来更新与用户的游戏状态/界面。 “ 实体 ”基本上只是一个ID,用于检索游戏逻辑中的特定组件并修改其数据。 每个系统都拥有其组件类型(例如Physics-> PhysicsComponent,AI-> AIComponent,Rendering-> RenderingComponent)的(ID映射)数组,因此它可以有效地遍历数据。 但是,并非所有组件都专门由系统拥有。例如,“变换”组件存储对象的位置,旋转和比例。它是实体最重要的部分之一(Unity甚至使它成为强制性的),因为它被许多系统使用,例如物理,AI,渲染等。 这几乎就是我面临的问题。由于其他许多系统都使用了Transform,因此我应该如何为每个组件检索一个?我看到的一种可能的解决方案是使每个组件存储自己的实体ID。这样检索任何组件很容易,但是效率不高,而且它与组件的概念相反,后者是孤立的独立数据束,不知道其他任何组件。 是否有解决此问题的正确方法?变形应该成为一个组成部分吗?

2
检查游戏对象的组件是否可以销毁
在Unity中开发游戏时,我正在大量使用[RequireComponent(typeof(%ComponentType%))]以确保组件满足所有依赖性。 我现在正在实现一个突出各种UI对象的教程系统。要进行突出显示,我要引用GameObject场景中的,然后使用Instantiate()克隆它,然后以递归的方式删除显示不需要的所有组件。问题在于,随着RequireComponent这些组件的广泛使用,许多组件无法简单地以任何顺序删除,因为它们由尚未删除的其他组件所依赖。 我的问题是:有没有一种方法可以确定是否Component可以将a 从GameObject当前连接的对象中删除。 我发布的代码在技术上可以正常工作,但是会引发Unity错误(如图所示,未在try-catch块中捕获) 这是代码: public void StripFunctionality(RectTransform rt) { if (rt == null) { return; } int componentCount = rt.gameObject.GetComponents<Component>().Length; int safety = 10; int allowedComponents = 0; while (componentCount > allowedComponents && safety > 0) { Debug.Log("ITERATION ON "+rt.gameObject.name); safety--; allowedComponents = 0; foreach (Component c in …
11 unity  c# 

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.