We will start the recipes oriented to use graph-based logic in order to simulate sense. Again, we start by developing the sense of vision.
It is important to have grasped the chapter regarding path finding in order to understand the inner workings of the graph-based recipes.
We will just implement a new file:
using UnityEngine; using System.Collections; using System.Collections.Generic; public class VisorGraph : MonoBehaviour { public int visionReach; public GameObject visorObj; public Graph visionGraph; }
void Start() { if (visorObj == null) visorObj = gameObject; }
public bool IsVisible(int[] visibilityNodes) { int vision = visionReach; int src = visionGraph.GetNearestVertex(visorObj); HashSet<int> visibleNodes = new HashSet<int>(); Queue<int> queue = new Queue<int>(); queue.Enqueue(src); }
while (queue.Count != 0) { if (vision == 0) break; int v = queue.Dequeue(); List<int> neighbours = visionGraph.GetNeighbors(v); foreach (int n in neighbours) { if (visibleNodes.Contains(n)) continue; queue.Enqueue(v); visibleNodes.Add(v); } }
foreach (int vn in visibleNodes) { if (visibleNodes.Contains(vn)) return true; }
return false;
The recipe uses the Breadth-First Search algorithm in order to discover nodes within its vision reach, and then compares this set of nodes to the set where agents reside.
The input array is computed outside, and it's out of the scope of this recipe because it relies on pinpointing, for example, the position of each agent or object that needs to be checked visibly.