using UnityEngine; namespace RR.Common.Behaviour { public class MessageController : Sequencer { [Header("Настройки взаимодействия")] [SerializeField] private bool isOneTime; [Header("Префабы для сообщений")] [SerializeField] private GameObject messagePlaceholderPrefab; [SerializeField] private GameObject messageBubblePrefab; private bool _isTriggered; private Transform _placeholder; private void OnTriggerEnter2D(Collider2D other) { if (IsExecuting || _isTriggered || !other.CompareTag("Player")) return; InitializeSequence(other.gameObject); if (isOneTime) _isTriggered = true; } /// /// Получает или создает единственный Message Placeholder на сцене. /// Placeholder становится дочерним объектом родителя MessageController. /// private Transform GetOrCreatePlaceholder() { if (_placeholder != null) return _placeholder; // Ищем существующий placeholder среди дочерних объектов родителя Transform parentTransform = transform.parent ? transform.parent : transform; _placeholder = parentTransform.Find("Message Placeholder"); if (_placeholder == null) { // Создаем новый placeholder как дочерний объект родителя MessageController GameObject placeholderInstance = Instantiate(messagePlaceholderPrefab, parentTransform); placeholderInstance.name = "Message Placeholder"; _placeholder = placeholderInstance.transform; } return _placeholder; } /// /// Добавляет сообщение с иконкой говорящего. /// /// Иконка (спрайт) говорящего персонажа /// Текст сообщения public void Add(Sprite speakerIcon, string text) { Transform placeholder = GetOrCreatePlaceholder(); // Создаем Message и добавляем его в placeholder GameObject messageInstance = Instantiate(messageBubblePrefab, placeholder); Message message = messageInstance.GetComponent(); if (message) { message.Initialize(text, speakerIcon); } } } }