Как создавать сборные анимации в Unity?

#unity3d

#unity3d

Вопрос:

создал сборку для door и добавил сборные двери в сцену. У этой сборных дверей есть аниматор. Проблема в том, что когда я пытаюсь изменить положение аниматора x, y, z на второй двери в сцене, это меняет первую дверь.

Я попытался дублировать двери и изменить положение x y z, но это изменило аниматор для первой двери.

У меня просто есть скрипт, который воспроизводит аниматор.

Ожидаемым результатом должно быть то, что я могу перетаскивать двери по мере необходимости, не создавая отдельных аниматоров для каждой двери. Похоже, мне нужно создавать аниматоров для каждой двери, и это, вероятно, потребует от меня создания новых сценариев для каждой двери. Это кажется неудобным, поскольку я должен иметь возможность добавлять двери и просто изменять положение x y z в аниматоре.

Комментарии:

1. Все работают вместе? — так в чем проблема?

Ответ №1:

Проблема в том, что их Animator компонент использует тот же AnimatorController ресурс, который использует определенные AnimationClip ссылки на ресурсы для своих состояний.

Я не знаю, есть ли более простой способ для достижения, но я бы сделал следующее:

  • Для того, что вы хотите, вам нужно будет скопировать AnimatorController ресурс (CTRL D), а также AnimationClip ресурс, который вы хотите изменить.
  • Затем в клонированном AnimatorController щелкните соответствующее состояние, которое вы хотите изменить, и в инспекторе укажите соответствующее клонированное AnimationClip .
  • Теперь у вас есть копия с AnimatorController использованием другого AnimationClip , но с теми же состояниями, традициями и т. Д. таким образом, вы можете редактировать как анимации, так и контроллеры по отдельности.
  • наконец, в Animator компоненте ссылаются на соответствующие AnimatorController для каждого сборного.

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

Комментарии:

1. Я понимаю. Вау, я просто не могу поверить, что что-то настолько распространенное не так просто исправить. Я также подумал, что в моем сценарии имя аниматора должно совпадать с именем игрового объекта, а затем мне просто нужно создать аниматора для каждой двери, аниматор будет похож на doorOpendoor1 doorOpendoor2 и т. Д. Объединяя имена, у меня не будет проблем с конфликтующими аниматорами. Что вы думаете?

2. Извините, я не понял вопроса. Как уже было сказано, основными элементами являются не the Animator , а AnimatorController s и AnimationClip s. Да, я обычно вызываю их в соответствии с именем объектов I, чтобы не путать их и упаковывать все конкретные анимационные клипы в одну равную папку с именем 😉 однако вы знаете, что вам это нужно только в том случае, если вы хотите другого поведения для этих дверей. Если основная причина, по которой вы меняете их все, на самом деле — это просто другое положение и поворот в мире, скорее дайте им родительский объект и расположите / поверните его вместо этого 😉

Ответ №2:

Возможно, это не из-за аниматора, а из-за специфического поведения анимации в Unity. Анимация анимирует свойство преобразования в соответствии с родительским, насколько я понимаю. Итак, первый родительский элемент вашего сборного элемента захвачен, и его свойство transform используется для анимации. Но я не совсем уверен в этом объяснении — фактическое поведение описано в исходном коде Unity. Общее решение для этого, которое я нашел, — создать родительский элемент или контейнер внутри сборного объекта вашего объекта. Я не знаю, почему это работает, но это работает. Возможно, потому, что родительский элемент вашего анимированного объекта теперь всегда один и тот же.

Parent может быть просто пустым игровым объектом. Итак, вы создаете сборную дверь, помещаете в нее другой пустой игровой объект, делаете свою дверь дочерней по отношению к этому контейнеру, устанавливаете 0 для всех координат вашей двери в соответствии с контейнером и для самого контейнера. Теперь вы можете добавить компонент animator к своему объекту, который вы хотите анимировать (не контейнер), и анимировать его внутри сборных сцен. После этого вы можете разместить копии этого сборного (контейнер ваш анимированный объект внутри) в любом месте вашей игровой сцены — все анимации копий будут выполняться независимо.