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

时间:2014-12-15 16:10:54

标签: c# caching input unity3d xna

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

2 个答案:

答案 0 :(得分:1)

您想要将输入存储或缓存15帧吗?我可以告诉你如何收集输入,你可以通过将其存储在全局Keycode[]数组中来从中缓存它。

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

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

答案 1 :(得分:0)

您可以迭代所有可能的密钥代码并存储其值以供将来使用:

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);
        }
    }

}