@vitek22

Хочу сделать типо босс файта, чтобы анимации которые я добавлю в список были рандомными, но у меня куча ошибок, что делать?

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

public class threelvl : MonoBehaviour
{
[SerializeField] bool down = false;
[SerializeField]bool leftwall = false;
[SerializeField] bool up = false;
[SerializeField] bool rightwall = false;
[SerializeField] List<Text> animText = new List<Text>();
void Update() {
    if (animText[1] == 1){
        down.SetBool("down");
    }
    else if (animText[2] == 2){
        up.SetBool("up");
    }
    else if (animText[3] == 3){
        leftwall.SetBool("leftwall");
    }
    else if (animText[4] == 4){
        rightwall.SetBool("rightwall");
    }
}
IEnumerator animation()
    {
        while(true)
        {
            animText = Random.Range (1f,4f);
        }
    }
}

643289363d500519508512.png64328940243d9871842122.png
  • Вопрос задан
  • 73 просмотра
Пригласить эксперта
Ответы на вопрос 2
@Ezekiel4
Охотник на пиратов и сборщик монолитов
1) Основа вашей идеи - это компонент Animator, на который у вас нет ссылки.
2) Метод SetBool() имеет два аргумента: ключ и значение вида true или false.
3) В блоках вида
if (animText[1] == 1)
Вы сравниваете элемент списка под номером 1, то есть строку, с числом. Строка это текст, не число.
4) Ниже вы прописали корутину, которую никто не запускает
5) Корутина не имеет паузы
yield return new WaitForSeconds(нужное_время);
6) В строке
animText = Random.Range (1f,4f);
Вы пробуете вставить в ссылку типа списка строк нецелое число.
7) Допустим, у вас всё бы работало, но SetBool это такой переключатель, который обратно сам не возвращается, он остаётся в состоянии, в которое вы его поставили.

Критикуя-предлагай, поэтому вот что я скажу.

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

Как это будет выглядеть:
using UnityEngine;

public class BossAnimator : MonoBehaviour {

	// Ссылка на аниматор босса
	[SerializeField] Animator anim;

	// перечень триггеров анимации
	// убедитесь, что там нет null элементов
	[SerializeField] string[] triggers;

	// Метод, который начнёт весь движ
	// Как и где его вызывать - решайте сами по ситуации
	public void StartFight() {
		OnAnimationEnded();
	}

	// Данный метод нужно привязать как событие
	// к концу каждой анимации
	public void OnAnimationEnded() {
		// Выбираем случайный номер из списка - наш следующий триггер
		int nextTriggerIndex = Random.Range(0, triggers.Length);
		// Применяем
		anim.SetTrigger(triggers[nextTriggerIndex]);
	}
}

Разумеется, скрипт сырой и можно его доработать соответсвенно специфик игры, о которых я не знаю, но в целом он универсален, так как вы в инспекторе босса сами можете назначить перечень любых триггеров анимации в любом количестве.
Ответ написан
vabka
@vabka
Токсичный шарпист
У тебя ошибки тупо в коде. Смотри описание ошибок и на строки.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы