Unity - керівництво скриптинг анімації (legacy)
Система анімації в Unity дозволяє створювати чудово анімованих персонажів. Вона підтримує Блендінг, мікшування, додавання анімацій, синхронізацію циклу ходьби, анімаційні шари, контроль всіх аспектів програвання (час, швидкість, ваги блендінга), скіннінг мешів з 1, 2 або 4 кістками на вершину, а також засновані на фізиці rag-dolls ( ганчіркові ляльки) і процедурну анімацію. Для отримання кращих результатів, рекомендується почитати про практичні підходи і принципи створення персонажів з оптимальною продуктивністю в Unity на сторінці Моделювання оптимізованих персонажів.
Ви можете спробувати приклади показують готову анімацію персонажів. Трохи пізніше, коли ви освоїте базові речі, можете поглянути на опис класу Animation.
змішування анімації
У сучасних іграх, змішування анімації є необхідною функцією для забезпечення персонажа плавними анімаціями. Аніматори створюють окремі анімації, наприклад, цикл ходьби, цикл бігу, анімація в стані спокою або стрільби. У будь-який момент під час гри, повинна бути можливість переходу з анімації спокою в цикл ходьби і назад. Природно, ви хочете щоб цей перехід був плавним і без раптових ривків в русі.
В цьому випадку змішування анімації стає корисним. У Unity можна мати будь-яку кількість анімацій, які програються на одному і тому ж персонажа. Всі анімації змішуються або складаються разом для створення остаточної анімації.
Спочатку зробимо плавний перехід між анімаціями спокою і ходьби. Щоб полегшити роботу написання скрипта, спершу потрібно змінити Wrap Mode анімації на Loop. Потім потрібно відключити Play Automatically для впевненості, що ніхто, крім нашого скрипта, не програє анімацію.
Наш перший скрипт для анімації персонажа досить простий; нам потрібен спосіб для визначення швидкості руху персонажа, а після цього робити перехід між анімаціями ходьби і спокою. Для цього простого тесту ми будемо використовувати стандартні осі введення: -
Щоб використовувати цей скрипт у вашому проекті: -
Після натискання на кнопку Play, персонаж почне крокувати на місці, поки ви будете утримувати кнопку зі стрілкою вгору, і повернеться в позу очікування, якщо ви відпустіть її.
шари анімації
Шари це неймовірно корисна концепція, що дозволяє класифікувати анімацію і пріоритезувати ваги.
Система анімації Unity може змішувати кілька анімацій, в відповідність до ваших побажань. Ви можете призначити ваги вручну, або просто використовувати animation.CrossFade (). який буде анімувати вага автоматично.
Ваги змішування завжди нормалізуються перед застосуванням
Припустимо, що у вас є цикл ходьби і цикл бігу, мають ваги, рівні 1 (100%). Коли Unity генерує остаточну анімацію, ваги нормалізуються, тобто внесок циклу ходьби складе 50% анімації, і внесок циклу бігу також складе 50%.
Характерно, вам захочеться вказати, яка анімація отримує більшу вагу, коли програється дві анімації. Звичайно, можна вручну переконатися, що ваги підсумовуються в 100%, але легше просто використовувати для цього шари.
Приклад використання шарів
Як приклад, ви можете використовувати анімації стрілянини, очікування і циклової ходьби. Анімації ходьби і очікування будуть змішані в залежності від швидкості гравця, але, коли гравець повинен стріляти, ви хотіли б відтворювати тільки анімацію стрілянини. Тому, фактично, анімація стрілянини має більш високий пріоритет.
Найпростіший спосіб домогтися цього, це просто продовжувати програвання анімацій ходьби і спокій під час стрілянини. Щоб це зробити, нам треба впевнитися, що анімація стрілянини знаходиться в верхньому шарі над анімаціями спокою і ходьби, що означає, що анімація стрілянини буде отримувати ваги змішування в першу чергу. Анімації ходьби і спокій будуть отримувати ваги тільки якщо анімація стрілянини не використовує всі 100% ваги. Так, коли починається перехід в анімацію стрілянини, вага почнеться з нуля, і за короткий час стане 100%. Спочатку, шар ходьби і спокою все ще буде отримувати ваги, але коли повністю закінчиться перехід в анімацію стрілянини - вони не отримають ваги взагалі. І це в точності те, що нам потрібно!
За замовчуванням, animation.Play () і animation.CrossFade () зупинять або плавно приберуть анімації знаходяться в одному тому ж шарі. Це те що потрібно в більшості випадків. У нашому прикладі стрільби, спокою і бігу, програвання спокою і бігу не впливатиме на анімацію стрілянини, і навпаки (якщо потрібно, то це поведінка можна змінити опціональним параметром функції animation.CrossFade).
змішування анімацій
Змішування анімацій дозволяє урізати кількість анімацій, який потрібно створити для вашої гри. Це досягається тим, що деякі анімації впливають тільки на частину тіла. Це означає, що такі анімації можуть бути використані спільно з іншими анімаціями в різноманітних комбінаціях.
Додавання трансформації змішування анімацій проводиться викликом методу AddMixingTransform () наявного AnimationState.
приклад змішування
Як приклад змішування можна привести щось на зразок анімації махання рукою. Ви можете захотіти зробити махання рукою або коли персонаж знаходиться в спокої, або коли він йде. Без змішування анімацій, вам би довелося зробити окремі анімації махання рукою для стану спокою і ходьби. Але якщо ви додасте трансформацію плечей як трансформацію змішування в анімацію махання рукою, то вона буде мати повний контроль тільки від плечового суглоба до руки. Так як решта тіло не буде схильний до впливу анімації махання рукою, воно продовжить грати анімацію спокою або ходьби. Як наслідок, знадобиться тільки одна анімація, щоб зробити махання рукою, тоді як решта тіла буде використовувати анімацію спокою або ходьби.
Інший приклад з використанням шляхів.
Адитивні (additive) анімації
Адитивні анімації і технологія змішування анімацій дозволяють зменшити загальну кількість анімацій, які вам треба створити для вашої гри, і ці техніки також важливі для створення лицьової анімації.
Припустимо, вам захотілося створити персонажа, який нахиляється в сторони під час поворотів, коли він ходить або бігає. Це призводить до 4 комбінаціям (йти-нахилятися-вліво, йти-нахилятися-вправо, бігти-нахилятися-вліво, бігти-нахилятися-вправо), для кожної з яких потрібна анімація. Створення окремої анімації на кожну комбінацію, очевидно, веде до безлічі додаткової роботи, навіть в такому простому випадку. Але кількість комбінацій збільшується з кожним додаються дією. На щастя, адитивні анімації і змішування дозволяє уникнути необхідності створення окремих анімацій для комбінацій простих рухів.
Приклад адитивної анімації
Адитивні анімації дозволяють накладати ефекти однієї анімації поверх будь-яких інших запущених анімацій. Коли генеруються адитивні анімації, Unity вирахує різницю між першим і поточним кадрами анімаційного кліпу. Потім різниця застосується поверх всіх інших програються анімацій.
Посилаючись на попередній приклад, ви могли б створити анімації для нахилів вправо і вліво, і Unity зміг би накласти їх на цикл ходьби, спокою або бігу. Це може бути досягнуто за допомогою коду наступним чином: -
Порада: При використанні адитивних анімацій, дуже важливо також програвати якісь інші не-адитивні анімації на кожній трансформації, яка також використовується в адитивної анімації. В іншому випадку, анімації будуть додаватися поверх результату останнього кадру. Це точно не те, що вам потрібно.
Процедурна анімація персонажів
Іноді вам знадобиться анімувати кістки вашого персонажа процедурно. Наприклад, ви хочете щоб голова вашого персонажа дивилася в певну точку в 3D просторі. Ця дія найкраще реалізувати за допомогою скрипта, який відстежує цільову точку. На щастя, Unity робить це дуже простим завданням, тому що кістки всього лише є трансформаціями, які керують шкірою (skinned mesh). Ви можете управляти кістками персонажа з скрипта так само, як трансформаціями GameObject.
Одна з важливих речей, яку необхідно знати, це те, що анімаційна система оновлює трансформації після функції Update (). і до функції LateUpdate (). Тому, якщо вам потрібно викликати функцію LookAt (). слід робити це в LateUpdate (). щоб упевнитися, що ви насправді переобумовленої анімацію.
Ганчіркові ляльки (Ragdolls) створюються таким же способом. Вам просто потрібно додати компоненти Rigidbody, Character Joint і Capsule Collider до різних кісток. Це дозволить вам створити анімацію вашого персонажа засновану на фізиці.
Відтворення і cемплірованіе анімації
Цей розділ розповідає про те як в Unity відбувається семплірування анімації під час її відтворення движком.
Ігри зазвичай працюють зі змінною частотою кадрів. Частота кадрів на вашому комп'ютері може бути вище, ніж на інших, і також може змінюватися через складність відтворення об'єктів в полі зору камери. В основному, це означає, що ми не можемо зробити ніяких припущень, з якою частотою кадрів буде працювати гра. Це означає, що навіть якщо анімація створювалася для 60 кадрів в секунду, вона може бути відтворена на іншій частоті кадрів - наприклад, 56.72, або 83.14 кадрів в секунду, або будь-який інший.
В результаті, Unity повинен семпліровалісь анімацію з різною частотою кадрів, і не може гарантувати частоту кадрів, для якої анімація створювалася. На щастя, анімації для 3D графіки складаються не з дискретних кадрів, а з безперервних кривих. Так що, якщо гра видає велику частоту кадрів, ніж частота кадрів анімації, анімація буде виглядати плавніше в грі, ніж вона виглядала в анімаційному ПО.
Для більшості практичних застосувань, можна ігнорувати той факт, що Unity семплірует анімацію на плаваючою частоті кадрів. Однак якщо присутній ігрова логіка, яка спирається на анімації, які анімуйте трансформації і властивості в дуже конкретні конфігурації - то вам потрібно знати, що за лаштунками застосовується ресемплінга. Наприклад, якщо у вас є анімація, яка повертає об'єкт від 0 до 180 градусів за 30 кадрів, і ви хочете знати з коду, коли була пройдена половина шляху, вам не слід робити це за допомогою умовного вираження в коді, яке перевіряє, що поточне обертання одно 90 градусам. Так як Unity семплірует анімацію на плаваючою частоті кадрів гри, семпл може бути взятий коли обертання трохи менше 90 градусів, а наступний семпл - коли обертання трохи більше 90 градусів. Якщо ви хочете отримати нотифікацію, коли була досягнута конкретна точка в анімації, слід використовувати AnimationEvent (Анімаційне подія).
Також зверніть увагу, що як наслідок плаваючою частоти кадрів, анімація, яка програється з використанням WrapMode.Once. не може бути Семплірування в точний час останнього кадру. В одному кадрі гри, анімація може бути Семплірування тільки перед кінцем анімації, і на наступному кадрі, час могло вже перейти довжину анімації, після чого анімація відключається, і не більше не семпліруется. Якщо для вас дуже важливо, щоб останній кадр анімації семпліровалісь точно, слід використовувати режим WrapMode.ClampForever. який продовжить семпліровалісь останній кадр нескінченно, поки ви не зупините анімацію.
Успадкована анімаційна система