Воспроизведение случайной анимации каждый раз, когда объект прошел - PullRequest
0 голосов
/ 05 марта 2019

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

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

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

public class mirrorActivate : MonoBehaviour
{
    private GameObject FSSecurity;
    public GameObject mirrorblank;
    public List<AnimationClip> anim = new List<AnimationClip>();
    // Start is called before the first frame update
    private void Awake()
    {

    }
    void Start()
    {
        FSSecurity = GameObject.Find("Female Security");
    }

    // Update is called once per frame
    void Update()
    {
        if (FSSecurity.transform.position.x == 10)
        {
            StartAnimation();
        }
    }
    public void StartAnimation()
    {
        int random = Random.Range(0, anim.Count);
        mirrorblank.GetComponent<Animator>().Play(anim[random].name);
    }
}

Что работает: похоже, проигрывается случайная анимация каждый раз, когда игрок идет в это место.

Что не работает?: 1. При входе в сцену бездействующая анимация немедленно запускает одну из трех анимаций без активации оператора if.((Он должен быть в режиме ожидания и переключаться на один из трех случайным образом, если if () истинно)) 2. Из-за точности с плавающей запятой использование == нецелесообразно, это теоретически может быть решено, если я использую диапазон с <= и> = а не ==.Но если есть лучшее решение для активации игрока, передающего объект, я открыт для предложений.3. Анимации при случайном воспроизведении не полностью воспроизводятся в течение всего времени, которое анимация должна длиться.4. Последняя проблема после активации: они не возвращаются в состояние ожидания до следующей активации.

Что я ищу: случайная анимация, воспроизводимая каждый раз, когда пользователь проходит мимо объекта, и когда он заканчивает работу, возвращается в режим ожидания.И как примечание стороны, есть более эффективный способ узнать, когда игрок передает объект (я использую 2D)

(по какой-то причине не позволяю мне ставить тэг unity2d на пост)

enter image description here

Простые переходы между, триггеры не установлены или что-то еще

enter image description here

1 Ответ

0 голосов
/ 05 марта 2019

Наконец-то!После нескольких длинных и крутых поворотов я наконец нашел разумное решение, которое, я думаю, работает хорошо.

Решение проблемы 1:
Чтобы предотвратить запуск анимации до срабатывания оператора if (), удалите переход из состояния ожидания в случайное состояние.

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

Решение проблемы 3:
Из-за постоянного запуска анимации не полностью работали в течение желаемого времени анимации.Если игрок> = 10 был единственным параметром, заставляющим его активироваться, чтобы решить, используйте простое решение логического типа.Если player.transform>> 10 и логическое значение истинно, запустите анимацию.Если игрок находится за пределами диапазона, логическое значение равно false.В StartAnimation () установите логическое значение true.

Решение проблемы 4:
Теперь с удаленными переходами из режима ожидания в случайные анимации вместо этого создайте переход из случайных состояний для выхода.Не требуется переходов, взаимодействующих между холостыми и случайными анимациями.

Полный код для уточнения деталей:

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

public class mirrorActivate : MonoBehaviour
{
    private GameObject FSSecurity;
    public GameObject mirrorblank;
    public List<AnimationClip> anim = new List<AnimationClip>();
    bool isPlayingAlready = false;
    // Start is called before the first frame update
    private void Awake()
    {

    }
    void Start()
    {
        FSSecurity = GameObject.Find("Female Security");
    }

    // Update is called once per frame
    void Update()
    {
        if (FSSecurity.transform.position.x >= 10 && isPlayingAlready == false)
        {
            StartAnimation();
        }
        if (FSSecurity.transform.position.x <= 10 && isPlayingAlready == true)
        {
            isPlayingAlready = false;
        }
    }
    public void StartAnimation()
    {
        int random = Random.Range(0, anim.Count);
        mirrorblank.GetComponent<Animator>().Play(anim[random].name);
        isPlayingAlready = true;
    }
}

Просмотр контроллера анимации:

enter image description here

Просмотр перехода анимации (Это может измениться в зависимости от ваших потребностей, но для этой цели ..):

enter image description here

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...