Questions tagged «c#»

C#是Microsoft与.NET平台一起创建的一种多范例,托管,强类型,垃圾回收的编程语言。

3
如何在基于组件的实体系统中正确实现消息处理?
我正在实现一个具有以下内容的实体系统变体: 一个实体类是多一点的ID结合部件一起 一堆没有“组件逻辑” 的组件类,只有数据 一堆系统类(又名“子系统”,“管理器”)。这些完成所有实体逻辑处理。在大多数基本情况下,系统只是遍历它们感兴趣的实体列表并对其进行操作 甲MessageChannel类对象被所有的游戏系统共享。每个系统都可以订阅特定类型的消息以进行收听,还可以使用该频道将消息广播到其他系统 系统消息处理的初始变体是这样的: 依次在每个游戏系统上运行更新 如果系统对某个组件执行了某些操作,而其他系统可能对此操作感兴趣,则该系统会发送一条适当的消息(例如,系统调用 messageChannel.Broadcast(new EntityMovedMessage(entity, oldPosition, newPosition)) 每当实体移动时) 订阅特定消息的每个系统都会得到其消息处理方法,称为 如果系统正在处理事件,并且事件处理逻辑要求广播另一条消息,则立即广播该消息,并调用另一条消息处理方法链 在我开始优化碰撞检测系统之前,这个变体是可以的(随着实体数量的增加,它变慢了)。首先,它只是使用简单的蛮力算法迭代每个实体对。然后,我添加了一个“空间索引”,该索引具有一个单元格网格,该网格存储特定单元格区域内的实体,因此仅允许对相邻单元格中的实体进行检查。 实体每次移动时,碰撞系统都会检查该实体是否与新位置的物体发生碰撞。如果是,则检测到冲突。并且,如果两个碰撞的实体都是“物理对象”(它们都具有RigidBody分量,并且打算彼此推开以免占据相同的空间),则专用的刚体分离系统会要求运动系统将实体移动到某个将他们分开的特定职位。这进而导致运动系统发送消息,通知已更改的实体位置。碰撞检测系统旨在做出反应,因为它需要更新其空间索引。 在某些情况下,这会引起问题,因为单元的内容(C#中的Entity对象的通用列表)在进行迭代时会被修改,从而导致迭代器抛出异常。 那么... 如何防止碰撞系统在检查碰撞时被打断? 当然,我可以添加一些“聪明” /“棘手”逻辑来确保正确地迭代单元格内容,但是我认为问题不在于碰撞系统本身(在其他系统中也存在类似问题),而是消息在系统之间传播时得到处理。我需要某种方式来确保特定的事件处理方法能够正常工作,而不会造成任何干扰。 我尝试过的 传入消息队列。每当某个系统广播消息时,该消息就会被添加到对该消息感兴趣的系统的消息队列中。当每帧调用系统更新时,将处理这些消息。问题是:如果系统A将消息添加到系统B的队列中,则如果系统B的更新要晚于系统A(在同一游戏框架中),则它工作良好;否则,它将导致该消息处理下一个游戏框架(某些系统不希望使用) 传出邮件队列。当系统处理事件时,它将广播的所有消息添加到传出消息队列中。消息无需等待系统更新被处理:在初始消息处理程序完成工作后,它们将立即得到处理。如果对消息的处理导致其他消息被广播,它们也将添加到传出队列中,因此所有消息都在同一帧中进行处理。问题:如果实体生存期系统(我用一个系统实现了实体生存期管理)创建了一个实体,它将通知某些系统A和B。当系统A处理该消息时,它将导致一系列消息,这些消息最终导致所创建的实体被破坏(例如,在与某个障碍物碰撞的位置处创建了一个项目符号实体,这会导致项目符号自毁)。在解析消息链时,系统B没有获得实体创建消息。因此,如果系统B也对实体破坏消息感兴趣,它将得到它,并且只有在“链”完成解析之后,它才会得到初始实体创建消息。这将导致销毁消息被忽略,创建消息被“接受”, 编辑-回答问题,评论: 碰撞系统迭代时,谁修改了单元格的内容? 当碰撞系统正在对某个实体及其邻居进行碰撞检查时,可能会检测到碰撞,并且该实体系统将发送一条消息,其他系统立即对此进行响应。对消息的反应可能导致其他消息被创建并立即处理。因此,即使先前的碰撞检查尚未完成,其他一些系统也可能会创建一条消息,表明碰撞系统随后需要立即进行处理(例如,移动了一个实体,因此碰撞系统需要更新其空间索引)。 您不能使用全局传出消息队列吗? 我最近尝试了一个全局队列。它引起新的问题。问题:我将储罐实体移动到墙实体(储罐由键盘控制)。然后我决定改变坦克的方向。为了将水箱和墙壁的每个框架分开,CollidingRigidBodySeparationSystem将水箱从墙壁上移开的最小可能量。分离方向应与水箱的移动方向相反(游戏图纸开始时,水箱应看起来好像从未移入墙壁)。但是方向变成了与新方向相反的方向,因此将储罐移动到与最初不同的另一侧。发生问题的原因:这是现在处理消息的方式(简化代码): public void Update(int deltaTime) { m_messageQueue.Enqueue(new TimePassedMessage(deltaTime)); while (m_messageQueue.Count > 0) { Message message = m_messageQueue.Dequeue(); this.Broadcast(message); } } …

6
一种存储潜在无限2D地图数据的方法?
我有一个2D平台程序,当前可以处理100 x 100的块,块坐标存储为long,因此这是地图的唯一限制(maxlong * maxlong)。所有实体位置等都与块相关,因此没有限制。 我遇到的问题是如何在没有成千上万个文件的情况下存储和访问这些块。有什么想法可以实现快速低成本的高清存档格式,而无需一次打开所有内容?
29 xna  2d  c#  maps  platformer 

1
使模型面向目标
我有两个对象(目标和播放器),都具有位置(Vector3)和旋转(四元数)。我希望目标旋转并正对着玩家。目标射击时,应该向玩家射击。 我已经看到了很多关于播放器的示例,但是我不希望增量旋转,好吧,我想,只要我可以将播放器设置为100%,并且只要它确实起作用就可以。 仅供参考-我无法使用位置和旋转来做很多其他事情,而且除了我无法弄清楚的最后一件作品外,其他一切都很好。 代码示例在Target的类中运行,Position =目标位置,Avatar =玩家。 编辑 我现在正在使用他提供的Maik的C#代码,效果很好!
28 xna  c#  3d  models  quaternion 

10
在Pong中,当球从球拍反弹时,如何计算球的方向?
我正在努力解决游戏开发中的这个Hello World-y问题。我已经在XNA中创建了一个TicTacToe游戏,所以我想下一步将是Breakout克隆。 请记住,我没有在游戏编程甚至什么数学,我应该适用于那些知识。这就是为什么我问这个问题。 问题:如何确定球击中屏幕底部的桨时应该反弹的位置? 我以为会是这样的: 捕获传入球的速度和角度。 检测它触摸条的位置(最左边,最右边,中间),并据此使其在触摸外部区域时具有更高的速度。 这就是我卡住的地方。呵呵。 有什么见解吗?我意识到这不是一个简单的答案类型问题,但是我确信这是每个​​人在某个时候都面临的问题。 我正在阅读该网站上推荐的《线性代数》一书,但我仍然不知道是否应该在这里应用它。
28 xna  c#  2d  mathematics  physics 

2
如何在Unity中正确画一条线
我正在开发一款游戏,该游戏要求我从更正式的角度出发画一条线 给定坐标为x,y的点A,我画了n条线,第i条线的坐标为xi,yi。鉴于Unity3D中的LineRenderer功能,我无法从特定点绘制多条线,因为它仅渲染多段线。 我目前正在使用Debug.DrawLine()方法,该方法成功呈现了线条。我已经尝试使用GL.Begin()(如Unity示例所示),但是看不到绘制的线条。 我的问题是:还有其他方法可以做到这一点吗?如果没有,您能告诉我如何在播放模式下显示使用Debug.DrawLine()绘制的线吗?我已经看到可以使用Gizmos.DrawLine(),但我不太了解它的用法。
27 c#  unity 

3
团队如何防止覆盖源文件中的工作?[关闭]
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,使它成为Game Development Stack Exchange 的主题。 4年前关闭。 在我看来,有一种可能性,例如由多个人同时处理游戏引擎时,如何防止覆盖? 假设开发者一在工作,Audio.cpp而开发者二也在工作Audio.cpp,这在大型团队中通常如何进行管理以应对覆盖?(换句话说,要阻止开发人员2打开文件,直到开发人员1完成)
26 project-management  version-control  teamwork  java  2d  collision-detection  vector  collision-resolution  unity  directx  directx11  directx10  xna  ios  monogame  windows-phone-8  xamarin  design-patterns  oop  xna  collision-detection  collision-resolution  bounding-boxes  rotation  collision-detection  mathematics  javascript  algorithm  separating-axis-theorem  xna  2d  monogame  image  xna  directx  graphics  performance  opengl  2d  3d  c++  directx11  unity  c#  scale  c#  xna  collision-detection  collision-resolution  leaderboards  scoring  glsl  srgb  tilemap  three.js  tiled  unity  physics  xml  dialog-tree  xna  c#  .net  opengl  lwjgl  vbo  physics  graphics  procedural-generation  simulations  water  opengl  java  textures  lwjgl  frame-buffer  unity  unity  2d  collision-detection  collision-resolution  trigonometry  java  android  libgdx  xna  c#  frame-rate  c++  unreal-4  procedural-generation  java  graphics  lwjgl  slick  c++  software-engineering 

1
为什么我总是要考虑创建和使用对象池,而不是即时实例化新对象?
我已经多次(从最佳实践的角度)了解过这种模式: 内存分配:始终考虑创建和使用对象池,而不是即时实例化新对象。这将有助于减少内存碎片,并减少垃圾收集器的工作。 但是,我不知道这实际上意味着什么。我该如何实施? 例如,我可以实例化一个GameObject使用InstantiateUnity 的方法吗? Instantiate(prefab, new Vector3(2.0F, 0, 0), Quaternion.identity); 不鼓励这种用法吗?还有什么意思?

3
有更快的正弦功能吗?
我正在研究3D Perlin噪声。C#数学库似乎对我需要的东西来说是过高的,因为它的大多数功能都使用双精度。我在多个地方使用Math.Sin()来产生噪声。有谁知道更快的正弦函数?
25 xna  c#  mathematics 

4
如何在最小/不使用可视化编辑器的情况下在Unity中构建游戏?
我想完全用C#编写游戏。在搜索引擎时,我找到了Unity3D,但是所有教程和文档都在谈论可视化编辑器和Unity IDE,您可以在其中单击并指向以创建场景和脚本。 我不想那样做。我更喜欢完整的代码覆盖范围,而不是设计师从我身上抽象出来的东西。我只想从头开始编写纯C#代码,或者如果需要,可以编写Unity脚本。我找不到有关此操作的任何解释或文档。我该如何使用Unity来构建游戏并最小化(或不使用)可视化编辑器?
24 c#  unity 

7
如何避免Unity中紧密的脚本耦合?
不久前,我开始与Unity合作,但我仍然在紧密耦合脚本的问题上挣扎。如何构造代码以避免出现此问题? 例如: 我想在单独的脚本中拥有健康和死亡系统。我还希望拥有不同的可互换步行脚本,这些脚本可让我更改玩家角色的移动方式(如Mario中的基于物理的惯性控件,以及Super Meat Boy中的紧致,抽搐控件)。Health脚本需要保留对Death脚本的引用,以便在玩家的Health达到0时可以触发Die()方法。Death脚本应该保留对所使用的walking脚本的一些引用,以禁止在死亡时行走(I厌倦了僵尸)。 我通常创建界面,比如IWalking,IHealth和IDeath,这样我就可以改变在心血来潮这些元素没有打破我的代码的其余部分。我希望它们由播放器对象上的单独脚本设置,例如PlayerScriptDependancyInjector。也许这脚本将会为社会IWalking,IHealth和IDeath属性,使依赖可以通过从检查关卡设计师通过拖放相应的脚本进行设置。 这样一来,我可以轻松地将行为添加到游戏对象中,而不必担心硬编码的依赖项。 Unity中的问题 该问题是,在团结,我不能在检查暴露的接口,如果我写我自己的检查人员,引用不会得到序列化,这是一个很大的不必要的工作。这就是为什么我只剩下编写紧密耦合的代码的原因。我的Death脚本公开了对脚本的引用InertiveWalking。但是,如果我决定要让玩家角色紧密控制,就不能只拖放TightWalking脚本,就需要更改Death脚本。糟透了 我可以应付,但是每次我做这样的事情,我的灵魂都会哭。 Unity中接口的首选替代方法是什么?我该如何解决这个问题?我找到了,但是它告诉了我我已经知道的,并且没有告诉我如何在Unity中做到这一点!这也讨论了应该做什么,而不是如何做,也没有解决脚本之间紧密耦合的问题。 总而言之,我觉得这些是为那些具有游戏设计背景来到Unity的人而写的,他们只是学习如何编写代码,而对于普通开发人员而言,关于Unity的资源很少。有什么标准的方法可以在Unity中构造代码,还是我必须弄清楚自己的方法?
24 c#  unity  scripting 

7
多线程2D重力计算
我正在开发一个太空探索游戏,目前我已经开始研究重力(在XNA的C#中)。 重力仍然需要调整,但是在我能够做到这一点之前,我需要在物理计算中解决一些性能问题。 这使用了100个对象,通常不进行物理计算就可以渲染其中的1000个对象,而FPS则超过300 FPS(这是我的FPS上限),但是超过10个左右的对象会将游戏(及其运行的单线程)带入在进行物理计算时会屈膝。 我检查了我的线程使用情况,发现第一个线程正在杀死所有工作,因此我认为只需要对另一个线程进行物理计算即可。但是,当我尝试在另一个线程上运行Gravity.cs类的Update方法时,即使Gravity的Update方法中没有任何内容,游戏仍然会降低到2 FPS。 Gravity.cs public void Update() { foreach (KeyValuePair<string, Entity> e in entityEngine.Entities) { Vector2 Force = new Vector2(); foreach (KeyValuePair<string, Entity> e2 in entityEngine.Entities) { if (e2.Key != e.Key) { float distance = Vector2.Distance(entityEngine.Entities[e.Key].Position, entityEngine.Entities[e2.Key].Position); if (distance > (entityEngine.Entities[e.Key].Texture.Width / 2 + entityEngine.Entities[e2.Key].Texture.Width / 2)) …

3
UnityEngine.Random和System.Random有什么区别?
这有什么不同 int randomNumber = UnityEngine.Random.Range(0, 10); 和这个 // on top of the class private System.Random _rnd = new System.Random(); // inside a methode of the same class int randomNumber = _rnd.Next(0, 10); 我知道System.Random必须始终在类的顶部进行初始化,UnityEngine.Random不需要使用什么。我也知道这System.Random适用于实习生“时钟”,“随机”数字是基于此的。 我的问题是,现在UnityEngine.Random和System.Randomand 之间还有其他区别,并且更适合在Unity项目中使用巫婆代码?
24 unity  c#  random 

3
存储游戏范围变量的最佳方法
我有一个选项屏幕来处理诸如难度,分辨率,全屏等内容,但是我正在努力寻找在运行时存储/获取这些变量的“最佳”方法。 当前,我实现了一个Constants包含所有GameOption枚举的类,但是如何为所有这些选项选择默认值?另外,如何获取当前选择的枚举? 具体来说,关于分辨率,我决定存储这些值,但是我不确定如何获取默认值或当前存储的值。任何方向都很好;谢谢!:) namespace V1.test.RPG { public class GameOptions { public enum Difficulty { EASY, MEDIUM, HARD } public enum Sound { ON, QUIET, OFF } public enum Music { ON, QUIET, OFF } public enum ResolutionWidth { SMALL = 1280, MEDIUM = 1366, LARGE = 1920, WIDESCREEN = 2560 …
23 c#  2d 


6
用户友好但仍然灵活的基于组件的实体系统有哪些设计?
我对基于组件的实体系统感兴趣已有一段时间了,并阅读了无数文章(Insomiac游戏,相当标准的Evolve Your Hierarchy,T-Machine,Chronoclast ...等)。 它们似乎都在某种东西的外部具有结构: Entity e = Entity.Create(); e.AddComponent(RenderComponent, ...); //do lots of stuff e.GetComponent<PositionComponent>(...).SetPos(4, 5, 6); 而且,如果您引入了共享数据的概念(这是到目前为止我所见过的最好的设计,因为这并不是在所有地方都复制数据) e.GetProperty<string>("Name").Value = "blah"; 是的,这非常有效。但是,它并不是最简单的读写方法。感觉很笨拙,而且对您不利。 我个人想做这样的事情: e.SetPosition(4, 5, 6); e.Name = "Blah"; 当然,获得这种设计的唯一方法是回到Entity-> NPC-> Enemy-> FlyingEnemy-> FlyingEnemyWithAHatOn这种设计试图避免的层次结构。 有没有人看到这种组件系统的设计既灵活又保持了用户友好性?就此而言,设法以一种很好的方式解决(可能是最困难的问题)数据存储? 用户友好但仍然灵活的基于组件的实体系统有哪些设计?

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.