Как использовать контроллер Arduino и клавиатуру одновременно? - PullRequest
0 голосов
/ 31 января 2020

Как использовать контроллер и клавиатуру одновременно?

Поэтому я использую Arduino в качестве контроллера, используя ReadByte() в качестве ввода. Вот мой сценарий для моего проигрывателя

void Start() 
{      
    controller = GetComponent<Controller2D>();  // Je krijgt toegang tot de script Controller2D
    sp.DtrEnable = true;
    sp.ReadTimeout = 100;       

    sp.Open();  // Uw serialpoort openen      
}

void Update() 
{
    if (sp.IsOpen)    // Als uw serialpoort open is
    {
        try
        {
            print(sp.ReadByte());   // Ga je de inkomende waarde lezen
        }
        catch (System.Exception) { }
    }      

    if (controller.collisions.above || controller.collisions.below)    // Als je een botsing hebt van boven of beneden dan ga je stoppen met springen
    {
        moveDistance.y = 0;
    }

    if (Input.GetKeyDown(KeyCode.Space) || sp.ReadByte() == 1 && controller.collisions.below)   // Als je op spatie drukt en als je op een platform staat dan ga je boven springen
    {
        moveDistance.y = jumpDistance;  // Je gaat springen langs de y-as
        //moveDistance.x = 0;     // Als je alleen springt dan ga je loodrecht boven en niet schuin
    }

    Vector2 input = new Vector2(Input.GetAxisRaw("Horizontal"), Input.GetAxisRaw("Vertical"));  // Je neemt de Horizontal en vertical inputs van de unity zelf

    if (sp.ReadByte() == 2)       // Als je de 2de drukknop indrukt
    {
        moveDistance.x = -moveSpeed ;   // Ga je links bewegen
    }
    if (sp.ReadByte() == 3)        // Als je de 3de druknop indrukt
    {
        moveDistance.x = moveSpeed;     // Ga je rechts bewegen
    }

    moveDistance.x = input.x * moveSpeed;   // Door input kan je nu links of rechts bewegen met de pijlen
    moveDistance.y += gravity * Time.deltaTime;     // Je valt met een zwaartekracht dus je gaat sneller en sneller vallen.       
    controller.Move(moveDistance * Time.deltaTime);     // Leest de input 
}

Обычно я хотел бы иметь и контроллер, и клавиатуру в качестве входных данных, но после запуска этой игры я сразу получаю

TimeoutException: время операции истекло

ошибка, но я могу использовать Arduino в качестве входных данных, но по какой-то причине отключается только клавиатура

Ответы [ 2 ]

3 голосов
/ 27 марта 2020

В моем проекте контроллера у меня были столбцы в качестве входных данных и строки в качестве выходных. На Arduino столбцы были заданы как выходные, а строки - как входные. Я установил один столбец высоким, а остальные - низким, затем прочитал все строки и сохранил значение. Затем я изменяю первый столбец обратно на низкий, и устанавливаю второй столбец высоким и повторяю. Немного грязно, но это позволяет мне читать все.

1 голос
/ 31 января 2020

Может быть причиной ошибки не уверен, но в общем случае я бы не использовал sp.ReadByte() повторно, а только один раз , сохранил значение и сравнил бы это:

void Update() 
{
    byte arduinoInput = 0;
    if (sp.IsOpen)    // Als uw serialpoort open is
    {
        try
        {
            arduinoInput  = sp.ReadByte();
            print(arduinoInput);   // Ga je de inkomende waarde lezen
        }
        catch (System.Exception) { }
    }      

    if (controller.collisions.above || controller.collisions.below)    // Als je een botsing hebt van boven of beneden dan ga je stoppen met springen
    {
        moveDistance.y = 0;
    }

    if (Input.GetKeyDown(KeyCode.Space) || arduinoInput == 1 && controller.collisions.below)   // Als je op spatie drukt en als je op een platform staat dan ga je boven springen
    {
        moveDistance.y = jumpDistance;  // Je gaat springen langs de y-as
        //moveDistance.x = 0;     // Als je alleen springt dan ga je loodrecht boven en niet schuin
    }

    Vector2 input = new Vector2(Input.GetAxisRaw("Horizontal"), Input.GetAxisRaw("Vertical"));  // Je neemt de Horizontal en vertical inputs van de unity zelf

    if (arduinoInput == 2)       // Als je de 2de drukknop indrukt
    {
        moveDistance.x = -moveSpeed ;   // Ga je links bewegen
    }
    if (arduinoInput == 3)        // Als je de 3de druknop indrukt
    {
        moveDistance.x = moveSpeed;     // Ga je rechts bewegen
    }

    moveDistance.x = input.x * moveSpeed;   // Door input kan je nu links of rechts bewegen met de pijlen
    moveDistance.y += gravity * Time.deltaTime;     // Je valt met een zwaartekracht dus je gaat sneller en sneller vallen.       
    controller.Move(moveDistance * Time.deltaTime);     // Leest de input 
}

ошибки, вероятно, генерируются для фреймов, когда порт еще не открыт, но вы уже пытались прочитать или просто вызваны множественным доступом.

...