58 lines
2.1 KiB
C#
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>>());
|
|
}
|
|
}
|
|
|
|
}
|