GameWorldEcsComposer
Anonymous
csharp
07/18/2026 10:34 AM
13.7 KB
23
No Index
using System;
using Leopotam.EcsProto;
using Leopotam.EcsProto.Parenting;
using Leopotam.EcsProto.QoL;
using Leopotam.EcsProto.Unity;
using ShiftedRealms.IsoRift.GameWorld.Scene;
using VContainer;
namespace ShiftedRealms.IsoRift.GameWorld
{
public class GameWorldEcsComposer :
IStartSystem,
IFixedUpdateSystem,
IUpdateSystem,
IDisposable
{
private readonly EntityGameObjectsRegistry entityGameObjectsRegistry;
private readonly SceneRefs sceneRefs;
private readonly InputSystem inputSystem;
private readonly CharacterDefinitionsLibrary characterDefinitionsLibrary;
private readonly ItemSlotDefinitionsLibrary itemSlotDefinitionsLibrary;
private readonly ItemDefinitionsLibrary itemDefinitionsLibrary;
private readonly RangedWeaponShotPresentationEventQueue shotPresentationEventQueue;
private ItemPlacementService itemPlacementService;
private ProtoWorld world;
private ProtoSystems updateSystems;
private ProtoSystems fixedSystems;
public int UpdatePriority => UpdatePriorityList.ECS;
public int StartPriority => StartPriorityList.ECS;
public int FixedUpdatePriority => FixedUpdatePriorityList.ECS;
public ProtoWorld World => world;
[Inject]
public GameWorldEcsComposer(
EntityGameObjectsRegistry entityGameObjectsRegistry,
SceneRefs sceneRefs,
InputSystem inputSystem,
CharacterDefinitionsLibrary characterDefinitionsLibrary,
ItemSlotDefinitionsLibrary itemSlotDefinitionsLibrary,
ItemDefinitionsLibrary itemDefinitionsLibrary,
RangedWeaponShotPresentationEventQueue shotPresentationEventQueue)
{
this.entityGameObjectsRegistry = entityGameObjectsRegistry;
this.sceneRefs = sceneRefs;
this.inputSystem = inputSystem;
this.characterDefinitionsLibrary = characterDefinitionsLibrary;
this.itemSlotDefinitionsLibrary = itemSlotDefinitionsLibrary;
this.itemDefinitionsLibrary = itemDefinitionsLibrary;
this.shotPresentationEventQueue = shotPresentationEventQueue;
}
public void Start()
{
var rootAspect = new GameWorldRootAspect();
world = new ProtoWorld(rootAspect);
var characterNavigationService = new CharacterNavigationService();
var visionObservationRelationsIndex = new VisionObservationRelationIndex();
itemPlacementService = new ItemPlacementService(
rootAspect.ItemPlacementAspect,
rootAspect.ItemAspect,
itemDefinitionsLibrary,
itemSlotDefinitionsLibrary);
var itemVisualAnchorService = new ItemVisualAnchorService(
rootAspect.ItemPlacementAspect,
rootAspect.GameObjectAspect,
entityGameObjectsRegistry);
var characterArchetypeFactory = new CharacterArchetypeFactory(
new CharacterArchetypeFactory.Dependencies(
rootAspect.NamingAspect,
rootAspect.SpatialAspect,
rootAspect.PhysicsAspect,
rootAspect.CharacterAspect,
rootAspect.CombatReadinessAspect,
rootAspect.MovementAspect,
rootAspect.VisionFocusAspect,
rootAspect.LosAspect,
rootAspect.VisionPerceptionAspect,
rootAspect.FacingAspect,
rootAspect.AimingAspect,
rootAspect.RangedWeaponShootingAspect,
rootAspect.ItemPlacementAspect,
itemSlotDefinitionsLibrary,
characterDefinitionsLibrary));
updateSystems = new ProtoSystems(world);
updateSystems
// Modules
.AddModule(new AutoInjectModule())
.AddModule(new UnityModule())
// Services and configs
.AddService(entityGameObjectsRegistry)
.AddService(sceneRefs)
.AddService(inputSystem)
.AddService(characterDefinitionsLibrary)
.AddService(itemSlotDefinitionsLibrary)
.AddService(itemDefinitionsLibrary)
.AddService(itemPlacementService)
.AddService(itemVisualAnchorService)
.AddService(characterArchetypeFactory)
.AddService(characterNavigationService)
// Systems
.AddSystem(new CharacterSpawnSystem())
.AddSystem(new PlayerCharacterSetupSystem())
.AddSystem(new NpcSetupSystem())
.AddSystem(new PlayerCharacterInitialEquipmentSetSystem())
.AddSystem(new DemoNpcInitialEquipmentSetSystem())
.AddSystem(new CharacterEntityGameObjectSpawnSystem())
.AddSystem(new ItemEntityGameObjectSpawnSystem())
.AddSystem(new ItemTransferVisualApplySystem())
.AddSystem(new ItemGameObjectPlacementApplySystem())
.Init();
fixedSystems = new ProtoSystems(world);
fixedSystems
// Modules
.AddModule(new AutoInjectModule())
// Services and configs
.AddService(entityGameObjectsRegistry)
.AddService(characterDefinitionsLibrary)
.AddService(itemDefinitionsLibrary)
.AddService(itemSlotDefinitionsLibrary)
.AddService(itemPlacementService)
.AddService(shotPresentationEventQueue)
.AddService(characterNavigationService)
.AddService(visionObservationRelationsIndex)
// Vision
.AddSystem(new VisionObservableShapeResolveSystem())
.AddSystem(new VisionInvalidObservationRelationCleanupSystem())
.AddSystem(new VisionObservationResolveSystem())
.AddSystem(new VisionRecognitionUpdateSystem())
// Perception
.AddSystem(new AiVisionRecognitionApplySystem())
.AddSystem(new AiCombatStateDecisionSystem())
// AI behaviours
.AddSystem(new AiCombatBehaviourSystem())
.AddSystem(new AiPointOfInterestPatrolSystem())
// AI planning
.AddSystem(new AiOperationPlanningSystem())
.AddSystem(new AiOperationCandidateCancelSystem())
// Operation's starts
.AddSystem(new EquipmentRoleStateSetOperationStartSystem())
.AddSystem(new MoveToPointOperationStartSystem())
.AddSystem(new CombatReadinessOperationStartSystem())
.AddSystem(new VisionFocusOperationStartSystem())
.AddSystem(new RangedWeaponFireOperationStartSystem())
// Sub-operations starts
.AddSystem(new ItemTransferOperationStartSystem())
// Operation cancellation
.AddSystem(new EquipmentRoleStateSetOperationCancelPropagationSystem())
.AddSystem(new OperationCancelSystem())
// Process progress
.AddSystem(new OperationProgressSystem())
// Operation execution
.AddSystem(new MoveToPointOperationExecuteSystem())
.AddSystem(new CombatReadinessOperationExecuteSystem())
.AddSystem(new VisionFocusOperationExecuteSystem())
.AddSystem(new RangedWeaponFireOperationExecuteSystem())
// AI behaviour results
.AddSystem(new AiPointOfInterestPatrolResultSystem())
// Sub-operations execution
.AddSystem(new ItemTransferOperationExecuteSystem())
.AddSystem(new EquipmentAssignmentStateSyncFromItemTransferSystem())
.AddSystem(new EquipmentRoleStateSetOperationExecuteSystem())
// Velocity simulation
.AddSystem(new ClearAccelerationSystem())
.AddSystem(new GravityApplySystem())
.AddSystem(new ApplyForceSystem())
// Execution layers
.AddSystem(new MovementVisionFocusCommandBuildSystem())
.AddSystem(new VisionFocusUpdateSystem())
.AddSystem(new VisionFocusEntityPointResolveSystem())
.AddSystem(new FacingCommandFromVisionFocusBuildSystem())
.AddSystem(new MoveSystem())
.AddSystem(new FacingRotationUpdateSystem())
.AddSystem(new AimingSystem())
// Unity scene resolve
.AddSystem(new CharacterControllerPoseResolveSystem())
// Derived character state
.AddSystem(new LosShapeUpdateSystem())
// TODO make this system independent from muzzle transform
.AddSystem(new RangedWeaponShootingSystem())
// Fixed pose history
.AddSystem(new WorldPoseFixedHistoryUpdateSystem())
// Post tick events
.AddSystem(new RangedWeaponShotResultBuildSystem())
.AddSystem(new RangedWeaponShotPresentationEventsPublishSystem())
// Cleanup systems
.AddSystem(new VisionObservationCleanupSystem())
.AddSystem(new RangedWeaponShotEventsCleanupSystem())
.AddSystem(new OperationCleanupSystem())
.AddSystem(new ProcessDeadParentsSystem())
.Init();
}
public void FixedUpdate(float fixedDeltaTime)
{
fixedSystems.Run();
}
public void Update(float deltaTime)
{
updateSystems.Run();
}
public void Dispose()
{
fixedSystems?.Destroy();
fixedSystems = null;
updateSystems?.Destroy();
updateSystems = null;
world?.Destroy();
world = null;
itemPlacementService = null;
}
}
}
Editor is loading...
Leave a Comment