Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.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输入字段在一段时间后锁定以前键入的字符_C#_Unity3d_Input Field - Fatal编程技术网

C# Unity输入字段在一段时间后锁定以前键入的字符

C# Unity输入字段在一段时间后锁定以前键入的字符,c#,unity3d,input-field,C#,Unity3d,Input Field,我一直在Unity C#中玩文字游戏,对于我想要实现的反作弊机制,我已经陷入了停顿 在输入字段中输入第一个字母后,我开始运行2秒计时器。2秒钟后,如果玩家未提交或键入其他字母,则输入字段应将先前键入的字母锁定在输入字段的适当位置,之后键入的任何字母都应在其之后键入 以下是我目前掌握的代码: currTime = 0; hasInput = false; lockedString = ""; void Update(){ if(hasInput){ currTime +=

我一直在Unity C#中玩文字游戏,对于我想要实现的反作弊机制,我已经陷入了停顿

在输入字段中输入第一个字母后,我开始运行2秒计时器。2秒钟后,如果玩家未提交或键入其他字母,则输入字段应将先前键入的字母锁定在输入字段的适当位置,之后键入的任何字母都应在其之后键入

以下是我目前掌握的代码:

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只需将
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)我已更新我的答案,以包括插入符号位置更新