BadCats
@BadCats

Добавление анимации на префаб из другого скрипта?

всем привет, имеется такой скрипт:
public class Hero : MonoBehaviour
{
    public CharacterController hero;
    public float speed = 10;
    public float gravity = 5F;
    private Vector3 moveDirection;

 GameObject[] tree =  GameObject.FindGameObjectsWithTag("tree");
    private AnimationClip NewAnimationn;



    // Use this for initialization
    void Start()
    {
      
  
        hero = gameObject.GetComponent<CharacterController>();
         

        



    }

    // Update is called once per frame
    void Update()
    {
        Vector3 moveDirection = Vector3.zero;

        if (hero.isGrounded)
        {
            moveDirection = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));
            moveDirection = transform.TransformDirection(moveDirection);
            moveDirection *= speed;

            // раскоментировать для прыжка
            // if (Input.GetButton("Jump"))
            //     moveDirection.y = jumpSpeed;

        }
        moveDirection.y -= gravity * Time.deltaTime;
        hero.Move(moveDirection * Time.deltaTime);
       
        if (Input.GetKey(KeyCode.A))
            {
            for (int i=0;i<tree.Length;i++)
            {
               var p= tree[i].GetComponent<Animation>();
                p.AddClip( NewAnimationn,"TimeLapse");
                p.Play();
                
               
                    }
             }
    }

На сцене имеется префаб- дерево, и не одно, на все префабы я добавил тег "tree" - и на строке
GameObject[] tree =  GameObject.FindGameObjectsWithTag("tree");
- ищу объекты по тегу и запихиваю их в массив, затем при нажатии кнопки D(У меня и персонаж в сторону двигается) и я перебера этот массив - т.е обращаюсь к каждоиу объекту с таким тегом и его компоненте анимация и все это присваиваю в поле с именем p , что бы потом на нем вызвать метод AddClipp() - с помощью которого добовить к каждому префабу дерева нужную мне анимацию, которую я по идее должен передать в качестве аргумента AddClipp()
Как мне в поле NewAnimationn - передать ссылку на
724341399e914ba5bd033a18851f8192.JPG
Это вообще анимация? почему спрашиваю? Потому что не знаю! Ведь в проекте также создался файл
6edd5f5a91324a2a9803780b5f66fc05.JPG
И как я понимаю это сам файл анимации, а первый - это так называемый аниматор. Разъясните что к чему.
И последнее - Unity исключение
c34a1e88f9624224b0546af638ea4965.JPG - при нажатии на клавишу A . В студии же это строка for (int i=0;i<tree.Length;i++) - т.е начало цикла
  • Вопрос задан
  • 1068 просмотров
Решения вопроса 1
BasmanovDaniil
@BasmanovDaniil
Геймдизайнер-телепат
Зачем вы анимацию добавляете в рантайме? Префаб на то и префаб, что его можно настроить заранее в редакторе.
На первой картинке у вас обведён Animator Controller, он вставляется в компонент Animator. Компонент Animation, который вы ищете на деревьях, это старый способ анимирования объектов, он не совместим с аниматором.

Если вы внимательно посмотрите на документацию к GameObject.FindGameObjectsWithTag, то заметите, что этот метод в примере вызывается в старте. Более того, в консоли вам должны были написать:
"FindGameObjectsWithTag is not allowed to be called from a MonoBehaviour constructor (or instance field initializer), call it in Awake or Start instead."

Вы неправильного использовали FindGameObjectsWithTag, поэтому массив деревьев у вас оказался непроинициализирован, что и привело к исключению.

Полезные ссылки:
Официальные туториалы
What is a Null Reference Exception?
Разрешение вопросов, связанных с исключениями: Sys...
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
TheTalion
@TheTalion
Зачем добавлять анимацию дерева из героя? Создайте анимацию дерева на дереве.

А вообще анимацию нужно присваивать в самом скрипте. Объявите анимацию как public и перетяните анимацию из вашей папки на нужную строку в скрипте.

Зачем создавать массив GameObject, если можно использовать лист? Зачем перебирать массив с помощью for, а не foreach? Какой вы компонент выбираете на дереве? Он там вообще присвоен?

Очень много очевидных ошибок. Учите язык. Начните с этого: https://professorweb.ru/my/csharp/charp_theory/lev...
Ответ написан
Ваш ответ на вопрос

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

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