Unity - 从脚本调用键盘输入?

时间:2018-03-04 21:18:59

标签: c# if-statement unity3d

我会尽力解释这个问题。假设我有两个if语句都将Debug.Log消息发送到控制台,如下所示:

if(Input.GetKeyDown("c")){
    Debug.Log("C was pressed!");
}

if(Input.GetKeyDown("b")){
    Debug.Log("b was pressed!");
}

我们当然知道,当我们按下相应的键时,我们会收到这些消息。但是,如果我想让另一个脚本触发这些if语句而不是键盘来做呢?

如果我有一个if语句的列表,这些语句在这些键盘输入中输入,有没有办法触发这些if语句通过代码,还是我必须改变条件?< / p>

2 个答案:

答案 0 :(得分:2)

从你的问题来看,我不认为模拟键盘输入是这里的方法。我认为更好的是将语句放在新方法中,可以从其他脚本中调用。

public void HandleInputC ()
{
    Debug.Log("C was pressed (or simulated).");
}
public void HandleInputD ()
{
    Debug.Log("D was pressed (or simulated).");
}

private void Update ()
{
    if (Input.GetKeyDown("c"))
        HandleInputC();
    if (Input.GetKeyDown("d"))
        HandleInputD();
}

这也使得对各个方法进行扩展变得更容易,更易读,同时对其目的进行了概述。

答案 1 :(得分:1)

我希望我能正确理解你的问题。是的,它绝对可能。假设你想制作一个你稍后会重播的玩家鬼魂。因此,保存播放器在列表中进行的所有击键,然后返回此列表中的击键。我们的想法是创建一个自定义 KeyStrokeRecorder 类,其中包含一个名为 GetKey 的方法。然后,而不是调用 Input.GetKeyDown 调用 KeyStrokeRecorder.instance.GetKey 。请参阅下面的代码。

using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class KeyStrokeRecorder : MonoBehaviour {

    public class KeyStroke {
        public enum KeyState {
            Idle,
            Pressed,
            Released,
        }
        public KeyCode keycode; 
        public string time;
        public KeyState state;          
    }       

    public List<KeyStroke> mKeyStrokes;
    public RecorderState recorderState = RecorderState.Idle;
    public static KeyStrokeRecorder instance;

    void Awake(){
        instance = this;    
    }

    void Start () {

    }

    void Update () {
         if( isRecording || isPlayback)
             gameTime += Time.deltaTime;
    }

    float gameTime = 0;    
    bool isRecording = false;       
    bool isPlayback = false;
    public bool GetKey(KeyCode keycode)
    { 
        if( isPlayback )
        {
            for(int i=0; i<mKeyStrokes.Count; i++)
            {
                float tTime;
                float.TryParse(mKeyStrokes[i].time, out tTime);

                if( mKeyStrokes[i].keyname == keycode.ToString() )
                {
                    if( gameTime > tTime-0.5f && gameTime < tTime+0.5f )
                    {
                        if( mKeyStrokes[i].state == KeyStroke.State.Pressed)
                            return true;
                        else
                            return false;
                    } 
                } 
            }    
            return false;
        }
        else if( isRecording )
        {
            KeyStroke keystroke = new KeyStroke();
            keystroke.keyname = keycode.ToString();
            keystroke.time = gameTime.ToString();

            if( Input.GetKeyDown(keycode) )
            {                   
                keystroke.state = KeyStroke.State.Pressed;    
                mKeyStrokes.Add(keystroke);                 
            }
            else if( Input.GetKeyUp(keycode) )
            {                   
                keystroke.state = KeyStroke.State.Released;     
                mKeyStrokes.Add(keystroke);
            }
        }    
        return Input.GetKey(keycode);
    }
}

希望这会给你一些想法。