84 lines
2.6 KiB
C#
84 lines
2.6 KiB
C#
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<ISelectable>(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<ISelectableCallback>())
|
|
{
|
|
x.OnInactive(selected);
|
|
}
|
|
selected = null;
|
|
}
|
|
private void Detected(ISelectable detected)
|
|
{
|
|
selected = detected;
|
|
detected.SetSelectionState(SelectionState.Hover);
|
|
foreach (var x in entity.GetCallbacks<ISelectableCallback>())
|
|
{
|
|
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<IAction>(out var action))
|
|
{
|
|
action.Execute();
|
|
}
|
|
foreach (var x in entity.GetCallbacks<ISelectableCallback>())
|
|
{
|
|
x.OnActive(_selected);
|
|
}
|
|
}
|
|
}
|
|
} |