Newer
Older
Hierarchical-Task-Network-Unity-3D / Assets / Scripts / LayerManager.cs
using System.Collections.Generic;
using UnityEngine;

public class LayerManager : MonoBehaviour
{
    [Header("Layer Settings")]
    [SerializeField] private GameObject[] layer0_Objects; // GameObjects for base layer
    [SerializeField] private GameObject[] layer1_Objects;
    [SerializeField] private GameObject[] layer2_Objects;
    // Add more layers as needed

    [SerializeField] private uint currentLayerIndex = 0;

    [Header("References")]
    [SerializeField] private UIController uiController;

    private Dictionary<uint, List<MeshRenderer>> layerDictionary = new Dictionary<uint, List<MeshRenderer>>();

    void Awake()
    {
        // Initialize layers and collect all MeshRenderers
        InitializeLayer(0, layer0_Objects);
        InitializeLayer(1, layer1_Objects);
        InitializeLayer(2, layer2_Objects);
        // Add more layers here if needed

        // Disable all layers except the first one
        foreach (var layer in layerDictionary)
        {
            SetLayerVisibility(layer.Key, layer.Key == 0);
        }
    }

    private void InitializeLayer(uint layerIndex, GameObject[] parentObjects)
    {
        List<MeshRenderer> renderers = new List<MeshRenderer>();

        if (parentObjects != null)
        {
            foreach (GameObject parent in parentObjects)
            {
                if (parent != null)
                {
                    // Get all MeshRenderers in this object and its children
                    MeshRenderer[] childRenderers = parent.GetComponentsInChildren<MeshRenderer>(true);
                    renderers.AddRange(childRenderers);
                }
            }
        }

        layerDictionary.Add(layerIndex, renderers);
    }

    void Start()
    {
        if (uiController != null)
        {
            uiController.onLayerChange += HandleLayerChange;
        }
        else
        {
            Debug.LogError("UIController reference is missing!");
        }
    }

    void OnDestroy()
    {
        if (uiController != null)
        {
            uiController.onLayerChange -= HandleLayerChange;
        }
    }

    private void HandleLayerChange(LayerLevelAction action)
    {
        uint newLayerIndex = currentLayerIndex;


        switch (action)
        {
            case LayerLevelAction.Increment:
                if (currentLayerIndex < layerDictionary.Count - 1)
                    newLayerIndex++;
                break;

            case LayerLevelAction.Decrement:
                if (currentLayerIndex > 0)
                    newLayerIndex--;
                break;
        }

        if (newLayerIndex != currentLayerIndex)
        {
            // Disable current layer
            SetLayerVisibility(currentLayerIndex, false);

            // Enable new layer
            SetLayerVisibility(newLayerIndex, true);

            currentLayerIndex = newLayerIndex;
        }

    }

    private void SetLayerVisibility(uint layerIndex, bool isVisible)
    {
        if (layerDictionary.TryGetValue(layerIndex, out List<MeshRenderer> renderers))
        {
            foreach (MeshRenderer renderer in renderers)
            {
                if (renderer != null)
                {
                    renderer.enabled = isVisible;
                }
            }
        }
    }

    // Editor-only method to refresh layer contents
#if UNITY_EDITOR
    public void RefreshLayerContents()
    {
        layerDictionary.Clear();
        InitializeLayer(0, layer0_Objects);
        InitializeLayer(1, layer1_Objects);
        InitializeLayer(2, layer2_Objects);
    }
#endif
}
public enum LayerLevelAction
{
    Increment,
    Decrement,
}