как заменить "input.getaxis" на ручной код - PullRequest
0 голосов
/ 06 июня 2019

Мне нужно заменить "input.getaxis (" Horizontal ") в единстве кодом, который я пишу, чтобы получить ввод из файла Python.

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

private void FixedUpdate()
    var h = hh ;//h is the horizontal axis and hh is the previous value
    var v = vv ;//v is the horizontal axis and vv is the previous value
    if (inout == "W" || inout == "w")
    {
        if (v < 1)
        {
            v += 0.01f * wn; //wn is the multiplication for when the user 
                             //presses the key continously {momentum}
        }
        wn += 1;
        sn = 1;//number of presses
    }
    else if (inout == "S" || inout == "s")
    {
        if (v > (-1))
        {
            v -= 0.01f * sn;
        }
        wn = 1;
        sn += 1;
    }
    else if (inout == "A" || inout == "a")
    {
        if (h > (-1))
        {
            h -= 0.01f*an;
        }
        an += 1;
        dn = 1;
    }
    else if (inout == "D" || inout == "d")
    {
        if (h < 1)
        {
            h += 0.01f * dn;
        }
        an = 1;
        dn += 1;
    }
    //Decaying of the momentum
    if (inout != "W" && inout != "S"&& inout != "w" && inout != "s")
    {
        if (v > 0)
        {
            if (wn>1)
            {
                wn--;
            }
            v -= 0.01f * wn;
        }
        else if (v < 0)
        {
            if (sn>1)
            {
                sn--;
            }
            v += 0.01f * sn;
        }
    }
    else if (inout != "A" && inout != "D"&& inout != "a" && inout != "d")
    {
        if (h > 0)
        {
            if (dn>1)
            {
                dn--;
            }
            h -= 0.01f * dn;
        }
        else if (h < 0)
        {
            if (an>1)
            {
                an--;
            }
            h += 0.01f * an;
        }
    }
    hh = h;
    vv = v;

Короче говоря, все, что делает этот код, - это когда файл python отправляет ввод «W», например, он увеличивает значение вертикальной оси на (0,01), умноженное на количество нажатий на клавишу w, что дает нам шанс нарастить импульс каккогда пользователь нажимает его один раз, когда он медленно поднимается, тогда, когда он нажимается непрерывно, он начинает накапливаться и расти быстрее. Затухающая часть предназначена для того, чтобы, когда пользователь отпускает клавишу, мы хотим высвободить весь импульс, который мы создали, поэтому он отменяетвсе.

  • все, что я хочу, это кто-то, кто может описать, как работает getaxis
  • , чтобы знать, будет ли работать этот код и какo изменить его, чтобы сделать его лучше, или если есть лучший способ сделать это.

Ответы [ 2 ]

1 голос
/ 06 июня 2019

С клавиатурой Unity's GetAxisRaw("Horizontal") и GetAxisRaw("Vertical") возвращают -1, 0 или 1 для каждой оси.Значения GetAxis("Horizontal") и GetAxis("Vertical") сглаживаются алгоритмом с использованием этих необработанных входных данных.

Вот один из способов приблизить алгоритм сглаживания Unity таким образом, чтобы сгладить необработанные значения -1, 0 или 1, рассчитанные на основе ввода с клавиатуры вашего контроллера:

private float slidingH;
private float slidingV;

private void FixedUpdate()
{
    float h = 0f;
    float v = 0f;
    Vector2 smoothedInput;

    if (inout.ToLower() == "w") 
    {
        v = 1f;
    }
    else if (inout.ToLower() == "s")
    {
        v = -1f;
    }
    else if (inout.ToLower() == "a")
    {
        h = -1f;
    }
    else if (inout.ToLower() == "d")
    {
        h = 1f;
    }

    smoothedInput = SmoothInput(h,v);

    float smoothedH = smoothedInput.x;
    float smoothedV = smoothedInput.y;

}


private Vector2 SmoothInput(float targetH, float targetV)
{
    float sensitivity = 3f;
    float deadZone = 0.001f;

    slidingH = Mathf.MoveTowards(slidingH,
                  targetH, sensitivity * Time.deltaTime);

    slidingV = Mathf.MoveTowards(slidingV ,
                  targetV, sensitivity * Time.deltaTime);

    return new Vector2(
           (Mathf.Abs(slidingH) < deadZone) ? 0f : slidingH ,
           (Mathf.Abs(slidingV) < deadZone) ? 0f : slidingV );
}
.

Это модифицированныйверсия кода в этот ответ fafase на сайте Unity QA.

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

1 голос
/ 06 июня 2019

Разделите проблемы между принятием ввода и перемещением объекта.

Если вы разделите свои задачи, вы сможете заменить свой ввод любым механизмом, который вам нужен.Вы можете проверить с помощью Input.GetAxis и затем переключить вход на Python, если выходы одинаковы.

FixedUpdate используется Unity для физических расчетов.Вместо этого примите входные данные в методе Update, затем примените свои изменения к объектам с поддержкой физики в FixedUpdate.

Большая часть того, что вы делаете, достигается встроенной Физикой единства двигатель.Для этого используйте компонент Rigidbody вместо прямой установки Transform.Вы все еще можете ухудшиться, основываясь на отсутствии ввода внутри FixedUpdate, и применить все свои изменения сразу и позволить физическому движку выполнить реальные вычисления.

Примечания к вашим вопросам внизу вашего вопроса

  • Input.GetAxis возвращает float в диапазоне от -1 до 1
  • После того, как вы разделите две ваши задачи, ваш код должен работать лучше естественным образом
  • Так как Input.GetAxis выводит диапазон от -1 до 1 в зависимости от того, как далеко от центра находится стержень контроллера, 0,01 - это крошечное измерение.Вам нужно будет нажать клавишу 100 раз, чтобы получить тот же результат, что и нажатие на джойстик контроллера до одной стороны.Я бы использовал значения, близкие к -1 и 1, и умножил их на некоторое значение, установленное в Инспекторе, чтобы получить хорошее представление
  • У меня нет ответа на вопрос, как напрямую получить ввод из Python в Unity.Вероятно, это будет зависеть от того, является ли это сетевым решением или на том же компьютере.Выход из сетевого решения не будет иметь значения, каким бы он ни был, независимо от того,
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...