C# 检测我是否单击了文本的某个部分
我正在使用Unity创建一个Android/IOS应用程序 在包含段落的页面中,我想知道是否单击了文本的最后一句。(“单击此处了解更多详细信息”例如)。 点击这个句子后,我想打开一个新的页面 我知道我可以放置2个文本元素,将这个句子添加到第二个元素,将重置添加到第一个元素,并在第二个元素上添加onClick事件 这是问题的解决方案,但在我的例子中,它无法解决问题,因为我动态地获取文本,并且文本大小会不时变化,因此第二个文本元素在第一个元素结束后不会在同一行上开始 我需要一个解决方案,这是在代码完成 我看到了,但它是针对HTML和JavaScript的,不是针对Unity的 我将发布一个答案的代码片段,它与我想要的具有相同的行为C# 检测我是否单击了文本的某个部分,c#,unity3d,text,C#,Unity3d,Text,我正在使用Unity创建一个Android/IOS应用程序 在包含段落的页面中,我想知道是否单击了文本的最后一句。(“单击此处了解更多详细信息”例如)。 点击这个句子后,我想打开一个新的页面 我知道我可以放置2个文本元素,将这个句子添加到第二个元素,将重置添加到第一个元素,并在第二个元素上添加onClick事件 这是问题的解决方案,但在我的例子中,它无法解决问题,因为我动态地获取文本,并且文本大小会不时变化,因此第二个文本元素在第一个元素结束后不会在同一行上开始 我需要一个解决方案,这是在代码完
const clickables=document.queryselectoral(“.clickable”)
可点击。forEach(el=>新的可点击(el))
功能可点击(el){
const_handleClick=({target})=>console.log(target.innerHTML)
const text=el.textContent.split(/\s/)
el.innerHTML=“”
text.forEach(t=>{
const span=document.createElement('span')
span.innerHTML=`${t}`
span.addEventListener('click',_handleClick)
el.附属儿童(span)
})
}
一些文本
一些更多text2
此视频描述了一个类似的概念,只是它检测到点击和在特定字符上悬停
要使其符合您的想法,您只需更改被按下字符的索引,然后检查它是否在文本末尾的特定范围内
希望有帮助 可以使用或代替文本
。然后你就可以用电脑做很多有趣的事情了
事实上,有很多非常好的理由可以说明为什么转换到使用TMP而不是使用Text
——到目前为止,我还没有找到一个好的理由可以让我更喜欢Text
,而不是TMP
链接显示了更多奇特的用例
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);
}
}
}
}
只需在对象和脚本中用TextMeshProUGUI
组件替换Text
组件即可。设置文本
的用法完全相同
我想知道我是否点击了课文的最后一句。(“单击此处了解更多详细信息”
您也可以使用FindIntersectingLine
而不是FindIntersectingWord
,然后检查索引以仅触发最后一个事件
if(lineIndex == text.lineCount - 1)
请注意,此处的线条表示实际显示的线条-不一定是换行符
或者,你可以计算并定义最后一句话中的单词数量,并使用
if(wordIndex > text.textInfo.wordCount - LastSentenceLength)
或者..您也可以直接使用,然后您可以使用FindIntersectingLink
并检查是否点击了最后一个
if(lineIndex == text.lineCount - 1)
注意:确保通过与
画布使用的摄影机相同的摄影机。我使用了null
,因为我使用的是屏幕空间覆盖
画布,没有引用特定的摄影机
。如果您使用的是世界空间
,您必须
- 参考
画布中的摄像机
→事件摄像机
- 将相同的
摄像机
传递给FindIntersectingXXX
可以通过@derHugo实现显然,现在每个材质都有多个网格textInfo.meshInfo[textInfo.characterInfo[currentCharacter].materialReferenceIndex].vertices
@Iggy yeah只是注意到这并不重要..不需要只获取悬停词我使用了Text Mesh Pro UGUI。而且我总是使用charIndex-1确保通过与画布
相同的相机
。我使用null
,因为我使用了屏幕空间覆盖
画布,没有一个特定的摄像头
提到了最后一个问题:如果我想检查我是否点击了一个句子而不是一个单词,怎么办?因为这个句子中的一个单词可能在另一个句子中。在这种情况下,我想你必须按索引进行搜索。例如,你可以数一数单词,并使用最后一个可点击句子的长度范围。然后你可以doif(wordIndex>text.textInfo.wordInfo.Length-LastSentenceLength-1)