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);
}
}
}
}