我正在使用 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>
最佳答案
可以使用 TextMeshPro或 TextMeshProUGUI而不是 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);
}
}
}
}
只需将对象和脚本中的 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
中引用Camera
→Event Camera
- 将相同的
Camera
传递给FindIntersectingXXX
关于c# - 检测我是否点击了文本的特定部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57690985/