Sử dụng Mecanim để tạo chuyển động cho nhân vật trong game
Đây là bài viết cung cấp những kiến thức cần thiết để tạo chuyển động cho nhân vật trong game, mà cụ thể ở đây là chuyển động của Zombies trong 1 game FPS. Do khuôn khổ của 1 bài techblog nên đây không phải tutorial hướng dẫn cơ bản về mecanim mà tập trung vào việc áp dụng nó trong các game sử dụng ...
Đây là bài viết cung cấp những kiến thức cần thiết để tạo chuyển động cho nhân vật trong game, mà cụ thể ở đây là chuyển động của Zombies trong 1 game FPS. Do khuôn khổ của 1 bài techblog nên đây không phải tutorial hướng dẫn cơ bản về mecanim mà tập trung vào việc áp dụng nó trong các game sử dụng Unity (ver 4.3 trở lên) như thế nào.
/**----------------------------------------------------
------------------------------------------------------**/
I> Một số khái niệm cơ bản
Mecanim là gì ?
Mecanim là một hệ thống công cụ + framework mạnh mẽ và linh hoạt để xây dựng chuyển động nhân vật (con người và không phải con người) trong game.
Animation clip (file animations) là gì ?
Một file asset chứa thông tin về 1 chuyển động, trong đó lưu trữ vị trí TƯƠNG ĐỐI của các vertex trong models theo thời gian (tính bằng frame)
Vertex là gì ?
Các đỉnh tạo thành 3D models, vertex được tạo ra bởi các phần mềm đồ hoạ.
Cơ chế hoạt động của animations trong Unity như thế nào ?
Unity các version cũ (từ version 3.5 về trước) có cách xử lý vấn đề animations theo flow như sau
Create Animation Clips —————> Play Animations Clips
bản unity 4.0 trở đi đã đưa vào Mecanim, một công cụ giúp cho việc tạo chuyển động dễ dàng hơn
flow bây giờ sẽ là:
Create Animation Clips —————> Create Animations States ————> Switch Animation States
FSM (Finite State Machine) - Là một mô hình tính toán được sử dụng để thiết kế chương trình máy tính và mạch logic. FSM áp dụng vào mecanim và một số framework về AI trong Unity.
Nguồn tham khảo:
http://unity3d.com/learn/tutorials/modules/beginner/animation
http://unity3d.com/unity/animation
http://wiki.unity3d.com/index.php?title=Finite_State_Machine
II> Tạo animation cho Zombies trong game
Có nhiều cách tạo chuyển động nhân vật trong game nhưng đều xoay quanh xử lí 2 vấn đề chính Global Moving (nhân vật di chuyển trong world) và animation (các xương của nhân vật thay đổi vị trí tương đối như thế nào).
Về vấn đề xử lí Global Moving, đơn giản nhất ta có thể sử dụng script control thay đổi transform trong từng frame hoặc sử dụng character controller có sẵn của Unity. Nếu đối tượng có thành phần vật lý (Rigidbody) tốt hơn ta nên sử dụng rigidbody để control movement, yêu cầu một thành phần collider được gắn vào đối tượng.
Về vấn đề animation, đơn giản nhất là sử dụng câu lệnh animation.Play(string animName) với mecanim thì cần set condition để switch state nhân vật sẽ thực hiện actions.
Đó là những cách xử lí chung, sang đến phiên bản Unity 4.0, hệ thống Mecanim cho phép chúng ta giải quyết cả 2 vấn đề trên chỉ với 1 số thao tác đơn giản thông qua điều chỉnh Root Transform.
Root Transform là một hình chiếu lên mặt phẳng Y của Body Transform và được tính toán trong thời gian chạy chương trình. Vào mỗi frame vị trí của root transform sẽ được tính toán, sự thay đổi này sẽ tác động lên GameObject và làm nó di chuyển.
Tạo chuyển động walk của Zombies
Download Models :
Sources
Sau khi download về chúng ta sẽ có thư mục ZombieMotionPack nằm trong assets, click chọn prefab Zombie@walk01 để quan sát
Với chuyển động walk của zombies như thế này, sẽ thích hợp hơn nếu sử dụng mecanim để tạo chuyển động vì di chuyển của zombies cần khớp với chuyển động chân trong animation
Chọn prefab Zombie@walk01
Trong Inspector của Animation (chuyển về Humanoid trước)
config
Các option liên quan:
Root Transform Rotation:
Bake into to Pose: check vào box này để hướng của motion theo body transform direction. Thích hợp nếu thực hiện rotate bằng script, ở đây chúng ta sử dụng script để điều khiển AI cho zombies, khi zombies tìm thấy mục tiêu (target) thì lập tức quay về hướng target và đi thẳng.
Based Upon: Nên chọn Body Orientation, motion sẽ quay dựa trên vector forward của body transform. Tuỳ chọn Original được lựa chọn cho những animation như di chuyển vòng quanh, khi đó hướng motion sẽ được tính toán dựa trên góc quay của body transform được cộng thêm 1 lượng offset.
Root Transform Position Y:
Base into to Pose: check it nếu motion không làm thay đổi object height
Based Upon: thay đổi độ cao dựa tính toán từ feet, original, hay mass center, tuỳ chỉnh cho phù hợp với những animation như jump, swim …
Root Transform Position XZ
Base into to Pose: tương tự như trên, check it để Root Transform không thay đổi position theo 2 trục xz. Trong trường hợp này ta cần uncheck nó để mecanim có thể di chuyển zombies.
Kéo prefabs Zombie vào scene.
Add thành phần Animator vào game object (GameObject -> Miscellaneous -> Animator)
Screen Shot 2014-08-01 at 4.23.50 PM
Chú ý: Apply Root Motion, check vào option này để Animator có thể di chuyển root transform
Tạo controller và viết script di chuyển:
Việc di chuyển của zombie đã có thể thực hiện qua mecanim. Về AI của zombie chúng ta có thể sử dụng AI script, áp dụng các giải thuật tìm đường nếu muốn và cho zombie di chuyển theo Path tìm được. Công việc đó người viết sẽ trình bày trong 1 blog khác. Hiện tại tạm thời viết code di chuyển theo target, việc di chuyển theo way points thực hiện tương tự.
Tạo Animation Controller (Create->Animator Controller)
Tạo State (Create State->Empty State->kéo motion walk01 vào ô motion)
Screen Shot 2014-08-01 at 4.51.35 PM
Viết Script di chuyển, chúng ta chỉ cần quay zombie về hướng target, hành động di chuyển sẽ được thực hiện.
void Update(){
if (target!=null){
var dir = target.position - myTrans.position;
myTrans.rotation = Quaternion.LookRotation(dir);
var dist = Vector3.Distance(target.position - myTransform.position);
if (dist < 1.0f){
m_Animator.speed = 0.001f;
}
else{
m_Animator.speed = 1.0f;
}
}
}
Kéo script vừa tạo attach vào đối tượng Zombie, nhấn Play để chạy thử, có thể di chuyển target trên scene để kiểm chứng lại.
HẾT.