Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.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# 如何在Unity中覆盖InputField中END按钮的默认行为?_C#_Unity3d_Input Field - Fatal编程技术网

C# 如何在Unity中覆盖InputField中END按钮的默认行为?

C# 如何在Unity中覆盖InputField中END按钮的默认行为?,c#,unity3d,input-field,C#,Unity3d,Input Field,我试图在Unity中创建一个简单的文本编辑器 现在,我正在尝试覆盖标准的结束键盘键功能 我使用“新”用户界面系统和InputField作为文本编辑器。 它已启用多行。通常情况下,当焦点在输入字段上时,点击End(在普通物理键盘上)时,插入符号会转到整个文本字段的末尾。我希望它只到当前行的末尾。基本上,我想要的功能与普通文本编辑器(如Notepad++)中的功能相同 到目前为止,我在InputField上有一个如下的脚本: public InputField editor; // This is

我试图在Unity中创建一个简单的文本编辑器

现在,我正在尝试覆盖标准的结束键盘键功能

我使用“新”用户界面系统和
InputField
作为文本编辑器。 它已启用多行。通常情况下,当焦点在
输入字段
上时,点击End(在普通物理键盘上)时,插入符号会转到整个
文本字段
的末尾。我希望它只到当前行的末尾。基本上,我想要的功能与普通文本编辑器(如Notepad++)中的功能相同

到目前为止,我在
InputField
上有一个如下的脚本:

public InputField editor; // This is the InputField

void Update() 
{
    if (Input.GetKeyDown(KeyCode.End))
    {
        string code = editor.text;
        int caretPos = editor.caretPosition;

        int newLineIndex = FindEndOfLine(code, caretPos);
        editor.caretPosition = newLineIndex;
    }
}

int FindEndOfLine(string text, int startIndex)
{
    for (int i = startIndex; i < text.Length; i++)
    {
        Debug.Log(text[i]);

        if (text[i] == '\n')
        {
            Debug.Log("FOUND IT: " + i);
            return i;
        }
    }

    return text.Length;
}
公共输入字段编辑器;//这是输入字段
无效更新()
{
if(Input.GetKeyDown(KeyCode.End))
{
字符串代码=editor.text;
int caretPos=editor.caretPosition;
int newLineIndex=FindEndOfLine(代码,caretPos);
editor.caretPosition=newLineIndex;
}
}
int FindEndOfLine(字符串文本,int startIndex)
{
for(int i=startIndex;i
如果我将它用于另一个键,比如
KeyCode.Y
,那么它工作得非常好。它找到正确的插入符号位置并将插入符号移动到该位置。但是,它还会打印字符
Y

当我使用
KeyCode.End
并点击End键时,它只会进入整个
TextField
的末尾。所以我认为我的代码可以工作,但它在脚本执行后执行正常的结束键功能


如何防止这种默认行为?我已经用谷歌搜索了25分钟。

请尝试以下解决方案。您应该继承
InputField
类,重写
Rebuild
方法以保存
CaretPosition
并重写
LateUpdate
方法以更改结束键的行为。完成后,将
GameObject
上的
InputField
组件替换为
CustomInputField
脚本

using UnityEngine;
using UnityEngine.UI;

public class CustomInputField : InputField
{
    private int oldCaretPosition;

    public override void Rebuild(CanvasUpdate update)
    {
        base.Rebuild(update);
        oldCaretPosition = caretPosition;
    }

    protected override void LateUpdate()
    {
        base.LateUpdate();
        if (Input.GetKeyDown(KeyCode.End))
        {
            int newLineIndex = FindEndOfLine(oldCaretPosition);
            caretPosition = newLineIndex;
        }
    }

    private int FindEndOfLine(int startIndex)
    {
        for (int i = startIndex; i < text.Length; i++)
        {
            if (text[i] == '\n')
            {
                return i;
            }
        }
        return text.Length;
    }
}
使用UnityEngine;
使用UnityEngine.UI;
公共类CustomInputField:InputField
{
私人内部旧的护理岗位;
公共覆盖无效重建(CanvasUpdate更新)
{
基础。重建(更新);
oldCaretPosition=caretPosition;
}
受保护的覆盖无效更新()
{
base.LateUpdate();
if(Input.GetKeyDown(KeyCode.End))
{
int newLineIndex=FindEndOfLine(oldCaretPosition);
caretPosition=换行索引;
}
}
私人int FindEndOfLine(int startIndex)
{
for(int i=startIndex;i
请尝试以下解决方案。您应该继承
InputField
类,重写
Rebuild
方法以保存
CaretPosition
并重写
LateUpdate
方法以更改结束键的行为。完成后,将
GameObject
上的
InputField
组件替换为
CustomInputField
脚本

using UnityEngine;
using UnityEngine.UI;

public class CustomInputField : InputField
{
    private int oldCaretPosition;

    public override void Rebuild(CanvasUpdate update)
    {
        base.Rebuild(update);
        oldCaretPosition = caretPosition;
    }

    protected override void LateUpdate()
    {
        base.LateUpdate();
        if (Input.GetKeyDown(KeyCode.End))
        {
            int newLineIndex = FindEndOfLine(oldCaretPosition);
            caretPosition = newLineIndex;
        }
    }

    private int FindEndOfLine(int startIndex)
    {
        for (int i = startIndex; i < text.Length; i++)
        {
            if (text[i] == '\n')
            {
                return i;
            }
        }
        return text.Length;
    }
}
使用UnityEngine;
使用UnityEngine.UI;
公共类CustomInputField:InputField
{
私人内部旧的护理岗位;
公共覆盖无效重建(CanvasUpdate更新)
{
基础。重建(更新);
oldCaretPosition=caretPosition;
}
受保护的覆盖无效更新()
{
base.LateUpdate();
if(Input.GetKeyDown(KeyCode.End))
{
int newLineIndex=FindEndOfLine(oldCaretPosition);
caretPosition=换行索引;
}
}
私人int FindEndOfLine(int startIndex)
{
for(int i=startIndex;i
工作起来很有魅力。我打算用谷歌搜索它,但是你能简单地解释一下最新的更新和重建方法是做什么的,以及为什么我需要把KeyDown处理程序放在这里,而不是作为一个单独的脚本吗。首先,我们需要保存插入符号位置,然后再将其移动到文本末尾。我试图找到一个可以重写的方法并保存插入符号位置。结果证明,
Rebuild
方法适用于此目的。我只是凭猜测学会了这个方法。正如文档所述,
Rebuild
方法将重建输入字段的几何图形。(插入符号和突出显示)<在调用所有
Update
函数后,将调用code>LateUpdate
。因此,我有机会在插入符号移到文本末尾后,将其移到行尾。效果非常好。我打算用谷歌搜索它,但是你能简单地解释一下最新的更新和重建方法是做什么的,以及为什么我需要把KeyDown处理程序放在这里,而不是作为一个单独的脚本吗。首先,我们需要保存插入符号位置,然后再将其移动到文本末尾。我试图找到一个可以重写的方法并保存插入符号位置。结果证明,
Rebuild
方法适用于此目的。我只是凭猜测学会了这个方法。正如文档所述,
Rebuild
方法将重建输入字段的几何图形。(插入符号和突出显示)<在调用所有
Update
函数后,将调用code>LateUpdate。因此,在将插入符号移动到文本末尾之后,我有机会将其移动到行尾。