递减数组中的最后一个字符串元素而不在 C# 中删除它?
Decrementing last string element in array without removing it in C#?
我目前正在 Unity 上做一个演示,我将整个字母表放在一个数组中。对于退格函数,我想减少数组中的最后一个字符串元素,但它不起作用。
[SerializeField] private GameObject keyboard;
[SerializeField] private Text keyboardInput;
private KeyCode[] MyKeys = {KeyCode.A, KeyCode.B,KeyCode.C,KeyCode.D, KeyCode.E,KeyCode.F,KeyCode.G,KeyCode.H,KeyCode.I,KeyCode.J,KeyCode.K,KeyCode.L,KeyCode.M,KeyCode.N,KeyCode.O,KeyCode.P,KeyCode.Q,KeyCode.R,KeyCode.S,KeyCode.T, KeyCode.U ,KeyCode.V,KeyCode.W,KeyCode.X,KeyCode.Y,KeyCode.Z, KeyCode.Space, KeyCode.Backspace };
private string[] currText;
void Start()
{
keyboardInput.text = currText.ToString();
}
private void typeKeys()
{
for (var i = 0; i < MyKeys.Length; i++)
{
if (Input.GetKeyDown(MyKeys[i]))
{
if (i == 0)
{
keyboardInput.text += "a";
}
else if (i == 1)
{
keyboardInput.text += "b";
}
else if (i == 2)
{
keyboardInput.text += "c";
}
else if (i == 3)
{
keyboardInput.text += "d";
}
else if (i == 4)
{
keyboardInput.text += "e";
}
else if (i == 5)
{
keyboardInput.text += "f";
}
else if (i == 6)
{
keyboardInput.text += "g";
}
else if (i == 7)
{
keyboardInput.text += "h";
}
else if (i == 8)
{
keyboardInput.text += "i";
}
else if (i == 9)
{
keyboardInput.text += "j";
}
else if (i == 10)
{
keyboardInput.text += "k";
}
else if (i == 11)
{
keyboardInput.text += "l";
}
else if (i == 12)
{
keyboardInput.text += "m";
}
else if (i == 13)
{
keyboardInput.text += "n";
}
else if (i == 14)
{
keyboardInput.text += "o";
}
else if (i == 15)
{
keyboardInput.text += "p";
}
else if (i == 16)
{
keyboardInput.text += "q";
}
else if (i == 17)
{
keyboardInput.text += "r";
}
else if (i == 18)
{
keyboardInput.text += "s";
}
else if (i == 19)
{
keyboardInput.text += "t";
}
else if (i == 20)
{
keyboardInput.text += "u";
}
else if (i == 21)
{
keyboardInput.text += "v";
}
else if (i == 22)
{
keyboardInput.text += "w";
}
else if (i == 23)
{
keyboardInput.text += "x";
}
else if (i == 24)
{
keyboardInput.text += "y";
}
else if (i == 25)
{
keyboardInput.text += "z";
}
else if (i == 26)
{
keyboardInput.text += " ";
}
else if (i == 27)
{
currText = currText.Take(currText.Length - 1).ToArray();
}
}
};
}
// Update is called once per frame
void Update()
{
typeKeys();
}
这是我要开始工作的部分
else if (i == 27)
{
currText = currText.Take(currText.Length - 1).ToArray();
}
我的意思是 不起作用 是我无法从我的数组中删除最后一个字母,因此在我的虚拟设置中的句子中使用退格键的效果。这是整个脚本。
这不是您问题的答案,要获得正确的答案,您需要 post 您的完整代码和对问题所在的良好解释,但我认为我会 post 这可能对你有用。
我已经重构了你的typeKeys()
方法。
private void typeKeys()
{
foreach (var key in MyKeys.Where(k => k != KeyCode.Space).Where(k => k != KeyCode.Backspace))
{
if (Input.GetKeyDown(key))
{
keyboardInput.text += key.ToString().ToLower();
}
}
if (Input.GetKeyDown(KeyCode.Space))
{
keyboardInput.text += " ";
}
if (Input.GetKeyDown(KeyCode.Backspace))
{
currText = currText.Take(currText.Length - 1).ToArray();
}
}
就是这样。
行 currText = currText.Take(currText.Length - 1).ToArray();
应该可以将正确定义的数组截断一个元素,或者只是将其保持为零个元素。
让我们从减少代码量开始。然后,在那之后,我们还可以利用两个事实; Unity 有一个 KeyCode 枚举,字母表按从 'a' 到 'a'+25 的值排序。我会用一些代码来阐明这一点:
private Text keyboardInput;
List<char> charList = new List<char> ( );
private void typeKeys( )
{
var length = charList.Count;
if ( Input.GetKeyDown ( KeyCode.Space ) )
charList.Add ( ' ' );
if ( Input.GetKeyDown ( KeyCode.Backspace ) && length > 0 )
charList.RemoveAt ( length - 1 );
for ( var i = 0; i < 26; i++ )
if ( Input.GetKeyDown ( KeyCode.A + i ) ) charList.Add ( ( char ) ( 'a' + i ) );
if ( length != charList.Count ) keyboardInput.text = string.Concat ( charList );
}
我在这里所做的是首先检查 Space 键,然后是 Backspace 键。之后,我遍历字母表字符,将 i
值添加到 KeyCode.A
。请记住,默认情况下枚举只是 int
。如果匹配,我们将相应的 i
值添加到 'a' 字符并将其添加到 List<char>
列表,同时记住将结果值转换回 char
首先.
最后,如果您的字符数组的长度发生变化,那么,并且只有在那时,我们才会更新您的 keyboardInput.text
。这是为了帮助节省每一帧产生的字符串垃圾。我们可以 Concat
一个 char
IEnumerable 到一个 string
.
使用此方法,您可以删除以 private KeyCode[] MyKeys
开头的整行。您不需要将所有 KeyCode
值存储在数组中以进行检查。
我目前正在 Unity 上做一个演示,我将整个字母表放在一个数组中。对于退格函数,我想减少数组中的最后一个字符串元素,但它不起作用。
[SerializeField] private GameObject keyboard;
[SerializeField] private Text keyboardInput;
private KeyCode[] MyKeys = {KeyCode.A, KeyCode.B,KeyCode.C,KeyCode.D, KeyCode.E,KeyCode.F,KeyCode.G,KeyCode.H,KeyCode.I,KeyCode.J,KeyCode.K,KeyCode.L,KeyCode.M,KeyCode.N,KeyCode.O,KeyCode.P,KeyCode.Q,KeyCode.R,KeyCode.S,KeyCode.T, KeyCode.U ,KeyCode.V,KeyCode.W,KeyCode.X,KeyCode.Y,KeyCode.Z, KeyCode.Space, KeyCode.Backspace };
private string[] currText;
void Start()
{
keyboardInput.text = currText.ToString();
}
private void typeKeys()
{
for (var i = 0; i < MyKeys.Length; i++)
{
if (Input.GetKeyDown(MyKeys[i]))
{
if (i == 0)
{
keyboardInput.text += "a";
}
else if (i == 1)
{
keyboardInput.text += "b";
}
else if (i == 2)
{
keyboardInput.text += "c";
}
else if (i == 3)
{
keyboardInput.text += "d";
}
else if (i == 4)
{
keyboardInput.text += "e";
}
else if (i == 5)
{
keyboardInput.text += "f";
}
else if (i == 6)
{
keyboardInput.text += "g";
}
else if (i == 7)
{
keyboardInput.text += "h";
}
else if (i == 8)
{
keyboardInput.text += "i";
}
else if (i == 9)
{
keyboardInput.text += "j";
}
else if (i == 10)
{
keyboardInput.text += "k";
}
else if (i == 11)
{
keyboardInput.text += "l";
}
else if (i == 12)
{
keyboardInput.text += "m";
}
else if (i == 13)
{
keyboardInput.text += "n";
}
else if (i == 14)
{
keyboardInput.text += "o";
}
else if (i == 15)
{
keyboardInput.text += "p";
}
else if (i == 16)
{
keyboardInput.text += "q";
}
else if (i == 17)
{
keyboardInput.text += "r";
}
else if (i == 18)
{
keyboardInput.text += "s";
}
else if (i == 19)
{
keyboardInput.text += "t";
}
else if (i == 20)
{
keyboardInput.text += "u";
}
else if (i == 21)
{
keyboardInput.text += "v";
}
else if (i == 22)
{
keyboardInput.text += "w";
}
else if (i == 23)
{
keyboardInput.text += "x";
}
else if (i == 24)
{
keyboardInput.text += "y";
}
else if (i == 25)
{
keyboardInput.text += "z";
}
else if (i == 26)
{
keyboardInput.text += " ";
}
else if (i == 27)
{
currText = currText.Take(currText.Length - 1).ToArray();
}
}
};
}
// Update is called once per frame
void Update()
{
typeKeys();
}
这是我要开始工作的部分
else if (i == 27)
{
currText = currText.Take(currText.Length - 1).ToArray();
}
我的意思是 不起作用 是我无法从我的数组中删除最后一个字母,因此在我的虚拟设置中的句子中使用退格键的效果。这是整个脚本。
这不是您问题的答案,要获得正确的答案,您需要 post 您的完整代码和对问题所在的良好解释,但我认为我会 post 这可能对你有用。
我已经重构了你的typeKeys()
方法。
private void typeKeys()
{
foreach (var key in MyKeys.Where(k => k != KeyCode.Space).Where(k => k != KeyCode.Backspace))
{
if (Input.GetKeyDown(key))
{
keyboardInput.text += key.ToString().ToLower();
}
}
if (Input.GetKeyDown(KeyCode.Space))
{
keyboardInput.text += " ";
}
if (Input.GetKeyDown(KeyCode.Backspace))
{
currText = currText.Take(currText.Length - 1).ToArray();
}
}
就是这样。
行 currText = currText.Take(currText.Length - 1).ToArray();
应该可以将正确定义的数组截断一个元素,或者只是将其保持为零个元素。
让我们从减少代码量开始。然后,在那之后,我们还可以利用两个事实; Unity 有一个 KeyCode 枚举,字母表按从 'a' 到 'a'+25 的值排序。我会用一些代码来阐明这一点:
private Text keyboardInput;
List<char> charList = new List<char> ( );
private void typeKeys( )
{
var length = charList.Count;
if ( Input.GetKeyDown ( KeyCode.Space ) )
charList.Add ( ' ' );
if ( Input.GetKeyDown ( KeyCode.Backspace ) && length > 0 )
charList.RemoveAt ( length - 1 );
for ( var i = 0; i < 26; i++ )
if ( Input.GetKeyDown ( KeyCode.A + i ) ) charList.Add ( ( char ) ( 'a' + i ) );
if ( length != charList.Count ) keyboardInput.text = string.Concat ( charList );
}
我在这里所做的是首先检查 Space 键,然后是 Backspace 键。之后,我遍历字母表字符,将 i
值添加到 KeyCode.A
。请记住,默认情况下枚举只是 int
。如果匹配,我们将相应的 i
值添加到 'a' 字符并将其添加到 List<char>
列表,同时记住将结果值转换回 char
首先.
最后,如果您的字符数组的长度发生变化,那么,并且只有在那时,我们才会更新您的 keyboardInput.text
。这是为了帮助节省每一帧产生的字符串垃圾。我们可以 Concat
一个 char
IEnumerable 到一个 string
.
使用此方法,您可以删除以 private KeyCode[] MyKeys
开头的整行。您不需要将所有 KeyCode
值存储在数组中以进行检查。