289d5f783b
Introduce nav-only corridor hints and feed them into clustered coverage scheduling so runtime NavMesh can prewarm ahead of active movement paths.
55 lines
1.9 KiB
C#
55 lines
1.9 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>().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>>());
|
|
}
|
|
}
|
|
|
|
}
|