using InfiniteWorld.VoxelWorld; using InfiniteWorld.VoxelWorld.Contracts; using InfiniteWorld.VoxelWorld.NavMesh; using MessagePipe; using UnityEngine; using VContainer; using VContainer.Unity; namespace VoxelWorldScene { [DisallowMultipleComponent] [RequireComponent(typeof(VoxelWorldGenerator))] public sealed class VoxelWorldNavMeshLifetimeScope : LifetimeScope { [SerializeField] private bool enableRuntimeNavMesh = true; [SerializeField] private VoxelWorldGenerator worldGenerator; [SerializeField] private VoxelWorldNavMeshConfig config = new VoxelWorldNavMeshConfig(); protected override void Configure(IContainerBuilder builder) { if (!enableRuntimeNavMesh) { return; } if (worldGenerator == null) { worldGenerator = GetComponent(); } builder.RegisterMessagePipe(); builder.RegisterInstance(config); builder.RegisterInstance(worldGenerator).As().AsSelf(); builder.Register(Lifetime.Singleton).As(); builder.RegisterEntryPoint().AsSelf(); builder.RegisterEntryPoint().AsSelf(); builder.RegisterBuildCallback(ResolvePublishers); } private void ResolvePublishers(IObjectResolver resolver) { if (!enableRuntimeNavMesh || worldGenerator == null) { return; } worldGenerator.BindWorldContracts( resolver.Resolve>(), resolver.Resolve>(), resolver.Resolve>()); } } }