using System.Collections; using System.Collections.Generic; using UnityEngine; using EmeraldAI.Utility; using UnityEditor; namespace EmeraldAI { [HelpURL("https://black-horizon-studios.gitbook.io/emerald-ai-wiki/emerald-components-optional/optimization-component")] public class EmeraldOptimization : MonoBehaviour { public bool HideSettingsFoldout; public bool OptimizationFoldout; public enum OptimizedStates { Active = 0, Inactive = 1 }; public OptimizedStates OptimizedState = OptimizedStates.Inactive; public enum TotalLODsEnum { One = 1, Two = 2, Three = 3, Four = 4 }; public TotalLODsEnum TotalLODsRef = TotalLODsEnum.Three; public YesOrNo OptimizeAI = YesOrNo.Yes; public YesOrNo UseDeactivateDelay = YesOrNo.No; public enum MeshTypes { SingleMesh, LODGroup}; public MeshTypes MeshType = MeshTypes.SingleMesh; public Renderer AIRenderer; public Renderer Renderer1; public Renderer Renderer2; public Renderer Renderer3; public Renderer Renderer4; public VisibilityCheck m_VisibilityCheck; public int DeactivateDelay = 5; public bool Initialized; EmeraldSystem EmeraldComponent; void Start() { InitializeOptimizationSettings(); StartCoroutine(Initialize()); } IEnumerator Initialize () { while (Time.time < 0.5f) { yield return null; } Initialized = true; } /// /// Initializes the optimization settings. /// public void InitializeOptimizationSettings() { if (OptimizeAI == YesOrNo.Yes) { EmeraldComponent = GetComponent(); if (OptimizeAI == YesOrNo.Yes && MeshType == MeshTypes.SingleMesh) { if (AIRenderer != null && UseDeactivateDelay == YesOrNo.No) { DeactivateDelay = 0; m_VisibilityCheck = AIRenderer.gameObject.AddComponent(); m_VisibilityCheck.EmeraldComponent = EmeraldComponent; m_VisibilityCheck.EmeraldOptimization = this; } else if (AIRenderer != null && UseDeactivateDelay == YesOrNo.Yes) { m_VisibilityCheck = AIRenderer.gameObject.AddComponent(); m_VisibilityCheck.EmeraldComponent = EmeraldComponent; m_VisibilityCheck.EmeraldOptimization = this; } else if (MeshType == MeshTypes.SingleMesh && AIRenderer == null) { OptimizeAI = YesOrNo.No; } } if (MeshType == MeshTypes.LODGroup) { GetLODs(); if (TotalLODsRef == TotalLODsEnum.One) { if (Renderer1 == null) { OptimizeAI = YesOrNo.No; MeshType = MeshTypes.SingleMesh; } else { m_VisibilityCheck = Renderer1.gameObject.AddComponent(); m_VisibilityCheck.EmeraldComponent = EmeraldComponent; m_VisibilityCheck.EmeraldOptimization = this; } } else if (TotalLODsRef == TotalLODsEnum.Two) { if (Renderer1 == null || Renderer2 == null) { OptimizeAI = YesOrNo.No; MeshType = MeshTypes.SingleMesh; } else { m_VisibilityCheck = Renderer2.gameObject.AddComponent(); m_VisibilityCheck.EmeraldComponent = EmeraldComponent; m_VisibilityCheck.EmeraldOptimization = this; } } else if (TotalLODsRef == TotalLODsEnum.Three) { if (Renderer1 == null || Renderer2 == null || Renderer3 == null) { OptimizeAI = YesOrNo.No; MeshType = MeshTypes.SingleMesh; } else { m_VisibilityCheck = Renderer3.gameObject.AddComponent(); m_VisibilityCheck.EmeraldComponent = EmeraldComponent; m_VisibilityCheck.EmeraldOptimization = this; } } else if (TotalLODsRef == TotalLODsEnum.Four) { if (Renderer1 == null || Renderer2 == null || Renderer3 == null || Renderer4 == null) { OptimizeAI = YesOrNo.No; MeshType = MeshTypes.SingleMesh; } else { m_VisibilityCheck = Renderer4.gameObject.AddComponent(); m_VisibilityCheck.EmeraldComponent = EmeraldComponent; m_VisibilityCheck.EmeraldOptimization = this; } } } } else if (OptimizeAI == YesOrNo.No) { OptimizedState = OptimizedStates.Inactive; } } /// /// Gets all groups within an AI's LODGroup component. /// void GetLODs () { LODGroup _LODGroup = GetComponentInChildren(); if (_LODGroup == null) { Debug.LogError("No LOD Group could be found. Please ensure that your AI has an LOD group that has at least 1 levels. The LODGroup Feature has been disabled."); MeshType = MeshTypes.SingleMesh; } else if (_LODGroup != null) { LOD[] AllLODs = _LODGroup.GetLODs(); if (_LODGroup.lodCount <= 4) { TotalLODsRef = (TotalLODsEnum)(_LODGroup.lodCount); } if (_LODGroup.lodCount >= 1) { for (int i = 0; i < _LODGroup.lodCount; i++) { if (i == 0) { Renderer1 = AllLODs[i].renderers[0]; } if (i == 1) { Renderer2 = AllLODs[i].renderers[0]; } if (i == 2) { Renderer3 = AllLODs[i].renderers[0]; } if (i == 3) { Renderer4 = AllLODs[i].renderers[0]; } } } } } void Update () { //Check all of an AI's LOD renderers, when using the Optimization feature. if (OptimizeAI == YesOrNo.Yes && MeshType == MeshTypes.LODGroup && Initialized) { m_VisibilityCheck.CheckAIRenderers(); } } } }