检测我是否单击了文本的特定部分

时间:2019-08-28 11:06:57

标签: c# unity3d text

我正在使用Unity创建一个Android / IOS应用程序。

在包含段落的页面中,我想知道是否单击文本的最后一句。 (例如,“单击此处获取更多详细信息”)。 单击此句子后,我想打开一个新页面。

我知道我可以放置2个文本元素,然后将此句子添加到第二个元素,然后将重置语句添加到第一个元素,然后在第二个元素上添加onClick事件。

这是一个解决问题的方法,但就我而言,它无法解决问题,因为我正在动态获取文本,并且其大小会不时变化,因此第二个文本元素不会在同一位置开始第一个元素结束后的一行。

我需要一个用代码完成的解决方案。

我看到了same question,但它用于HTML和JavaScript,而不是Unity。

我将发布答案的代码片段之一,其行为与我想要的相同。

const clickables = document.querySelectorAll('.clickable')
clickables.forEach(el => new Clickable(el))

function Clickable (el) {
  const _handleClick = ({target}) => console.log(target.innerHTML)
  const texts = el.textContent.split(/\s/)
  
  el.innerHTML = ''
  
  texts.forEach(t => {
    const span = document.createElement('span')
    span.innerHTML = `${t} `
    span.addEventListener('click', _handleClick)
    el.appendChild(span)
  })
}
<h1 class="clickable">Some text</h1>

<h2 class="clickable">Some! more! text2</h1>

2 个答案:

答案 0 :(得分:6)

可以使用TextMeshProTextMeshProUGUI代替Text。然后,您可以使用TMP_TextUtilities做很多花哨的事情。

实际上,有很多很好的理由值得我们改用TMP代替Text-到目前为止,我还没有找到比Text更喜欢TMP的好人。

链接的TMP_TextUtilities tutorial 显示了更多精美的用例。

public class Example : MonoBehaviour
{
    public TextMeshProUGUI text;

    public string LastClickedWord;

    private void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            var wordIndex = TMP_TextUtilities.FindIntersectingWord(text, Input.mousePosition, null);

            if (wordIndex != -1)
            {
                LastClickedWord = text.textInfo.wordInfo[wordIndex].GetWord();

                Debug.Log("Clicked on " + LastClickedWord);
            }
        }
    }
}

enter image description here

用对象上和脚本中的Text组件替换TextMeshProUGUI组件。设置text的用法完全相同。

  

我想知道是否单击文本的最后一句。 (“点击此处获取更多详细信息”

您也可以使用FindIntersectingWord代替FindIntersectingLine,然后检查索引以仅触发最后一个事件。

if(lineIndex == text.lineCount - 1)

请注意,此处的行表示实际显示的行-不一定是换行符

或者您可以例如计算并定义最后一句话中的单词数量,然后使用

if(wordIndex > text.textInfo.wordCount - LastSentenceLength)

或者..您也可以直接使用Link,然后可以使用FindIntersectingLink并检查是否击中了最后一个。


注意:请确保传递与Canvas所用的相机相同的相机。我使用null是因为我使用了ScreenSpace-Overlay画布,但未引用某些Camera。如果您使用例如WorldSpace,您必须

  • CameraCanvas中引用Event Camera
  • 将相同的Camera传递给FindIntersectingXXX

答案 1 :(得分:0)

该视频描述了类似的概念,只是它可以检测到点击并悬停在特定字符上。 https://www.youtube.com/watch?v=wg9WAwd8TKM

要使其适用于您的想法,您可以仅按一下所按字符的索引,然后检查它是否在文本末尾的一定范围内。

希望有帮助!