1. Cách làm để khớp animation clip có sẵn của nhân vật với thoại


Ví dụ cần làm 1 đoạn animation cho Kem giơ tay lên trước ngực giới thiệu bản thân, Kem nói xong thì bỏ tay xuống. Hiện tại đã có animation Kem giơ tay lên ngực rồi hạ xuống nhưng thời gian chưa khớp với lời thoại. Có thể làm theo 3 cách như sau:

  • Copy Keyframe: Copy keyframe của animation giơ tay đã có sẵn vào animation track, thêm keyframe để kéo dài đoạn Kem để tay lên ngực. Cách này hơi thủ công nhưng phù hợp nếu animation này chỉ xuất hiện 1 lần.
  • Tạo anim mới: Làm sẵn 2-3 đoạn animation với độ dài khác nhau (short & long) để dùng. Đây là cách đơn giản nhất nếu mình xác định được độ dài tương đối của các câu thoại, hoặc chuyển động không cần phải khớp 100%.
  • Tách anim để linh hoạt hơn: Tách thành 2 animation clip: Để tay lên ngực, hạ tay xuống. Khi cho vào timeline thì kéo cái để tay lên ngực vào, lúc nào cần hạ xuống thì kéo cái hạ tay xuống vào.

2. Animation theo chuỗi


2.1. Chuỗi gồm 2 anim: Start → End

  • Chính là cách tách anim để linh hoạt hơn đã nói ở trên. Anim được tách ra sẽ linh hoạt hơn và dễ tái sử dụng hơn cho nhiều trường hợp.
  • Nhiều đoạn anim sẽ không cần _End mà chỉ cần cho về Idle là xong.

2.2. Chuỗi có vòng lặp: Start → Loop → End

Ví dụ 1 anim chạy gồm 3 animation: Lấy đà → Chạy → Phanh. Có thể sử dụng theo nhiều cách khác nhau như sau:

  • Dùng cả 3 đoạn để animation trông xịn hơn, đỡ 1 màu hơn là chỉ có mỗi đoạn Chạy. Loop đoạn Chạy để tăng giảm thời gian cho hoạt động.
  • Chỉ dùng 2 đoạn Lấy đà + Chạy hoặc Chạy + Phanh.
  • Dùng riêng đoạn Chạy và tạo transition từ các hành động khác như mình đang làm.  
  • Thay đoạn Chạy thành Chạy Nhanh hoặc Nhảy để tạo chuyển động mới.

2.3. Chuỗi không có vòng lặp: Start → Anim 1 → Anim 2 → End

  • 1 số animation không phải dạng loop. Ví dụ như animation nhảy lên sẽ gồm: Cúi người → Nhảy → Tiếp đất → Đứng dậy
  • Chuỗi này có thể tách và kết hợp với các anim khác để tạo thành chuỗi mới
    • Cúi người → Nhảy → Ném bóng vào rổ → Tiếp đất → Đứng dậy
    • Cúi người → Nhảy → Bám vào xà đơn
    • Lộn 1 vòng → Tiếp đất → Đứng dậy

3. Chỉ sử dụng 1 phần animation clip trong timeline


Thay vì tách mọi anim thành chuỗi, có thể thu ngắn độ dài của anim clip trong timeline → Unity sẽ cắt bớt keyframe trong anim đấy.

Ví dụ đoạn anim chạy gồm 3 phần Lấy đà (2s) → chạy (2s) → Phanh (2s).

Khi kéo anim clip vào timeline, thu ngắn 2s đầu và 2s cuối → sẽ được đoạn chạy 2s. Vẫn có thể cho loop đoạn chạy này lên như bình thường. Tuy nhiên cách này không quá chính xác, phù hợp để tận dụng animation có sẵn cho 1 vài cảnh, không phù hợp cho những anim thường dùng.


4. Sử dụng Animation Override


Tương tự như với animation theo chuỗi, để sử dụng Animation Override mình cũng tách nhỏ animation ra để linh hoạt hơn khi sử dụng. Nhưng Animation chuỗi thì tách anim theo tiến trình thời gian, còn Animation override thì tách theo bộ phận cơ thể.

Cách làm là tách riêng các chuyển động đơn của các bộ phận cơ thể để kết hợp với các animation khác tạo thành nhiều chuyển động mới, phức tạp hơn.

  • Khi sử dụng animation override thì animation của lớp dưới sẽ đè lên lớp trên. Ví dụ:
    • Chạy + Vẫy tay = Vừa chạy vừa chào
    • Đi bộ + quét = Đi quét nhà
  • Khi tách các chuyển động ra, có thể dễ dàng tạo animation override trong timeline bằng cách đưa animation clip vào animation override track mà không phải tạo keyframe thủ công.
  • Lưu ý: với chuyển động override, thường sẽ cần tắt Arm IK và chỉnh xương nhân vật trực tiếp thì chuyển động mới hợp lý.

5. Làm việc với Animation clip trên timeline


5.1. Inspector của Animation Clip trên timeline

Gồm 2 phần quan trọng là

  • Animation Extrapolation: Quy định chuyển động & dáng nhân vật trước và sau clip
  • Animation Playable Asset: Quy định chuyển động & dáng nhân vật trong clip.

5.2. Animation Extrapolation

  • Pre-Extrapolate: Quyết định chuyển động & dáng của nhân vật trước khi clip bắt đầu
    • None: Tắt anim
    • Hold: Hold frame đầu tiên của clip này khi clip trước kết thúc.
    • Loop: Bắt đầu chạy clip này từ lúc clip trước kết thúc & và loop luôn.
    • Ping Pong: Chuyển động kiểu con lắc. Dùng cho chuyển động kiểu vẫy tay, gật đầu, đập búa…
    • Continue: Bắt đầu chạy clip này từ lúc clip trước kết thúc. Loop hoặc Hold theo clip gốc quy định.
  • Post-Extrapolate: Quyết định chuyển động & dáng của nhân vật sau khi clip kết thúc. Trong 2 thông số thì Post-Extrapolate sẽ được ưu tiên. Nếu clip phía trước trên timeline bật Post-Extrapolate thì clip phía sau sẽ không bật Pre-Extrapolate được nữa.
    • None: Không ảnh hưởng. Cho phép clip sau chỉnh Pre-Extrapolate
    • Hold: Kéo dài frame cuối cùng của clip cho đến clip tiếp theo
    • Loop: Lặp quay lại từ đầu clip cho đến clip tiếp theo.
    • Ping Pong: Chuyển động kiểu con lắc. Dùng cho chuyển động kiểu vẫy tay, gật đầu, đập búa…
    • Continue: Tiếp tục chuyển động như trong animation clip gốc
  • Lưu ý: Trừ Continue, các setting khác đều dựa trên clip trên timeline chứ không phải animation gốc. Ví dụ ở hình dưới, clip Kem chạy được loop 2,5 lần trên timeline.
  • Nếu chọn Loop, nó sẽ chạy kiểu
  • → chuyển động sẽ bị giật vì lần loop thứ 3 được có 1 nửa thì đã quay về frame đầu
  • Nếu chọn Continue, nó sẽ chạy hết vòng lặp như trong animation clip gốc rồi mới loop → chuyển động sẽ mượt
  • Nếu clip gốc không bật Loop, khi chọn Continue thì chạy xong 1 lượt nó sẽ Hold

5.3. Animation Playable Asset

  • Foot IK: Chỉ dùng cho game, không quan trọng trong animation
  • Loop: Điều chỉnh việc Loop hay Hold của anim clip trong phạm vi độ dài của clip.
    • Use Source Asset: Lấy setting của animation clip gốc (Click vào animation clip trong hierarchy, nó sẽ hiện lên trong phần inspector. Cái clip nào không phù hợp để loop mình có thể tắt luôn từ đầu → tiết kiệm thời gian khi làm trong timeline)
    • On: Bật loop.
    • Off: Tắt loop, chuyển thành Hold. Nếu clip trên timeline có đủ thời gian thì nó sẽ luôn chạy animation từ đầu đến cuối 1 lần.
    • Ví dụ anim clip gốc dài 2s. Mình kéo nó thành 6s và bật Loop thì nó sẽ loop 3 lần. Nếu mình tắt Loop thì nó sẽ chạy 2s, giữ frame cuối trong 4s tiếp theo (Hold). Kết thúc 6s, nhân vật có chuyển động tiếp hay không phụ thuộc vào cách mình chỉnh Post-Extrapolation.

5.4. 1 số kĩ thuật chỉnh animation clip trên timeline

#Kĩ thuậtChi tiết
1Tắt extrapolationNên hạn chế dùng extrapolation vì sẽ không tạo được transition cho anim. Extrapolation trên Override Animation track cũng tạo ra rất nhiều vấn đề. Cách tốt nhất là chọn toàn bộ animation clip trên timeline, sau đó chỉnh như sau để đảm bảo các clip không ảnh hưởng lẫn nhau. Pre-Extrapolation: NonePost-Extrapolation: None
2Khi nào dùng extrapolationLợi ích của Extrapolation là cho nhân vật tiếp tục chuyển động mà không cần thay đổi độ dài của animation clip, giúp tiết kiệm thời gian nếu mình thay đổi vị trí của các clip trước hoặc sau.
3Loop animKéo clip đủ độ dài mong muốn.
Trong phần Animation Playable Asset > Loop: Use source asset (với các clip đã bật sẵn loop) hoặc On (để bắt buộc loop)
4Chạy 1 lần rồi holdVD: Kem đưa tay lên ngực tự giới thiệu bản thân, và tiếp tục giữ tay ở đó.Kéo clip đủ độ dài mong muốn. Loop: Use source asset (với các clip đã tắt loop) hoặc Off
5Transition về IdleAnim Idle đã được chỉnh lại để reset dáng đứng cơ bản của nhân vật. Nếu nhân vật gặp bất kỳ vấn đề gì về dáng, có thể cho transition về Idle Giữ Ctrl + click vào cuối animation clip, kéo về bên trái để tạo transition về idle. Có thể kéo dài animation clip ra trước để có chỗ tạo transitionCó thể Ctrl + click vào đầu animation để tạo transition từ idle vào
6 Chỉ sử dụng 1 phần animation clip trong timelineXem phần 1 số tips với animation > 3. Chỉ sử dụng 1 phần animation