基本架构/处理许多具有不同更新策略的游戏对象

时间:2015-05-30 11:26:07

标签: unity3d

对于我的新项目,我在过去几周尝试了一些不同的方法,但没有很好的解决方案。这是我的“要求”。

将会有许多具有许多对象的“级别”。玩家一次只能处于一个级别,但所有其他级别需要更新(详情如下)。一个级别的大多数对象都是静态的,甚至不需要更新。我猜70%是静态的,不会被移动,很少更新。 10%将是静态的,但需要更新(详情如下),缺失的20%将是可移动的。一级可以容纳15.000个对象甚至更多。

什么是对象:它是一个将从场景管理器管理的实体 - > levelmanager并且可以表示像小行星或某些障碍物这样的简单对象。但它也可以是一个“根容器”,用于更复杂的事情,如车站。在这种情况下,电台负责处理其子组件(不是Unity组件)的更新资料

播放器当前处于大多数对象中的活动“级别”需要每帧更新(行为更新)。有些可以在不同的(固定)更新中更新。处于当前“非活动”级别的所有其他对象将根据对象和状态在不同(固定)更新中更新。

如果某个级别处于活动状态,则不需要拥有GameObject(占用大量内存)。对于一堆不会移动的障碍,我可以创建一个根对象并保持位置/旋转。因此,随着时间的推移,所有“业务逻辑”都必须在这些对象中完成。对于可以移动的物体,我有一个管理器,它将处理动作(简单的位置转换,没有物理等)。

如果对象处于活动级别,我必须更改某些行为。更新资源仍将通过场景/级别管理器。在移动对象的情况下,“Movementsmanager”必须从简单的翻译切换到更复杂的系统。对于每个对象(和子对象),都有一个相应的GameObject链接到Object,并且有一些用于移动/交互的组件,以及当对象对于玩家可见时只有相关的东西。在玩家SpaceShip(游戏)对象的情况下,有一个组件具有移动和与其他东西交互的方法。它还可以保存组件以显示盾牌等内容。但是像shieldenergy更新/充值这样的所有操作都不是Unity组件。

例如对象Ship(类)可以容纳从LevelManager更新的WeaponManager,EnergyManager,CargobayManager等。当船舶“活动”并且可以从玩家看到(处于活动等级)。相应的GameObject有一个组件来“触发”枪支或倾倒货物。因此,我将组件与对象和加工管理器链接。

好处是我可以管理/更新/使用所有对象而无需使用GameObject甚至Unity。但是它非常OOP,在创建与对象(枪位等等)相匹配的预制件时可能会变得棘手。此外,我喜欢在预制件上拖动和dr一个组件的风格,并说“好了,现在你得到一个盾牌”。所以每个人都可以像船一样配置预制件。但在这种情况下,我必须将每个Object保存为GameObject。即使它被禁用它需要很多内存,并且从我的测试中将有超过1.000.000个对象。混合方法可以是我构建自己的基于组件的结构,以满足我的需求。 (IObjectComponent的集合?)但仍然松散的拖放。或者是否可以从对象获取UnityComponents并使用它,即使GameObject被销毁了?

为了避免(浮动)抖动的问题,我使用浮动原点方法和2个坐标系统。 1:“subLevelSpace”的范围是-6.000到6.000(示例),并将对象定位在LevelSpace中。 2:LevelSpace:是一个带有INT的Vector3,其作用类似于最大SubLevelSpace的乘数。示例:object具有SubLevel:100,0,50和LevelSpace:60,2,0绝对坐标将为:360.100,0,50。

所以我的问题是: - 处理(游戏)对象和相应组件的更好/最佳方法是什么? - 是否有2 Coord的方法。与浮动原点有关的系统好吗?

提前谢谢!

0 个答案:

没有答案