Как при клике на определенную часть текста в Unity с использованием TextMeshPro запустить определенный метод или событие?

Как реализовать функцию, которая будет запускаться при клике на слово "ТЫЧКА" в TMP_Text? Я пробовал использовать тег "link", но не понимаю, как это работает. Я нашел пример кода ClickWordInTextTest.cs на GitHub, но у меня он не работает.
  • 13 ноября 2023 г. 19:43
Ответы на вопрос 3
Вот пример реализации функции, которая будет запускаться при клике на слово "ТЫЧКА" в TMP_Text:

1. Создайте новый пустой объект в сцене и добавьте к нему компонент TMP_Text.
2. Зайдите в редактор компонента TMP_Text и в поле "Text (UI)" введите текст, который содержит слово "ТЫЧКА".
3. Настройте стиль текста по своему усмотрению.
4. Создайте новый скрипт (например, WordClickHandler.cs) и прикрепите его к тому же объекту, где находится компонент TMP_Text.
5. В скрипте WordClickHandler определите следующие переменные и метод:

```C#
using UnityEngine;
using TMPro;
using UnityEngine.EventSystems;

public class WordClickHandler : MonoBehaviour, IPointerClickHandler
{
    private TMP_Text textComponent;

    private void Awake()
    {
        textComponent = GetComponent<TMP_Text>();
    }

    public void OnPointerClick(PointerEventData eventData)
    {
        if (eventData.button == PointerEventData.InputButton.Left)
        {
            string clickedWord = GetClickedWord(eventData);

            if (clickedWord == "ТЫЧКА")
            {
                // Выполните здесь свои действия при клике на слово "ТЫЧКА"
                Debug.Log("Слово 'ТЫЧКА' было нажато.");

                // Добавьте вызов нужного метода или события
            }
        }
    }

    private string GetClickedWord(PointerEventData eventData)
    {
        int clickedCharacterIndex = TMP_TextUtilities.FindIntersectingCharacter(textComponent, eventData.position, null);
        int clickedWordIndex = TMP_TextUtilities.FindIntersectingWord(textComponent, clickedCharacterIndex, null);

        TMP_WordInfo clickedWordInfo;
        textComponent.textInfo.wordInfo.TryGetValue(clickedWordIndex, out clickedWordInfo);

        string clickedWord = textComponent.text.Substring(clickedWordInfo.firstCharacterIndex, clickedWordInfo.characterCount);
        return clickedWord;
    }
}
```

6. Присвойте переменной textComponent ссылку на компонент TMP_Text в методе Awake().
7. В методе OnPointerClick обработайте клик только для левой кнопки мыши (если нужно).
8. Внутри метода OnPointerClick сравните clickedWord со значением "ТЫЧКА" и выполните свои действия при клике на это слово.
9. Внутри метода GetClickedWord получите индекс кликнутого символа, затем получите индекс слова, которому принадлежит этот символ.
10. Затем, используя индекс слова, получите информацию о слове и вырежьте само слово из текста.
11. Теперь вы можете добавить вызов нужного метода или события, когда слово "ТЫЧКА" будет нажато.
Информации много, но самое полезное можно найти в модуле TMP_TextUtilities, причем есть функции FindIntersectingCharacter и FindIntersectingLink, которые ценны для изучения. Вот ссылка на эту информацию: https://forum.unity.com/threads/clickable-link-wit...
Кроме этого, можно применить другой метод - разбивать предложения со ссылками на фрагменты. Например, вместо "бла бла бла ТЫЧКА", получится два отдельных элемента - "бла бла бла" и "ТЫЧКА". Затем, можно отслеживать нажатия на соответствующие компоненты.
Похожие вопросы