110 lines
2.5 KiB
C#
110 lines
2.5 KiB
C#
using TMPro;
|
|
using UnityEngine;
|
|
using UnityEngine.Events;
|
|
using UnityEngine.InputSystem;
|
|
|
|
[RequireComponent(typeof(Collider))]
|
|
public class WallInteractButton : MonoBehaviour
|
|
{
|
|
[Header("Interaction")]
|
|
[Tooltip("Optional Input Action. If empty, fallback key will be used.")]
|
|
[SerializeField] private InputActionReference interactAction;
|
|
|
|
[Tooltip("Used only if no Input Action is assigned.")]
|
|
[SerializeField] private Key fallbackKey = Key.E;
|
|
|
|
[SerializeField] private bool oneShot = false;
|
|
|
|
[Header("Prompt")]
|
|
[SerializeField] private TMP_Text promptText;
|
|
[SerializeField] private string promptMessage = "Press E to interact";
|
|
|
|
[Header("Events")]
|
|
public UnityEvent OnInteract;
|
|
|
|
private bool m_playerInRange;
|
|
private bool m_hasInteracted;
|
|
|
|
private void Reset()
|
|
{
|
|
Collider col = GetComponent<Collider>();
|
|
col.isTrigger = true;
|
|
}
|
|
|
|
private void OnEnable()
|
|
{
|
|
if (interactAction != null)
|
|
{
|
|
interactAction.action.Enable();
|
|
}
|
|
}
|
|
|
|
private void OnDisable()
|
|
{
|
|
if (interactAction != null)
|
|
{
|
|
interactAction.action.Disable();
|
|
}
|
|
}
|
|
|
|
private void Start()
|
|
{
|
|
UpdatePrompt(false);
|
|
}
|
|
|
|
private void Update()
|
|
{
|
|
if (!m_playerInRange)
|
|
return;
|
|
|
|
if (oneShot && m_hasInteracted)
|
|
return;
|
|
|
|
if (WasInteractPressed())
|
|
{
|
|
m_hasInteracted = true;
|
|
OnInteract?.Invoke();
|
|
}
|
|
}
|
|
|
|
private void OnTriggerEnter(Collider other)
|
|
{
|
|
if (!IsPlayer(other))
|
|
return;
|
|
|
|
m_playerInRange = true;
|
|
UpdatePrompt(true);
|
|
}
|
|
|
|
private void OnTriggerExit(Collider other)
|
|
{
|
|
if (!IsPlayer(other))
|
|
return;
|
|
|
|
m_playerInRange = false;
|
|
UpdatePrompt(false);
|
|
}
|
|
|
|
private bool WasInteractPressed()
|
|
{
|
|
if (interactAction != null)
|
|
return interactAction.action.WasPressedThisFrame() || interactAction.action.WasPerformedThisFrame();
|
|
|
|
return Keyboard.current != null && Keyboard.current[fallbackKey].wasPressedThisFrame;
|
|
}
|
|
|
|
private bool IsPlayer(Collider other)
|
|
{
|
|
return other.CompareTag("Player") || other.GetComponentInParent<PlayerMovement>() != null;
|
|
}
|
|
|
|
private void UpdatePrompt(bool visible)
|
|
{
|
|
if (promptText == null)
|
|
return;
|
|
|
|
promptText.text = promptMessage;
|
|
promptText.gameObject.SetActive(visible);
|
|
}
|
|
}
|