Files
TheDeclineOfWarriors/Assets/Scripts/VoxelWorld/VoxelWorldNavMeshLifetimeScope.cs
T
Alexander Borisov 1681e44c5e add documentation
2026-04-08 20:58:33 +03:00

58 lines
2.1 KiB
C#

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))]
/// <summary>
/// Scene-level composition root that wires the voxel world, nav coverage services and interest readers into one runtime module.
/// </summary>
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<VoxelWorldGenerator>();
}
builder.RegisterMessagePipe();
builder.RegisterInstance(config);
builder.RegisterInstance(worldGenerator).As<IChunkNavSourceReader>().AsSelf();
builder.Register<SceneWorldInterestReader>(Lifetime.Singleton).As<IWorldInterestReader>();
builder.RegisterEntryPoint<NavCoverageHintService>().AsSelf();
builder.RegisterEntryPoint<VoxelWorldNavMeshService>().AsSelf();
builder.RegisterBuildCallback(ResolvePublishers);
}
private void ResolvePublishers(IObjectResolver resolver)
{
if (!enableRuntimeNavMesh || worldGenerator == null)
{
return;
}
worldGenerator.BindWorldContracts(
resolver.Resolve<IPublisher<ChunkNavGeometryReadyMessage>>(),
resolver.Resolve<IPublisher<ChunkNavGeometryRemovedMessage>>(),
resolver.Resolve<IPublisher<WorldInterestChangedMessage>>());
}
}
}