我面临的一个困境是;
我被反复告知,ECS听起来很棒,但“这是一种在寻找问题的解决方案”
并且我“在开发的第一步或第十步中都不会知道它需要”
后者听起来对于我的用例来说非常不正确。
这是一款灵感来自我买的第一款游戏的游戏,游戏已经非常彻底地死亡了。
车辆voxels是1m^3,可能或不可能有ai“船员”(尚未决定)
所有块都具有不同的功能,即产生反重力,发射子弹实体,存储能量,耗能,阻挡子弹等。
所以,OOP伪代码片段,也就是所教我的大学教授Frank教授所说的跟踪表格!
if keyboard.entry = 空格
block.lookup -> projectilespawner.spawnprojectile
projectile.launchvel -> bullet.track
bullet.track -> tracer.render
bullet.track -> bullet.raycast (vector x, y)
onhit -> explosion.spawn
explosion.spawn -> explosion.damage (damage, radius)
explosion.damage -> block.damage apply
所有这些都是为了从单个枪中造成单个块的伤害,所有枪都将线性增加计算量,甚至可能是指数增加计算量考虑到有限的CPU容量。
从我理解的角度来看,ECS变体遵循以下逻辑:
system.input = 空格被按下
system.aiming = 空格被按下,添加 [firing] 标签到装备的武器
system.firing = spawnProjectile id xxx with tag [explosive]
system.projectileflight = antiphasing.raycast, add movement tag
system.arccalculationorwhatever = vectorize movement
system.detectcollision = add flag [destroy]
system.explode = for flag [destroy] AND flag [explosive], add flag to id's in radius [explosiveradius]
system.cleanup = remove all flags from entity with flag [destroy]
由于这是并行化和多线程的,所以当它在主核中进行这些计算时,主核将只有非常少的工作量即使其他核准备下一个帧。因此,这个系统在只有少量弹药时才会不那么有效。弹药数量越多,这种结构就越重要。
而材料碎片有物理?我可以就像弹药的射程为零或一个小值时一样,很快就将其设置为睡眠状态;当力作用于它时,简单地唤醒它。
至于修改的块(由于我将提供同样的内容创建工具用于在游戏中创建内容给所有玩家)
我可以只提供块创建的字段,并允许模组社区通过c#或lua(为了安全)代码模组添加更多功能。
因此,不去太过细节
我应该用ECS来解决我的用例,正确吗?我已经有一个交付清单和大量的功能计划,包括EOL想法,以确保游戏在尽可能长的时间内保持活跃。
感谢您的时间!
评论 (0)