うにてぃブログ

主にUnityとC#に関する記事を書いていきます

【Unity】TextMeshPro でタップした箇所の文字を取得する汎用処理とサンプルコード

TextMeshProを使用して、タップした箇所の文字を取得するための一般的な処理について説明します。

using TMPro;
using UnityEngine.EventSystems;

/// <summary>
/// TextMeshPro のタップ処理
/// </summary>
public static class TextMeshProTapUtility
{
    /// <summary>
    /// タップした箇所の文字を取得
    /// </summary>
    public static bool TryGetTapCharacter(this TMP_Text self, PointerEventData eventData, out char character)
    {
        character = default;
        var index = TMP_TextUtilities.FindIntersectingCharacter(self, eventData.position, eventData.pressEventCamera, false);
        if (index < 0)
            return false;
        
        character = self.textInfo.characterInfo[index].character;
        return true;
    }
    
    /// <summary>
    /// タップした箇所の単語を取得
    /// </summary> 
    public static bool TryGetTapWord(this TMP_Text self, PointerEventData eventData, out string word)
    {
        word = default;
        var index = TMP_TextUtilities.FindIntersectingWord(self, eventData.position, eventData.pressEventCamera);
        if (index < 0)
            return false;
        
        var wordInfo = self.textInfo.wordInfo[index];
        var wordStartIndex = wordInfo.firstCharacterIndex;
        word = self.text.Substring(wordStartIndex, wordInfo.characterCount);
        return true;
    }
    
    /// <summary>
    /// タップした箇所のリンクを取得
    /// </summary>
    public static bool TryGetLink(this TMP_Text self, PointerEventData eventData, out string link)
    {
        link = default;
        var index = TMP_TextUtilities.FindIntersectingLink(self, eventData.position, eventData.pressEventCamera);
        if (index < 0)
            return false;
        
        link = self.textInfo.linkInfo[index].GetLinkID();
        return true;
    }
}

サンプル

以下は、上記のユーティリティクラスを利用したサンプルコードです。

using UnityEngine;
using TMPro;
using UnityEngine.EventSystems;

public class TextMeshProClickHandler : MonoBehaviour, IPointerClickHandler
{
    [SerializeField]
    private TextMeshProUGUI _textMeshPro;

    public void OnPointerClick(PointerEventData eventData)
    {
        if (_textMeshPro.TryGetLink(eventData, out var link))
        {
            Debug.Log("Clicked link: " + link);
        }
        
        if (_textMeshPro.TryGetTapCharacter(eventData, out var character))
        {
            Debug.Log("Clicked character: " + character);
        }
        
        if (_textMeshPro.TryGetTapWord(eventData, out var word))
        {
            Debug.Log("Clicked word: " + word);
        }
    }
}

このサンプルコードは、TextMeshProTapUtilityクラスを使用して、タップした箇所のリンク、文字、および単語を取得する方法を示しています。