c# - 检测我是否点击了文本的特定部分

标签 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>

最佳答案

可以使用 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的用法完全一样。

I want to know if I click on the last sentence of the text. ("Click here for more details"

除了 FindIntersectingWord,您还可以使用 FindIntersectingLine,然后检查索引以仅触发最后一个事件。

if(lineIndex == text.lineCount - 1)

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

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

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

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


注意:确保传入与 Canvas 相同的相机。我使用 null 是因为我使用了 ScreenSpace-Overlay Canvas ,但没有引用某个 Camera。如果您使用例如WorldSpace 你必须

  • Canvas 中引用 CameraEvent Camera
  • 将相同的 Camera 传递给 FindIntersectingXXX

关于c# - 检测我是否点击了文本的特定部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57690985/

相关文章:

android - 如何从apk提取统一游戏的声音?

text - 文本的应用程序/普通 MIME 类型?

css - 文本不会填充列中的容器

javascript - react native Android : Contain text to inside parent view on a single line

C# - 是否可以通过使用接口(interface)来实现单例模式?

c# - 基于.Net 的开源搜索引擎?

c# - 使用代码契约来定义不可变接口(interface)?

c# - 缓存信息存储在 ASP.NET 中的什么位置?

c# - Unity : Do I have to learn one, 或两者(C#、UnityScript)

c# - gameObject 在它所附加的 GameObject 的脚本中是否等同于此?