递减数组中的最后一个字符串元素而不在 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();
            }

See video for clarification

我的意思是 不起作用 是我无法从我的数组中删除最后一个字母,因此在我的虚拟设置中的句子中使用退格键的效果。这是整个脚本。

这不是您问题的答案,要获得正确的答案,您需要 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 值存储在数组中以进行检查。