50 lines
1.4 KiB
C#
50 lines
1.4 KiB
C#
|
|
using UnityEngine;
|
||
|
|
using UnityEngine.Events;
|
||
|
|
|
||
|
|
public class InteractableObject : MonoBehaviour
|
||
|
|
{
|
||
|
|
public Transform player;
|
||
|
|
public float interactionRadius = 2.4f;
|
||
|
|
public string promptText = "Нажмите E, чтобы осмотреть статую";
|
||
|
|
public float promptDuration = 1.2f;
|
||
|
|
public bool interactOnce = true;
|
||
|
|
public UnityEvent onInteract = new UnityEvent();
|
||
|
|
|
||
|
|
private bool hasInteracted;
|
||
|
|
private float nextPromptTime;
|
||
|
|
|
||
|
|
private void Update()
|
||
|
|
{
|
||
|
|
if (player == null)
|
||
|
|
{
|
||
|
|
GameObject playerObject = GameObject.FindGameObjectWithTag("Player");
|
||
|
|
player = playerObject != null ? playerObject.transform : null;
|
||
|
|
}
|
||
|
|
|
||
|
|
if (player == null || (interactOnce && hasInteracted))
|
||
|
|
{
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
bool isNear = Vector3.Distance(transform.position, player.position) <= interactionRadius;
|
||
|
|
|
||
|
|
if (!isNear)
|
||
|
|
{
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
if (Time.time >= nextPromptTime)
|
||
|
|
{
|
||
|
|
// Repeated short prompts keep the interaction readable while the player stays nearby.
|
||
|
|
HintManager.Instance?.ShowHint(promptText, promptDuration);
|
||
|
|
nextPromptTime = Time.time + promptDuration + 0.25f;
|
||
|
|
}
|
||
|
|
|
||
|
|
if (Input.GetKeyDown(KeyCode.E))
|
||
|
|
{
|
||
|
|
hasInteracted = true;
|
||
|
|
onInteract?.Invoke();
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|