Newer
Older
Hierarchical-Task-Network-Unity-3D / Assets / Scripts / Interfaces / IInteractable.cs
using UnityEngine;

public interface IInteractable
{
    void OnInteract();
}

public class WorldInteractableObject : MonoBehaviour, IOutliner
{
    [SerializeField] private LayerMask targetLayerMask;
    [SerializeField] private LayerMask defaultLayerMask;
    [SerializeField] private MeshRenderer meshRenderer;

    private bool isOutlined;

    [SerializeField] private GameObject targetObject;

    protected void Awake()
    {
        Debug.Log($"Awake() called on {gameObject.name}");

        if (meshRenderer == null)
        {
            Debug.Log("MeshRenderer not serialized, attempting to find it...");
            if (gameObject.TryGetComponent(out MeshRenderer m))
            {
                meshRenderer = m;
                Debug.Log($"Assigned MeshRenderer from self: {m.name}");
            }
            else
            {
                Debug.LogError($"No MeshRenderer found on {gameObject.name}!");
                return;
            }
        }
        else
        {
            Debug.Log($"MeshRenderer pre-assigned: {meshRenderer.name}");
        }

        targetObject = meshRenderer.gameObject;
        Debug.Log($"TargetObject set to: {targetObject.name}");
    }



    public void ToggleOutline(bool enable)
    {
        if (enable && !isOutlined)
        {
            SetLayerMask(targetLayerMask);
        }
        else if (!enable && isOutlined)
        {
            SetLayerMask(defaultLayerMask);
        }

        isOutlined = enable;
    }

    // Helper method to get first layer from mask
    private int GetFirstLayerFromMask(LayerMask layerMask)
    {
        int maskValue = layerMask.value;

        if (maskValue == 0)
        {
            Debug.LogWarning("LayerMask is empty, returning default layer 0");
            return 0;
        }

        // Find the first enabled layer in the mask
        for (int i = 0; i < 32; i++)
        {
            if ((maskValue & (1 << i)) != 0)
            {
                return i;
            }
        }

        Debug.LogWarning("No valid layers found in mask, returning default layer 0");
        return 0;
    }

    private void SetLayerMask(LayerMask mask)
    {
        targetObject.layer = GetFirstLayerFromMask(mask);
    }
}