Sistem Animasi Unity memungkinkan Anda untuk membuat karakter kulit animasi yang indah. Sistem Animasi mendukung campuran animasi, pencampuran, animasi tambahan, sinkronisasi waktu siklus berjalan, animation layersLapisan Animasi mengandung Mesin Negara Animasi yang mengontrol animasi model atau bagian darinya. Contoh ini adalah jika Anda memiliki lapisan tubuh penuh untuk berjalan atau melompat dan lapisan yang lebih tinggi untuk gerakan tubuh atas seperti membuang objek atau menembak. Lapisan yang lebih tinggi mengambil precedence untuk bagian tubuh yang mereka kontrol. More info
Lihat di Glossary, kontrol atas semua aspek pemutaran animasi (waktu, kecepatan, campuran-weight), meshGrafik utama primitif Unity. Mesh membuat sebagian besar dunia 3D Anda. Unity mendukung mesh poligon triangulat atau Quadrangulasi. Nurbs, Nurms, permukaan Subdiv harus dikonversi ke poligon. More info
Lihat di Glossary skinningProses mengikat sendi tulang ke vertices mesh karakter atau ‘skin’. Dilakukan dengan alat eksternal, seperti Blender atau Autodesk Maya. More info
Lihat di Glossary dengan 1, 2 atau 4 tulang per simpul serta mendukung rag-dolls berbasis fisik dan animasi prosedural. Untuk mendapatkan hasil terbaik, disarankan agar Anda membaca praktik dan teknik terbaik untuk menciptakan karakter yang matang dengan kinerja optimal di halaman Unity pada halaman Model Karakter yang Dioptimalkan.
Membuat karakter animasi melibatkan dua hal; moving melalui dunia dan animating itu sesuai. Jika Anda ingin belajar lebih banyak tentang karakter bergerak di sekitar, lihatlah Halaman Pengendali Karakter. Halaman ini berfokus pada animasi. Yang sebenarnya dari karakter dilakukan melalui antarmuka skrip Unity.
Anda dapat men-download menunjukkan karakter animasi pra-setup. Setelah Anda belajar dasar-dasar di halaman ini Anda juga dapat melihat antarmuka skrip animasi.
Dalam permainan hari ini, campuran animasi adalah fitur penting untuk memastikan bahwa karakter memiliki animasi halus. Animators membuat animasi terpisah, misalnya, siklus berjalan, siklus lari, animasi idle atau animasi menembak. Setiap titik dalam waktu selama permainan Anda perlu dapat transisi dari animasi idle ke siklus berjalan dan sebaliknya. Secara alami, Anda ingin transisi menjadi halus dan menghindari kejernihan tiba-tiba dalam gerakan.
Ini adalah di mana campuran animasi datang. Dalam Unity Anda dapat memiliki sejumlah animasi yang bermain pada karakter yang sama. Semua animasi dicampur atau ditambahkan bersama untuk menghasilkan animasi akhir.
Langkah pertama kami akan membuat campuran karakter dengan lancar antara animasi idle dan berjalan. Untuk membuat pekerjaan skrip lebih mudah, kami akan terlebih dahulu mengatur Wrap Mode animasi ke Loop. Kemudian kita akan mematikan Play Automatically untuk memastikan skrip kita adalah satu-satunya animasi bermain.
Skrip pertama kami untuk memperbarui karakter cukup sederhana; kami hanya perlu beberapa cara untuk mendeteksi seberapa cepat karakter kami bergerak, dan kemudian memudar antara berjalan dan animasi idle. Untuk tes sederhana ini, kami akan menggunakan ax input standar: -
function Update () {
if (Input.GetAxis("Vertical") > 0.2)
animation.CrossFade ("walk");
else
animation.CrossFade ("idle");
}
Untuk menggunakan script ini di proyek Anda:-
Ketika Anda menekan tombol Play, karakter akan mulai berjalan di tempat ketika Anda memegang tombol panah dan kembali ke pose idle ketika Anda melepaskannya.
Lapisan adalah konsep yang sangat berguna yang memungkinkan Anda untuk animasi kelompok dan memprioritaskan bobot.
Sistem animasi Unity dapat dicampur antara sebanyak animation clipsAnimasi data yang dapat digunakan untuk karakter animasi atau animasi sederhana. Ini adalah bagian "unit" sederhana dari gerakan, seperti (salah satu contoh spesifik) "Idle", "Walk" atau "Run". More info
Lihat di Glossary yang Anda inginkan. Anda dapat menetapkan campuran berat secara manual atau hanya menggunakan animation.CrossFade(), yang akan menghidupkan berat secara otomatis.
Katakanlah Anda memiliki siklus berjalan dan siklus lari, baik memiliki berat 1 (100%). Ketika Unity menghasilkan animasi akhir, itu akan menormalkan berat, yang berarti siklus berjalan akan berkontribusi 50% untuk animasi dan siklus lari juga akan berkontribusi 50%.
Namun, Anda umumnya ingin memprioritaskan animasi mana yang menerima paling berat ketika ada dua animasi bermain. Tentu saja dimungkinkan untuk memastikan bahwa jumlah berat hingga 100% secara manual, tetapi lebih mudah hanya menggunakan lapisan untuk tujuan ini.
Sebagai contoh, Anda mungkin memiliki animasi menembak, idle dan siklus berjalan. Animasi berjalan dan idle akan dicampur berdasarkan kecepatan pemain tetapi ketika pemain menembak, Anda ingin menunjukkan hanya animasi menembak. Dengan demikian, animasi tuna pada dasarnya memiliki prioritas yang lebih tinggi.
Cara termudah untuk melakukan ini adalah untuk hanya terus bermain berjalan dan idle animasi sambil menembak. Untuk melakukan ini, kita perlu memastikan bahwa animasi tuna berada dalam lapisan yang lebih tinggi daripada animasi idle dan berjalan, yang berarti animasi menembak akan menerima bobot campuran terlebih dahulu. Animasi berjalan dan idle akan menerima bobot hanya jika animasi menembak tidak menggunakan semua 100% dari berat campuran. Jadi, ketika CrossFading animasi menembak, berat akan mulai dari nol dan selama periode singkat menjadi 100%. Pada awal lapisan berjalan dan idle masih akan menerima campuran berat tetapi ketika animasi tuna benar-benar pudar, mereka akan menerima tidak ada berat sama sekali. Ini adalah apa yang kita butuhkan!
function Start () {
// Set all animations to loop
animation.wrapMode = WrapMode.Loop;
// except shooting
animation["shoot"].wrapMode = WrapMode.Once;
// Put idle and walk into lower layers (The default layer is always 0)
// This will do two things
// - Since shoot and idle/walk are in different layers they will not affect
// each other's playback when calling CrossFade.
// - Since shoot is in a higher layer, the animation will replace idle/walk
// animations when faded in.
animation["shoot"].layer = 1;
// Stop animations that are already playing
//(In case user forgot to disable play automatically)
animation.Stop();
}
function Update () {
// Based on the key that is pressed,
// play the walk animation or the idle animation
if (Mathf.Abs(Input.GetAxis("Vertical")) > 0.1)
animation.CrossFade("walk");
else
animation.CrossFade("idle");
// Shoot
if (Input.GetButtonDown ("Fire1"))
animation.CrossFade("shoot");
}
Secara default animation.Play() dan animation.CrossFade() akan berhenti atau memudar animasi yang berada di lapisan yang sama. Ini adalah apa yang kita inginkan dalam kebanyakan kasus. Meme it Dalam menembak kami, idle, menjalankan contoh, bermain idle dan lari tidak akan mempengaruhi animasi menembak dan sebaliknya (Anda dapat mengubah perilaku ini dengan parameter opsional untuk animasi. CrossFade jika Anda suka).
Animasi pencampuran memungkinkan Anda untuk memotong jumlah animasi yang Anda butuhkan untuk membuat permainan Anda dengan memiliki beberapa animasi berlaku untuk bagian tubuh hanya. Ini berarti animasi tersebut dapat digunakan bersama dengan animasi lain dalam berbagai kombinasi.
Anda menambahkan pencampuran animasi berubah menjadi animasi dengan memanggil AddMixingTransform() pada Animasi yang diberikan.
Contoh pencampuran mungkin sesuatu seperti animasi tangan. Anda mungkin ingin membuat gelombang tangan baik ketika karakter idle atau ketika berjalan. Tanpa pencampuran animasi Anda harus membuat animasi bergelombang tangan terpisah untuk keadaan idle dan berjalan. Namun, jika Anda menambahkan transformasi bahu sebagai transformasi pencampuran ke animasi bergelombang tangan, animasi bergelombang tangan akan memiliki kontrol penuh hanya dari jointKomponen fisika yang memungkinkan koneksi dinamis antara komponen Rigidbody, biasanya memungkinkan beberapa tingkat pergerakan seperti engsel. More info
Lihat di Glossary bahu ke tangan. Karena sisa tubuh tidak akan terkena dampak tangan, itu akan terus bermain idle atau berjalan animasi. Akibatnya, hanya satu animasi diperlukan untuk membuat gelombang tangan sementara sisa tubuh menggunakan idle atau berjalan animasi.
/// Adds a mixing transform using a Transform variable
var shoulder : Transform;
animation["wave_hand"].AddMixingTransform(shoulder);
Contoh lain menggunakan jalan.
function Start () {
// Adds a mixing transform using a path instead
var mixTransform : Transform = transform.Find("root/upper_body/left_shoulder");
animation["wave_hand"].AddMixingTransform(mixTransform);
}
Animasi tambahan dan pencampuran animasi memungkinkan Anda untuk memotong jumlah animasi yang harus Anda buat untuk permainan Anda, dan penting untuk membuat animasi wajah.
Misalkan Anda ingin membuat karakter yang ramping ke sisi saat berjalan dan berjalan. Ini mengarah ke empat kombinasi (walk-lean-left, walk-lean-right, run-lean-left, run-lean-right), masing-masing yang membutuhkan animasi. Membuat animasi terpisah untuk setiap kombinasi dengan jelas mengarah ke banyak pekerjaan tambahan bahkan dalam kasus sederhana ini tetapi jumlah kombinasi meningkat secara dramatis dengan setiap tindakan tambahan. Untungnya animasi dan pencampuran aditif menghindari kebutuhan untuk menghasilkan animasi terpisah untuk kombinasi gerakan sederhana.
Animasi tambahan memungkinkan Anda untuk mengatasi efek satu animasi di atas orang lain yang dapat bermain. Ketika menghasilkan animasi tambahan, Unity akan menghitung perbedaan antara bingkai pertama dalam klip animasi dan bingkai saat ini. Kemudian itu akan menerapkan perbedaan ini di atas semua animasi bermain lainnya.
Merujuk ke contoh sebelumnya, Anda bisa membuat animasi untuk ramping kanan dan kiri dan Unity akan dapat mengabadikan ini di jalan kaki, idle atau menjalankan siklus. Ini bisa dicapai dengan kode seperti berikut:-
private var leanLeft : AnimationState;
private var leanRight : AnimationState;
function Start () {
leanLeft = animation["leanLeft"];
leanRight = animation["leanRight"];
// Put the leaning animation in a separate layer
// So that other calls to CrossFade won't affect it.
leanLeft.layer = 10;
leanRight.layer = 10;
// Set the lean animation to be additive
leanLeft.blendMode = AnimationBlendMode.Additive;
leanRight.blendMode = AnimationBlendMode.Additive;
// Set the lean animation ClampForever
// With ClampForever animations will not stop
// automatically when reaching the end of the clip
leanLeft.wrapMode = WrapMode.ClampForever;
leanRight.wrapMode = WrapMode.ClampForever;
// Enable the animation and fade it in completely
// We don't use animation.Play here because we manually adjust the time
// in the Update function.
// Instead we just enable the animation and set it to full weight
leanRight.enabled = true;
leanLeft.enabled = true;
leanRight.weight = 1.0;
leanLeft.weight = 1.0;
// For testing just play "walk" animation and loop it
animation["walk"].wrapMode = WrapMode.Loop;
animation.Play("walk");
}
// Every frame just set the normalized time
// based on how much lean we want to apply
function Update () {
var lean = Input.GetAxis("Horizontal");
// normalizedTime is 0 at the first frame and 1 at the last frame in the clip
leanLeft.normalizedTime = -lean;
leanRight.normalizedTime = lean;
}
Sitemap Saat menggunakan animasi aditif, sangat penting bahwa Anda juga memainkan beberapa animasi non-tuntas lainnya pada setiap transformasi yang juga digunakan dalam animasi aditif, jika animasi akan menambah hasil bingkai terakhir. Ini pasti tidak apa yang Anda inginkan. Meme itTip: When using Additive animations, it is critical that you also play some other non-additive animation on every transform that is also used in the additive animation, otherwise the animations will add on top of the last frame’s result. This is most certainly not what you want.
Kadang-kadang Anda ingin menghidupkan kembali tulang karakter Anda secara makmur. Misalnya, Anda mungkin ingin kepala karakter Anda untuk melihat titik tertentu di ruang 3D yang ditangani terbaik oleh skrip yang melacak titik target. Untungnya, Unity membuat ini sangat mudah, karena tulang hanya Transforms yang menggerakkan jaring berkelok-kelok. Dengan demikian, Anda dapat mengontrol tulang karakter dari skrip seperti Transforms dari GameObject.
Satu hal penting untuk tahu adalah bahwa pembaruan sistem animasi Transforms setelah fungsi Update() dan sebelum fungsi LateUpdate(). Jadi jika Anda ingin melakukan fungsi LookAt() yang harus Anda lakukan bahwa dalam LateUpdate() untuk memastikan bahwa Anda benar-benar mengintimidasikan animasi.
Ragdolls dibuat dengan cara yang sama. Anda hanya perlu melampirkan RigidbodiesKomponen yang memungkinkan GameObject untuk dipengaruhi oleh gravitasi simulasi dan kekuatan lainnya. More info
Lihat di Glossary, Character JointsSendi ball-socket yang diperpanjang yang memungkinkan sambungan terbatas pada setiap sumbu. Terutama digunakan untuk efek Ragdoll. More info
Lihat di Glossary dan Kapsul CollidersBentuk tak terlihat yang digunakan untuk menangani tabrakan fisik untuk objek. Seorang sari tidak perlu menjadi bentuk yang sama dengan jala objek - perkiraan kasar sering lebih efisien dan tidak dapat dibedakan dalam gameplay. More info
Lihat di Glossary ke tulang yang berbeda. Ini kemudian akan secara fisik menghidupkan karakter kulit Anda.
Bagian ini menjelaskan bagaimana animasi di Unity sampel ketika mereka dimainkan kembali oleh mesin.
AnimasiClips biasanya diberikan pada tingkat bingkai tetap. Misalnya, Anda dapat membuat animasi Anda di Autodeskdesk 3ds Max® atau Autodeskdesk Maya® pada tingkat bingkai 60 frames per secondFrekuensi di mana bingkai berturut-turut ditampilkan dalam permainan berjalan. More info
Lihat di Glossary (fps). Ketika mengimpor animasi di Unity, tingkat bingkai ini akan dibaca oleh importir, sehingga data dari animasi impor juga sampel pada 60 fpsLihat penembak orang pertama, bingkai per detik.
Lihat di Glossary.
Namun, permainan biasanya berjalan pada tingkat bingkai variabel. Tingkat bingkai mungkin lebih tinggi pada beberapa komputer daripada pada orang lain, dan itu juga dapat bervariasi dari satu detik ke dasar berikutnya pada kompleksitas pandangan cameraKomponen yang menciptakan gambar sudut pandang tertentu di tempat kejadian Anda. Output ditarik ke layar atau ditangkap sebagai tekstur. More info
Lihat di Glossary terlihat pada saat tertentu. Pada dasarnya ini berarti bahwa kita tidak dapat membuat asumsi tentang tingkat bingkai yang tepat permainan berjalan. Bagaimana cara ini adalah bahwa bahkan jika animasi diucapkan pada 60 fps, itu dapat dimainkan kembali pada bingkai yang berbeda, seperti 56.72 fps, atau 83.14 fps, atau praktis nilai lainnya.
Akibatnya, Unity harus sampel animasi pada variabel framerates, dan tidak dapat menjamin framerate yang awalnya dirancang. Untungnya, animasi untuk grafis komputer 3D tidak terdiri dari bingkai diskrit, tetapi lebih dari kurva terus menerus. Kurva ini dapat dipesan pada setiap titik dalam waktu, tidak hanya pada poin-poin tersebut dalam waktu yang sesuai dengan bingkai dalam animasi asli. Bahkan, jika permainan berjalan pada tingkat bingkai yang lebih tinggi daripada animasi diucapkan dengan, animasi benar-benar akan terlihat lebih halus dan lebih cairan dalam permainan daripada yang dilakukan di perangkat lunak animasi.
Untuk tujuan yang paling praktis, Anda dapat mengabaikan fakta bahwa animasi sampel Unity pada bingkai variabel. Namun, jika Anda memiliki logika gameplay yang bergantung pada animasi yang mengubah atau sifatnya menjadi konfigurasi yang sangat spesifik, maka Anda perlu menyadari bahwa pengambilan sampel kembali terjadi di balik scenesAdegan berisi lingkungan dan menu permainan Anda. Pikirkan setiap file Adegan unik sebagai tingkat yang unik. Di setiap Adegan, Anda menempatkan lingkungan, hambatan, dan dekorasi, pada dasarnya merancang dan membangun permainan Anda dalam potongan-potongan. More info
Lihat di Glossary. Misalnya, jika Anda memiliki animasi yang memutar objek dari 0 hingga 180 derajat lebih dari 30 bingkai, dan Anda ingin tahu dari kode Anda ketika mencapai setengah cara di sana, Anda tidak boleh melakukannya dengan memiliki pernyataan bersyarat dalam kode Anda yang memeriksa apakah rotasi saat ini 90 derajat. Karena sampel Unity animasi sesuai dengan tingkat bingkai variabel dari permainan, itu mungkin sampel ketika rotasi hanya di bawah 90 derajat, dan waktu berikutnya tepat setelah mencapai 90 derajat. Jika Anda perlu diberitahu ketika titik tertentu dalam animasi tercapai, Anda harus menggunakan AnimationEvent.
Catatan juga bahwa sebagai konsekuensi dari sampling framerate variabel, animasi yang dimainkan kembali menggunakan WrapMode.Once mungkin tidak sampel pada waktu yang tepat dari bingkai terakhir. Dalam satu bingkai permainan animasi dapat sampel hanya sebelum akhir animasi, dan dalam bingkai berikutnya waktu dapat melebihi panjang animasi, sehingga dinonaktifkan dan tidak sampel lagi. Jika Anda benar-benar membutuhkan bingkai terakhir dari animasi untuk sampel persis, Anda harus menggunakan WrapMode.ClampForever yang akan menjaga pengambilan bingkai terakhir tak terbatas sampai Anda menghentikan animasi sendiri.