我一直在使用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
任何有关如何实现此类目标的见解都会非常有用。感谢您抽出宝贵时间提供帮助,我真的很感激!
答案 0 :(得分:0)
目前,您只是连接字符串。您需要检查字符串是否以相同的字符开头,如果不是,则完全覆盖输入:
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);
}
}
注意:我已经实施了另一种测量时间的方法。您可以使用自己的方法替换它。