using System.Collections; using UnityEngine; namespace RR.Common.Behaviour { public class MessageController : Sequencer { [Header("Настройки взаимодействия")] [SerializeField] private bool isOneTime; [Header("Префабы для сообщений")] [SerializeField] private GameObject messagePlaceholderPrefab; [SerializeField] private GameObject messageBubblePrefab; [Header("Смещение сообщения")] [SerializeField] private Vector3 defaultMessageOffset = new(0, 0.5f, 0); private bool _isTriggered; private void OnTriggerEnter2D(Collider2D other) { if (IsExecuting || _isTriggered || !other.CompareTag("Player")) return; InitializeSequence(other.gameObject); if (isOneTime) _isTriggered = true; } public void Add(GameObject targetObject, string text, Vector3 customOffset = default) { // Ищем объект "Message Placeholder" среди дочерних объектов Transform placeholder = targetObject.transform.Find("Message Placeholder"); // Если placeholder не найден, создаем его if (!placeholder) { GameObject placeholderInstance = Instantiate(messagePlaceholderPrefab, targetObject.transform); Vector3 offset; if (customOffset != default) offset = customOffset; else offset = defaultMessageOffset; if (targetObject.transform.localScale != Vector3.one) placeholderInstance.transform.localScale = Vector3.one / targetObject.transform.localScale.x; placeholderInstance.name = "Message Placeholder"; // Вычисляем смещение с учетом размера коллайдера объекта Collider2D targetCollider = targetObject.GetComponent(); if (targetCollider) // Если на объекте есть коллайдер, учитываем его высоту offset = new Vector3( offset.x, targetCollider.bounds.size.y + offset.y, offset.z ); // Устанавливаем позицию placeholder с учетом смещения placeholderInstance.transform.position = targetObject.transform.position + offset; // Сохраняем ссылку на трансформ placeholder placeholder = placeholderInstance.transform; } // Создаем Message и добавляем его в placeholder GameObject messageInstance = Instantiate(messageBubblePrefab, placeholder); Message message = messageInstance.GetComponent(); if (message) { message.Initialize(text); } } } }