using UnityEngine; [RequireComponent(typeof(SphereCollider))] public class NPCInteract : MonoBehaviour { public DialogueNode startNode; public string npcDisplayName = "Смотритель ворот"; public float interactionRadius = 3f; public KeyCode interactKey = KeyCode.E; public DialogueManager dialogueManager; public Renderer highlightRenderer; public Color highlightColor = new Color(1f, 0.78f, 0.22f, 1f); private Transform player; private bool playerInRange; private Color baseColor; private Material runtimeMaterial; private void Awake() { SphereCollider trigger = GetComponent(); trigger.isTrigger = true; trigger.radius = interactionRadius; if (highlightRenderer == null) highlightRenderer = GetComponentInChildren(); if (highlightRenderer != null) { runtimeMaterial = highlightRenderer.material; baseColor = runtimeMaterial.color; } } private void Start() { if (dialogueManager == null) dialogueManager = DialogueManager.Instance; SimplePlayerController controller = FindObjectOfType(); if (controller != null) player = controller.transform; } private void Update() { if (player != null) SetPlayerInRange(Vector3.Distance(transform.position, player.position) <= interactionRadius); bool dialogueActive = dialogueManager != null && dialogueManager.IsDialogueActive; if (!playerInRange || dialogueActive) return; ShowHint(); if (Input.GetKeyDown(interactKey) && startNode != null && dialogueManager != null) dialogueManager.StartDialogue(startNode, npcDisplayName); } private void OnTriggerEnter(Collider other) { if (other.GetComponentInParent() != null) { player = other.transform; SetPlayerInRange(true); } } private void OnTriggerExit(Collider other) { if (other.GetComponentInParent() != null) SetPlayerInRange(false); } private void OnDrawGizmosSelected() { Gizmos.color = new Color(1f, 0.75f, 0.2f, 0.25f); Gizmos.DrawSphere(transform.position, interactionRadius); Gizmos.color = new Color(1f, 0.75f, 0.2f, 1f); Gizmos.DrawWireSphere(transform.position, interactionRadius); } private void SetPlayerInRange(bool inRange) { if (playerInRange == inRange) return; playerInRange = inRange; SetHighlight(inRange); if (!inRange && DialogueHUD.Instance != null) DialogueHUD.Instance.HideHint(); } private void SetHighlight(bool enabled) { if (runtimeMaterial == null) return; runtimeMaterial.color = enabled ? highlightColor : baseColor; } private void ShowHint() { if (DialogueHUD.Instance != null) DialogueHUD.Instance.ShowHint("Нажмите E для разговора"); else if (dialogueManager != null && dialogueManager.hintText != null) { dialogueManager.hintText.text = "Нажмите E для разговора"; dialogueManager.hintText.gameObject.SetActive(true); } } }