add voxel world runtime navmesh sidecar
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.
This commit is contained in:
@@ -0,0 +1,51 @@
|
||||
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>>());
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user