using System.Collections.Generic; using UnityEngine; using Sirenix.Serialization; using UnityEngine.Serialization; public class PlayerEnvironmentManager : MonoBehaviour{ [OdinSerialize] public List observers; void Start(){ CheckDuplicateLabels(observers); } // TODO: Not working. void CheckDuplicateLabels(List sourceList){ foreach (EnvironmentObserver sourceObserver in observers) { foreach (EnvironmentObserver observer in sourceList) { if (sourceObserver == observer) { continue; } if (sourceObserver.label == observer.label) { Debug.LogError($"Duplicate label found in observer: {observer.label} is in use multiple times"); } if (observer.children != null && observer.children.Count > 0) { CheckDuplicateLabels(observer.children); } } } } public bool EvaluateFromString(string searchLabel, List observerList = null){ List listToUse = observers; if (observerList != null) { listToUse = observerList; } foreach (EnvironmentObserver observer in listToUse) { if (observer.label == searchLabel) { return observer.Evaluate(gameObject); } if (observer.children != null && observer.children.Count > 0) { foreach (EnvironmentObserver childObserver in observer.children) { EvaluateFromString(searchLabel, childObserver.children); } } } return false; } public EnvironmentObserver FindObserverFromString(string searchLabel, List observerList = null){ List listToUse = observers; if (observerList != null) { listToUse = observerList; } foreach (EnvironmentObserver observer in listToUse) { if (observer.label == searchLabel) { return observer; } if (observer.children != null && observer.children.Count > 0) { foreach (EnvironmentObserver childObserver in observer.children) { FindObserverFromString(searchLabel, childObserver.children); } } } return null; } void Update(){ } void LateUpdate(){ // Draw Gizmos foreach (EnvironmentObserver observer in observers) { observer.DrawObserverGizmo(gameObject); if (observer.children != null && observer.children.Count > 0) { foreach (EnvironmentObserver childObserver in observer.children) { childObserver.DrawObserverGizmo(gameObject); } } } // Clear hit foreach (EnvironmentObserver observer in observers) { observer.hit = default; if (observer.children != null && observer.children.Count > 0) { foreach (EnvironmentObserver childObserver in observer.children) { childObserver.hit = default; } } } } }