Unity C#:缓存键盘/控制器状态

本文关键字:控制器 状态 键盘 缓存 Unity | 更新日期: 2023-09-27 18:34:13

我刚刚开始统一,所以请原谅缺乏知识。我开始使用微软的xna环境进行编程。我现在已经转向团结,但我遇到了麻烦。Xna有一个"键盘状态"功能,可以检查正在按下的按钮/键。我听说 Unity 没有相同的功能,所以我想知道如何存储/缓存过去 15 帧的输入。我听说Event.KeyboardEvent和KeyCode可能会有所帮助,但我迷路了。任何人都可以帮忙吗???

Unity C#:缓存键盘/控制器状态

您想存储或缓存 15 帧的输入吗?我可以告诉你如何收集输入,如果你愿意,你可以从那里缓存它,把它存储在一个全局Keycode[]数组中。

此代码会将按下的键打印到您的控制台。

void OnGUI() {
    Event e = Event.current;
    if (e.isKey){
        string key = e.keyCode.ToString();
        Debug.Log(key);
    }
}

您可以遍历所有可能的键码,并存储其值以备将来使用:

using UnityEngine;
using System.Collections.Generic;
public class KeyboardState : MonoBehaviour {
    /// <summary>
    /// Keyboard input history, lower indexes are newer
    /// </summary>
    public List<HashSet<KeyCode>> history=new List<HashSet<KeyCode>>();

    /// <summary>
    /// How much history to keep?
    /// history.Count will be max. this value
    /// </summary>
    [Range(1,1000)]
    public int historyLengthInFrames=10;

    void Update() {
        var keysThisFrame=new HashSet<KeyCode>();
        if(Input.anyKeyDown)
            foreach(KeyCode kc in System.Enum.GetValues(typeof(KeyCode)))
                if(Input.GetKey(kc))
                    keysThisFrame.Add(kc);
        history.Insert(0, keysThisFrame);
        int count=history.Count-historyLengthInFrames;
        if(count > 0)
            history.RemoveRange(historyLengthInFrames, count);
    }

    /// <summary>
    /// For debug Purposes
    /// </summary>
    void OnGUI() {
        for(int ago=history.Count-1; ago >= 0; ago--) {
            var s=string.Format("{0:0000}:", ago);
            foreach(var k in history[ago])
                s+="'t"+k;
            GUILayout.Label(s);
        }
    }
}