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); } }