055b87a85c
Introduce a DI-wired NavMesh sidecar for voxel chunks so world streaming stays actor-driven and world state remains the canonical source for navigation rebuilds.
52 lines
1.7 KiB
C#
52 lines
1.7 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))]
|
|
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>().As<IWorldInterestReader>().AsSelf();
|
|
builder.RegisterEntryPoint<VoxelWorldNavMeshService>();
|
|
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>>());
|
|
}
|
|
}
|
|
}
|