Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 检测我是否单击了文本的某个部分_C#_Unity3d_Text - Fatal编程技术网

C# 检测我是否单击了文本的某个部分

C# 检测我是否单击了文本的某个部分,c#,unity3d,text,C#,Unity3d,Text,我正在使用Unity创建一个Android/IOS应用程序 在包含段落的页面中,我想知道是否单击了文本的最后一句。(“单击此处了解更多详细信息”例如)。 点击这个句子后,我想打开一个新的页面 我知道我可以放置2个文本元素,将这个句子添加到第二个元素,将重置添加到第一个元素,并在第二个元素上添加onClick事件 这是问题的解决方案,但在我的例子中,它无法解决问题,因为我动态地获取文本,并且文本大小会不时变化,因此第二个文本元素在第一个元素结束后不会在同一行上开始 我需要一个解决方案,这是在代码完

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

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

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

这是问题的解决方案,但在我的例子中,它无法解决问题,因为我动态地获取文本,并且文本大小会不时变化,因此第二个文本元素在第一个元素结束后不会在同一行上开始

我需要一个解决方案,这是在代码完成

我看到了,但它是针对HTML和JavaScript的,不是针对Unity的

我将发布一个答案的代码片段,它与我想要的具有相同的行为

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
,因为我使用了
屏幕空间覆盖
画布,没有一个特定的
摄像头
提到了最后一个问题:如果我想检查我是否点击了一个句子而不是一个单词,怎么办?因为这个句子中的一个单词可能在另一个句子中。在这种情况下,我想你必须按索引进行搜索。例如,你可以数一数单词,并使用最后一个可点击句子的长度范围。然后你可以do
if(wordIndex>text.textInfo.wordInfo.Length-LastSentenceLength-1)