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