using System.Collections;
using System.Collections.Generic;
using GameBase.Extensions;
using UnityEngine.Events;
[RequireComponent( typeof( Grid ) )]
public class GridViewManager : Singleton<GridViewManager>
public Vector2Int GridViewPortSize;
public List<Node> NodesInView = new List<Node>();
public Vector3Int? CurrentCenter;
public bool ToggleDebugLogs;
public int GridSize { get; private set; }
public Action<Node> OnNodeAdded;
public Action<Node> OnNodeRemoved;
GridSize = GridViewPortSize.x * GridViewPortSize.y;
NodesInView = new List<Node>( GridSize );
Vector3Int center = GetCenter();
if ( CurrentCenter != center )
CalculateAndMessageNodes();
private void CalculateAndMessageNodes()
List<Node> potentialNodes = new List<Node>( GridSize );
for ( int x = 0 ; x < GridViewPortSize.x ; x++ )
for ( int y = 0 ; y < GridViewPortSize.y ; y++ )
var gridPos = new Vector3Int(
CurrentCenter.Value.x - ( GridViewPortSize.x / 2 ) + x,
CurrentCenter.Value.y - ( GridViewPortSize.y / 2 ) + y,
Node node = new Node( gridPos );
potentialNodes.Add( node );
List<Node> newNodes = potentialNodes.Except( NodesInView ).ToList();
if ( newNodes == null || newNodes.Count == 0 )
OnNodeAdded?.Invoke( node );
Debug.Log( "Spawning node at: <b>" + ( Vector2 )node.Center + "</b>" );
List<Node> oldNodes = NodesInView.Except( potentialNodes ).ToList();
for ( int i = 0 ; i < oldNodes.Count ; i++ )
NodesInView.Remove( oldNodes[ i ] );
OnNodeRemoved?.Invoke( oldNodes[ i ] );
Debug.Log( "Removing node at: <b>" + ( Vector2 )oldNodes[ i ].Center + "</b>" );
private void OnDrawGizmos()
if ( NodesInView != null )
for ( int i = 0 ; i < NodesInView.Count ; i++ )
Gizmos.DrawWireCube( NodesInView[ i ].Center, new Vector3( 0.8f, 0.8f, 0.8f ) );
private Vector3Int GetCenter()
return UnityGrid.LocalToCell( Root.position );
private void OnValidate()
Debug.LogError( "A Root must be set!" );