Как я могу изменить переменную аниматора, используя c # скрипт в Unity? - PullRequest
0 голосов
/ 09 июля 2019

В процессе изучения Game Development я решил сделать собственную игру. Однако, когда я помещал свои анимации на модель через вкладку «Аниматор», я наткнулся на проблему. Я создал параметр типа «float» в аниматоре, где, если скорость больше или меньше значения x, он воспроизводит определенную анимацию. Однако, чтобы определить скорость ходьбы / бега, я использую поле, которое находится на вкладке «Инспектор». Проблема в том, что, поскольку инициализированная скорость всегда отличается от 0, аниматор использует это вставленное значение и воспроизводит анимацию ходьбы, несмотря на то, что ни одна клавиша не нажата!

Я уже пробовал различные вещи, которые я нашел в Интернете, например, с помощью флажка «Параметр» на анимации или с использованием различных строк кода, таких как «animator.SetFloat (« Скорость », (скорость));» по моему сценарию, но ничего из этого не сработало.

// Update is called once per frame
void Update()
{
    //animator.SetFloat("Speed", Mathf.Abs(speed));
    animator.SetFloat("Speed", (speed));

    float horizontal = Input.GetAxis("Horizontal");
    float vertical = Input.GetAxis("Vertical");

    Vector3 moveDirection = new Vector3(horizontal, 0f, vertical) * speed * Time.deltaTime;
    transform.Translate(moveDirection);

Я ожидаю, что результат будет следующим: когда ни одна клавиша не нажата, анимация простаивает для воспроизведения. при нажатии клавиш WASD, анимация ходьбы, чтобы играть. при нажатии клавиш Shift + WASD запускается анимация для воспроизведения.

1 Ответ

0 голосов
/ 09 июля 2019

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

public class ExampleEditor : MonoBehaviour
{
    private Animator animator;

    private void Update()
    {
        if (Input.GetKey(KeyCode.LeftShift) || Input.GetKey(KeyCode.RightShift))
        {
            animator.Play("Running");
            return;
        }

        if (Input.GetKey(KeyCode.W) || Input.GetKey(KeyCode.A) || Input.GetKey(KeyCode.S) || Input.GetKey(KeyCode.D))
        {
            animator.Play("Walking");
            return;
        }

        animator.Play("Idle");
    }
}

или, если вы предпочитаете использовать параметры, вы можете вместо этого использовать bools вроде

public class ExampleEditor : MonoBehaviour
{
    private Animator animator;

    private void Update()
    {
        if (Input.GetKey(KeyCode.LeftShift) || Input.GetKey(KeyCode.RightShift))
        {
            animator.SetBool("Running", true);
            return;
        }

        animator.SetBool("Running", false);

        if (Input.GetKey(KeyCode.W) || Input.GetKey(KeyCode.A) || Input.GetKey(KeyCode.S) || Input.GetKey(KeyCode.D))
        {
            animator.SetBool("Walking", true);
            return;
        }

        animator.SetBool("Walking", false);
    }
}

и имеют переходные условия, такие как

IDLE -> Running if Running=true
IDLE -> Walking if Running=false && Walking=true

Running -> Walking if Walking=true && Running=false
Running -> IDLE if Walking=false && Running=false

Walking -> Running if Running=true
Walking -> IDLE if Walking=false
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...