Поддержка контроллера платформера Unity 2d

В настоящее время я пытаюсь создать 2D-платформер в Unity, все работает нормально, кроме одного. Когда я нажимаю «Влево» или «Вправо», анимация моего спрайта отражается в правильном направлении. В настоящее время я пытаюсь добавить вход контроллера, но я не могу настроить аналоговый сигнал влево или вправо. Он должен отражаться при нажатии на стик вправо и наоборот.

Надеюсь, кто-нибудь может мне помочь :)

#pragma strict

var X : float;

function Start () {
//Gathering normal object scale
X = transform.localScale.x;
}

function Update () {
    if(Input.GetKey("a")) {
    // Gamer pushes left arrow key
    // Set texture to normal position
    transform.localScale.x = -X;
}
else if (Input.GetKey("d")) {
    // Gamer pushes right arrow key
    // Flip texture
    transform.localScale.x = X;
}
if(Input.GetKey("left")) {
    // Gamer pushes left arrow key
    // Set texture to normal position
    transform.localScale.x = -X;
}
else if (Input.GetKey("right")) {
    // Gamer pushes right arrow key
    // Flip texture
    transform.localScale.x = X;
}
if(Input.GetAxis("Horizontal")) {
    // Gamer pushes left arrow key
    // Set texture to normal position
    transform.localScale.x = -X;
}
else if (Input.GetAxis("Horizontal")) {
    // Gamer pushes right arrow key
    // Flip texture
    transform.localScale.x = X;
    }
}

person Quincy Norbert    schedule 18.02.2014    source источник


Ответы (2)


У вас есть это:

if(Input.GetAxis("Horizontal")) {
// Gamer pushes left arrow key
// Set texture to normal position
transform.localScale.x = -X;
}
else if (Input.GetAxis("Horizontal")) {
// Gamer pushes right arrow key
// Flip texture
transform.localScale.x = X;
}

Второй else if всегда будет вызываться, потому что вы проверяете точно такой же метод Input.GetAxis().

попробуйте что-то вроде этого:

if (Input.GetAxis("Horizontal") < 0)
{
    transform.localScale.x = -X;
}
else if (Input.GetAxis("Horizontal") > 0)
{
    transform.localScale.x = X;
}

Input.GetAxis ("Horizontal") проверяет все левые и правые клавиши, которые могут быть нажаты, и выдает число в зависимости от левой или правой клавиши...

Пример Если бы я нажал клавишу "Стрелка влево", я бы вернул число от 0 до -1. Если бы я нажал клавишу «Стрелка вправо», она вернула бы число от 0 до 1.

Имеет ли это смысл?

person Savlon    schedule 20.02.2014
comment
Привет, да, это имеет смысл, я сейчас на уроке, поэтому у меня нет возможности протестировать скрипт с моим контроллером. Итак, этот скрипт означает, что если по горизонтали ‹ 0, двигайтесь влево, а если по горизонтали ‹ 0, двигайтесь вправо? Unity автоматически понимает, что мой левый аналог является входом? Кроме того, я также добавил D-pad моего проводного контроллера в раздел ввода единства. И это работает, но мне пришлось добавить 2 горизонтальные оси, одну для левой стрелки крестовины и одну для правой. - person Quincy Norbert; 20.02.2014
comment
@QuincyNorbert Да, я не совсем уверен, как вы настроили ввод, но прочитайте ссылку ниже, чтобы узнать, поможет ли это ... docs.unity3d.com/Documentation/ScriptReference/ Итак, вы создали свою собственную крестовину? - person Savlon; 20.02.2014
comment
Я попробовал ваш метод, и теперь он работает, большое спасибо! Я пробовал это однажды, но забыл добавить › 0 в оператор else if: s - person Quincy Norbert; 20.02.2014

Я бы полностью отказался от стандартного ввода Unity, который просто ужасен, и переключился бы на InControl.

Их API позволяет определить, какое устройство используется, и обеспечивает очень простую и эффективную многопользовательскую поддержку.

Сопоставление для разных геймпадов и платформ позволит вам разработать стандартный макет, и вы потратите гораздо меньше времени, пытаясь заставить элементы управления более или менее работать на разных платформах.

person Coyote    schedule 24.07.2014