79 lines
3.2 KiB
C#
79 lines
3.2 KiB
C#
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<Collider2D>();
|
||
|
||
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<Message>();
|
||
|
||
if (message)
|
||
{
|
||
message.Initialize(text);
|
||
}
|
||
}
|
||
}
|
||
} |