fgm24/Assets/Scripts/PathFinding/NavMeshComponents/Scripts/CollectSourcesCache2d.cs

116 lines
3.7 KiB
C#

using NavMeshPlus.Components;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;
namespace NavMeshPlus.Extensions
{
[ExecuteAlways]
[AddComponentMenu("Navigation/Navigation CacheSources2d", 30)]
public class CollectSourcesCache2d : NavMeshExtension
{
List<NavMeshBuildSource> _sources;
Dictionary<UnityEngine.Object, NavMeshBuildSource> _lookup;
private Bounds _sourcesBounds;
public bool IsDirty { get; protected set; }
private NavMeshBuilder2dState _state;
public int SourcesCount => _sources.Count;
public int CahcheCount => _lookup.Count;
public List<NavMeshBuildSource> Cache { get => _sources; }
protected override void Awake()
{
_lookup = new Dictionary<UnityEngine.Object, NavMeshBuildSource>();
_sources = new List<NavMeshBuildSource>();
IsDirty = false;
Order = -1000;
_sourcesBounds = new Bounds();
base.Awake();
}
protected override void OnDestroy()
{
_state?.Dispose();
base.OnDestroy();
}
public bool AddSource(GameObject gameObject, NavMeshBuildSource source)
{
var res = _lookup.ContainsKey(gameObject);
if (res)
{
return UpdateSource(gameObject);
}
_sources.Add(source);
_lookup.Add(gameObject, source);
IsDirty = true;
return true;
}
public bool UpdateSource(GameObject gameObject)
{
var res = _lookup.ContainsKey(gameObject);
if(res)
{
IsDirty = true;
var source = _lookup[gameObject];
var idx = _sources.IndexOf(source);
if (idx >= 0)
{
source.transform = Matrix4x4.TRS(gameObject.transform.position, gameObject.transform.rotation, gameObject.transform.lossyScale);
_sources[idx] = source;
_lookup[gameObject] = source;
}
}
return res;
}
public bool RemoveSource(GameObject gameObject)
{
var res = _lookup.ContainsKey(gameObject);
if (res)
{
IsDirty = true;
var source = _lookup[gameObject];
_lookup.Remove(gameObject);
_sources.Remove(source);
}
return res;
}
public AsyncOperation UpdateNavMesh(NavMeshData data)
{
IsDirty = false;
return NavMeshBuilder.UpdateNavMeshDataAsync(data, NavMeshSurfaceOwner.GetBuildSettings(), _sources, _sourcesBounds);
}
public AsyncOperation UpdateNavMesh()
{
return UpdateNavMesh(NavMeshSurfaceOwner.navMeshData);
}
public override void CollectSources(NavMeshSurface surface, List<NavMeshBuildSource> sources, NavMeshBuilderState navMeshState)
{
_lookup.Clear();
IsDirty = false;
_state?.Dispose();
_state = navMeshState.GetExtraState<NavMeshBuilder2dState>(false);
_state.lookupCallback = LookupCallback;
}
private void LookupCallback(UnityEngine.Object component, NavMeshBuildSource source)
{
if (component == null)
{
return;
}
_lookup.Add(component, source);
}
public override void PostCollectSources(NavMeshSurface surface, List<NavMeshBuildSource> sources, NavMeshBuilderState navNeshState)
{
_sourcesBounds = navNeshState.worldBounds;
_sources = sources;
}
}
}