TextMeshProを使用して、タップした箇所の文字を取得するための一般的な処理について説明します。
using TMPro;
using UnityEngine.EventSystems;
<summary>
</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クラスを使用して、タップした箇所のリンク、文字、および単語を取得する方法を示しています。