C# Unity输入字段在一段时间后锁定以前键入的字符
我一直在Unity C#中玩文字游戏,对于我想要实现的反作弊机制,我已经陷入了停顿 在输入字段中输入第一个字母后,我开始运行2秒计时器。2秒钟后,如果玩家未提交或键入其他字母,则输入字段应将先前键入的字母锁定在输入字段的适当位置,之后键入的任何字母都应在其之后键入 以下是我目前掌握的代码:C# Unity输入字段在一段时间后锁定以前键入的字符,c#,unity3d,input-field,C#,Unity3d,Input Field,我一直在Unity C#中玩文字游戏,对于我想要实现的反作弊机制,我已经陷入了停顿 在输入字段中输入第一个字母后,我开始运行2秒计时器。2秒钟后,如果玩家未提交或键入其他字母,则输入字段应将先前键入的字母锁定在输入字段的适当位置,之后键入的任何字母都应在其之后键入 以下是我目前掌握的代码: currTime = 0; hasInput = false; lockedString = ""; void Update(){ if(hasInput){ currTime +=
currTime = 0;
hasInput = false;
lockedString = "";
void Update(){
if(hasInput){
currTime += Time.deltaTime * 1;
if(currTime >= 2){
//Stores current string value of input field
lockedString = inputField.text;
}
}
}
void OnInputValueChange(){
currTime = 0;
hasInput = true;
if(lockedString != ""){
inputField.text = lockedString + inputField.text;
}
}
现在,每当输入字段的值发生更改时,我都会运行OnInputValueChange()
。我还设法在计时器达到2秒时存储到目前为止输入的字符串,但我不知道如何使其在输入字段中将锁定的字符串“锁定”到前面,并允许更改后面键入的字母。代码inputField.text=lockedString+inputField.text每次更改值时,code>只需将lockedString
变量添加到输入字段
期望的结果在伪代码中是这样的:
//User types "bu"
//2 second timer starts
//During these 2 seconds, user can delete "bu" or continue typing
//User deletes "bu" and types "ah"
//Once the 2 second timer ends, whatever string is now in input is locked
//"ah" is now locked at the front of the input field
//After locking "ah", user cannot delete it anymore, but can continue typing
任何关于我如何实现这一目标的见解都将非常有用。谢谢你花时间帮忙,我真的很感激 目前,您只需连接字符串。您需要检查字符串是否以相同的字符开头,如果不是,则完全覆盖输入:
void Update() {
if (hasInput && ((Time.time - inputTime) > 2f))
{
//Stores current string value of input field
lockedString = inputField.text;
hasInput = false;
}
}
void OnInputValueChange() {
inputTime = Time.time;
hasInput = true;
if ((lockedString.Length > 0) && (inputField.text.IndexOf(lockedString) != 0)) {
// Replace invalid string
inputField.text = lockedString;
// Update cursor position
inputField.MoveTextEnd(false);
}
}
注意:我实施了另一种测量时间流逝的方法。您可以用自己的方法替换它。目前,您只需连接字符串即可。您需要检查字符串是否以相同的字符开头,如果不是,则完全覆盖输入:
void Update() {
if (hasInput && ((Time.time - inputTime) > 2f))
{
//Stores current string value of input field
lockedString = inputField.text;
hasInput = false;
}
}
void OnInputValueChange() {
inputTime = Time.time;
hasInput = true;
if ((lockedString.Length > 0) && (inputField.text.IndexOf(lockedString) != 0)) {
// Replace invalid string
inputField.text = lockedString;
// Update cursor position
inputField.MoveTextEnd(false);
}
}
注意:我实施了另一种测量时间流逝的方法。请随意用您自己的方法替换此选项。谢谢您的帮助,我一到家就会测试此选项!工作得很有魅力!谢谢如果我可以问另一个后续问题,现在,输入字段很好地锁定了玩家的输入,但是当我试图删除字母时,光标会向后移动,而不会更改字符串。有没有办法确保光标始终位于锁定字符串的前面?非常感谢,+1.查看一下。。。我没有看到太多的解决方案,我相信您正在寻找inputField.MoveTextEnd(false)代码>我已经更新了我的答案,包括插入符号位置更新。谢谢你的帮助,我一回到家就会测试!工作得很有魅力!谢谢如果我可以问另一个后续问题,现在,输入字段很好地锁定了玩家的输入,但是当我试图删除字母时,光标会向后移动,而不会更改字符串。有没有办法确保光标始终位于锁定字符串的前面?非常感谢,+1.查看一下。。。我没有看到太多的解决方案,我相信您正在寻找inputField.MoveTextEnd(false)代码>我已更新我的答案,以包括插入符号位置更新