c# - 检测我是否点击了文本的某个部分
问题描述
我正在使用 Unity 创建一个 Android/IOS 应用程序。
在包含段落的页面中,我想知道是否单击了文本的最后一句话。(例如“单击此处了解更多详细信息”)。点击这句话后,我想打开一个新页面。
我知道我可以放置 2 个文本元素并将这句话添加到第二个元素,然后重置到第一个元素并在第二个元素上添加 onClick 事件。
这是问题的解决方案,但在我的情况下,它不能解决问题,因为我正在动态获取文本并且它的大小会不时改变,所以第二个文本元素不会在同一行之后开始第一个元素结束。
我需要一个用代码完成的解决方案。
我看到了同样的问题,但它是针对 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>
解决方案
可以使用TextMeshPro或TextMeshProUGUI而不是Text
. 然后你可以使用TMP_TextUtilities
.
实际上,有很多非常好的理由说明为什么值得改用 TMP 而不是Text
- 到目前为止,我还没有找到任何Text
比 TMP 更喜欢的好理由。
链接的TMP_TextUtilities
教程展示了更多奇特的用例。
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);
}
}
}
}
只需将Text
组件替换为TextMeshProUGUI
对象和脚本中的组件即可。设置的用法text
完全相同。
我想知道我是否点击了文本的最后一句话。(“点击这里查看更多详情”
而不是FindIntersectingWord
你也可以使用FindIntersectingLine
然后检查索引以仅触发最后一个事件。
if(lineIndex == text.lineCount - 1)
请注意,此处的行表示实际显示的行 - 不一定是换行符
或者您可以例如计算和定义最后一句中的单词数量并使用
if(wordIndex > text.textInfo.wordCount - LastSentenceLength)
或者..您也可以直接使用链接,然后您可以使用FindIntersectingLink
并检查您是否点击了最后一个。
注意:确保传入与Canvas
. 我使用null
是因为我使用了ScreenSpace-Overlay
没有特定Camera
参考的画布。如果您正在使用例如WorldSpace
,您必须
- 参考→
Camera
_Canvas
Event Camera
- 把同样的东西传递
Camera
给FindIntersectingXXX
推荐阅读
- angular - 使用电容器开发跨平台应用程序时,我应该使用 Ionic 还是仅使用 Angular 开发它?
- javascript - 将下拉行为更改为悬停而不是单击
- node.js - JWT 有效负载中的令牌
- python - 如何使用不同的目录对作业进行多处理以运行该进程
- javascript - 反应从孙子到祖父母的共享错误消息
- angular - 从 Angular 表单获取自动完成表单数据
- java - 通过 HDMI CEC 从 Android 应用程序控制电视
- javascript - javascript 嵌套模板字符串
- typescript - 容纳或回避数据集和 setAttribute 类型/可选类型的目的
- javafx - 将 Drop Swing 拖放到 JavaFX 在没有调试模式的情况下无法工作