using UnityEngine; using UnityEngine.InputSystem; using UnityEngine.InputSystem.Interactions; namespace BITKit.Entities { public class EntityInteractive : EntityPlayerComponent { [Header(Constant.Header.Settings)] public float distance; public LayerMask layerMask; [Header(Constant.Header.Input)] public InputActionReference interactiveAction; private readonly InputActionGroup inputActionGroup = new(); [Header(Constant.Header.Gameobjects)] [SerializeField] private Transform cameraTransform; [Header(Constant.Header.InternalVariables)] private ISelectable selected; private IntervalUpdate cd = new(0.08f); public override void OnUpdate(float deltaTime) { if (Physics.Raycast(cameraTransform.position,cameraTransform.forward, out var raycastHit, distance, layerMask)) { if (raycastHit.transform.TryGetComponentAny(out var _detected)) { if (_detected == selected) { } else { TryDeSelected(); Detected(_detected); } } else { TryDeSelected(); } } else { TryDeSelected(); } } private void TryDeSelected() { if (selected is null) return; selected.SetSelectionState(SelectionState.None); foreach (var x in entity.GetCallbacks()) { x.OnInactive(selected); } selected = null; } private void Detected(ISelectable detected) { selected = detected; detected.SetSelectionState(SelectionState.Hover); foreach (var x in entity.GetCallbacks()) { x.OnHover(selected); } } public void Interactive(InputAction.CallbackContext context) { if (context.interaction is not TapInteraction || !context.performed) return; var _selected = selected; if (_selected is not MonoBehaviour monoBehaviour) return; if (monoBehaviour.TryGetComponentAny(out var action)) { action.Execute(); } foreach (var x in entity.GetCallbacks()) { x.OnActive(_selected); } } } }