Chào mừng trở lại với loạt video game scavengers.
Trong video trước, chúng ta đã xem xét thiết lập
dự án và trình diễn sản phẩm hoàn chỉnh.
Trong video này, chúng ta sẽ tạo animation
cho người chơi (player) và kẻ địch (enemy)
từ sprite sheet
và thiết lập player và enemy prefabs
Hãy tạo một new scene
và chúng ta sẽ bắt đầu tạo player prefab
cùng với animations của player
Chúng ta chọn Game Object - Create Empty
và chúng ta sẽ có bảng Player hiện ra
Trong folder Sprite chúng ta có một sprite sheet
bây giờ chúng ta cắt nó
thành nhiều sprites nhỏ
Để biết thông tin thêm về sprite sheets và sprites
bạn có thể xem ở link bên dưới
Trong trường hợp này chúng ta sẽ lấy
frames đầu tiên
nó là player idle animation,
và tôi đã làm điều đó bằng việc click vào frame đầu tiên
và sau đó shift-clicking đến farme cuối cùng mà tôi muốn
Tôi sẽ lấy những thứ này rồi bỏ chúng vào đây
tới player prefab
và sau đó ta đặt cho nó một cái tên
chúng ta sẽ gọi nó là PlayerIdle
Đây sẽ là animation sẽ chạy khi
player không làm bất cứ thứ gì
Chúng ta sẽ đặt cái này vào folder Animations
Bạn sẽ nhận thấy khi chúng ta làm điều này sẽ có hai thành phần (components)
được thêm vào game object, một là sprite renderer (kết xuất đồ họa),
nó sẽ hiển thị các frame hiện tại
Và một animator, nó sẽ cho phép chúng ta chạy animation.
Khi chúng ta frames vào
hai components này, nó sẽ yêu cầu chúng ta
lưu animation (cái mà chúng ta đã lưu) vào folder Animations con
Nó cũng tạo ra animator controller,
cho phép chúng ta quản lí
animation đang chạy hiện tại.
Chúng ta sẽ di chuyển nó đến folder Animator Controllers
Và chúng ta sẽ thêm một số animations nữa cho player.
Hãy trở lại sprites.
Và trong trường hợp này tôi sẽ chọn
hai PlayerChop animation frames,
thả chúng vào player,
và chúng ta sẽ đặt tên là PlayerChop.
Chúng ta sẽ đặt nó vào folder Animations.
Bây giờ để ý sẽ thấy khi chúng ta làm như vậy sẽ không thêm
một animator controller khác nữa, thay vào đó
sẽ thêm một animation
vào animator controller đã tồn tại trên player.
Chúng ta sẽ làm lại với PlayerHit animation.
Tiếp theo chúng ta có thể kiểm tra để chắc chắn là chúng hoạt động.
Và chúng ta có thể thấy PlayerIdle đang chạy.
Bây giờ animation của chúng ta hơi nhanh
nên chúng ta sẽ mở nó
bằng việc click đúp vào animaor controller,
làm rõ trạng thái PlayerIdle
chúng ta chỉ cần cài đặt speed thành 0.5,
nó sẽ chạy với một nửa tốc độ bình thường.
Lưu ý rằng hai animations khác của chúng ta
cũng vừa mới được thêm vào states,
và trong loạt series sau này chúng ta sẽ
học cách để thay đổi
giữa các states bằng script.
Bây giờ hãy kiểm tra nó.
Đây.
Với những animations chudng ta đã tạo cho Player
chúng ta sẽ tiếp tục và áp dụng một tag
cho player tên là Player.
Bây giờ tag Player đã được xác định trước
trong tất cả projects Unity, chúng ta cũng sẽ thêm
vài tag nữa như là food, exit,
enemy và soda.
Vậy là đã xong thêm tag
và gõ vào những trường này.
Chúng ta sẽ cài đặt tag Player
và chúng ta cũng thiết lập layer (lớp).
Đây là layer mặc định của chúng ta,
và chúng ta thêm một layer gọi là Blocking Layer (layer chặn).
Đây là layer mà trên nó
tất cả các collisions (va chạm) được kiểm tra
và chúng ta sẽ chọn nó
cho player, và chúng ta thêm nó theo cách tương tự,
bằng việc chọn Add Layer và gõ vào đó.
Chúng ta sẽ tiếp tục chọn blocking layer.
Chúng ta sẽ thêm một layer nữa
liên quan đến player,
chúng ta sẽ thiết lập sorting layer cho sprite renderer.
Bây giờ chúng ta đã có một số layer xác định trước ở đây,
chúng ta có Floor layer, nó sẽ là background.
và Item layer, nó sẽ được hiển thị phía trước floor,
nó chính là food và soda.
Và sau đó là Units layer cho player và enemy.
Chúng ta sẽ chỉ định player cho Units layer.
Tiếp theo chúng ta thêm hai component
tới player, chúng ta sẽ thêm box collider 2D
và rigidbody 2D.
Box collider 2D sẽ cho phép chúng ta
kiểm tra collision (va chạm) với người chơi
Và rigidbody 2D sẽ cho phép chúng ta
di chuyển player bằng cách sử dụng phương pháp vật lý.
Chúng ta sẽ cài đặt rigidbody 2D là Is Kinematic
để cho player không bay lên
và nhảy lung tung, chúng ta sẽ chỉ cho anh ta di chuyển
trong không gian cho phép.
Chúng ta sẽ điều khiển nó bằng script
và cài đặt nó là Is Kinematic.
Chúng ta cũng sẽ điều chỉnh kích thước
của box collider 2D
làm nó nhỏ hơn chút để player
sẽ không vô tình va chạm với
những thứ trong không gian lân cận,
chỉ khi chúng đang cố gắng để di chuyển vào một không gian
bị chiếm bởi một collider khác.
Chúng ta sẽ còn thêm một vài component khác cho player nữa
nhưng hiện tại bây giờ như thế này là ok.
Chúng ta sẽ lấy nó
và kéo vào folder Prefabs để lưu nó lại.
Bây giờ chúng ta sẽ tạo prefab
chúng ta tạm thời có thể xóa player từ hierarchy
và chúng ta sẽ tạo enemy đầu tiên.
Chúng ta chọn Game Object - Create Empty
và đặt tên là Enemy1.
Bây giờ bắt đầu thêm animation cho Enemy1.
Tôi sẽ quay lại sprites
shift-click vào frames của animation EnemyIdle
và thả chúng vào đây.
Chúng ta sẽ gọi là Enemy1Idle.
Nó sẽ tự động thêm component
mà chúng ta cần và chúng ta sẽ thêm
frame khác của animation này cho nó trông tốt hơn.
Thêm animation Attack.
Chúng ta có thể nháy đúp để xem nó hoạt động
Và của chúng ta đây, trông khá tốt.
Bây giờ hãy thêm box collider và rigidbody.
Chúng ta cũng sẽ cài đặt rigidbody cho
enemy là Is Kinematic
và chúng ta thêm tag Enemy
và chỉ định blocking layer.
Chúng ta cũng sẽ thiết lập sorting layer của sprite renderer là Units.
Sau khi xong chúng ta có thể kéo thả enemy xuống
để tạo prefab của enemy đầu tiên.
Thay vì xóa cái này chúng ta sẽ
sửa đổi nó để tạo ra enemy thứ hai.
Đổi tên thành Enemy2.
Và chúng ta sẽ thả
frames Enemy2Idle vào.
Và frame Enemy2Attack.
Bây giờ khi chúng ta thả animation
tới enemy chúng ta đã tạo ra một animator controller mới.
Chúng ta sẽ di chuyển những thứ này tới folder Animator Controllers.
Tiếp theo chúng ta sẽ mở animator controller của Enemy1
và chúng ta sẽ thấy bên trong tất cả aniamtion
mà chúng ta đã thêm vào như là states.
Bây giờ việc chúng ta cần làm là
xóa Enemy2 states
chúng ta shift-click lên từng phần
và sau đó right-click để xóa chúng.
Bây giờ nó sẽ hỏi chúng ta có muốn xóa assets đã chọn không
chúng ta chọn xóa.
Và việc chúng ta cần làm bây giờ là
Enemy1 và Enemy2 sẽ chia sẻ
cùng state giống nhau, chúng sẽ có hai state là
Idle và Attack.
Việc chúng ta cần làm bây giờ là tạo
một animator override controller,
nó sẽ cho phép chúng ta dùng cùng một state
và cùng một script điều khiển nó
nhưng chạy khác animation
trong mỗi state.
Chúng ta sẽ chọn
Create - Animator Override Controller.
Gọi nó là Enemy2
Và điều đầu tiên chúng ta cần xác định
controller nào chúng ta cần overriding (ghi đè),
chúng ta chọn controller của Enemy1 và thả nó vào.
Và chúng ta sẽ thấy,
hai animation ban đầu sẽ chạy,
Enemy1Idle và Enemy1Attack,
và chúng ta sẽ ghi đè chúng với
Enemy2Attack
và Enemy2Idle.
Trong Enemy2 chúng ta sẽ thay đổi
controller của animator thành
dùng animator override controller.
Bây giờ chạy thử scene.
Của chúng ta đây.
Cuối cùng thả Enemy2 và folder prefabs
để tạo prefab mới.
Tiếp theo chúng ta xóa Enemy2 từ hierarchy
và lưu scene lại.
Chúng ta gọi nó là Main
và lưu vào folder Scene trống.
Bây giờ chúng ta đã tạo được các prefabs cơ bản
cho Player và Enemy
Bây giờ chúng ta sẽ tiếp tục tạo
các prefab khác mà chúng ta cần để bố trí trò chơi.
Trong video tiếp theo chúng ta sẽ tạo
floor, wall, food, soda
và exit prefabs.