WEBVTT 00:00:02.194 --> 00:00:05.801 Chào mừng trở lại với loạt video game scavengers. 00:00:05.801 --> 00:00:07.801 Trong video trước, chúng ta đã xem xét thiết lập 00:00:07.801 --> 00:00:10.498 dự án và trình diễn sản phẩm hoàn chỉnh. 00:00:11.442 --> 00:00:13.739 Trong video này, chúng ta sẽ tạo animation 00:00:13.739 --> 00:00:15.739 cho người chơi (player) và kẻ địch (enemy) 00:00:15.739 --> 00:00:17.555 từ sprite sheet 00:00:17.555 --> 00:00:21.030 và thiết lập player và enemy prefabs 00:00:21.568 --> 00:00:23.568 Hãy tạo một new scene 00:00:26.904 --> 00:00:31.072 và chúng ta sẽ bắt đầu tạo player prefab 00:00:31.072 --> 00:00:33.341 cùng với animations của player 00:00:34.178 --> 00:00:37.309 Chúng ta chọn Game Object - Create Empty 00:00:39.328 --> 00:00:41.328 và chúng ta sẽ có bảng Player hiện ra 00:00:43.260 --> 00:00:45.777 Trong folder Sprite chúng ta có một sprite sheet 00:00:45.777 --> 00:00:48.753 bây giờ chúng ta cắt nó 00:00:48.753 --> 00:00:50.387 thành nhiều sprites nhỏ 00:00:50.387 --> 00:00:52.934 Để biết thông tin thêm về sprite sheets và sprites 00:00:52.934 --> 00:00:54.934 bạn có thể xem ở link bên dưới 00:00:55.309 --> 00:00:57.309 Trong trường hợp này chúng ta sẽ lấy 00:00:57.309 --> 00:01:00.148 frames đầu tiên 00:01:00.148 --> 00:01:01.543 nó là player idle animation, 00:01:01.543 --> 00:01:03.543 và tôi đã làm điều đó bằng việc click vào frame đầu tiên 00:01:03.543 --> 00:01:05.726 và sau đó shift-clicking đến farme cuối cùng mà tôi muốn 00:01:05.726 --> 00:01:07.726 Tôi sẽ lấy những thứ này rồi bỏ chúng vào đây 00:01:07.726 --> 00:01:09.188 tới player prefab 00:01:09.784 --> 00:01:11.386 và sau đó ta đặt cho nó một cái tên 00:01:11.386 --> 00:01:14.109 chúng ta sẽ gọi nó là PlayerIdle 00:01:14.109 --> 00:01:15.879 Đây sẽ là animation sẽ chạy khi 00:01:15.879 --> 00:01:17.792 player không làm bất cứ thứ gì 00:01:17.792 --> 00:01:20.467 Chúng ta sẽ đặt cái này vào folder Animations 00:01:21.380 --> 00:01:23.380 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) 00:01:23.380 --> 00:01:25.911 được thêm vào game object, một là sprite renderer (kết xuất đồ họa), 00:01:25.911 --> 00:01:28.585 nó sẽ hiển thị các frame hiện tại 00:01:28.585 --> 00:01:33.106 Và một animator, nó sẽ cho phép chúng ta chạy animation. 00:01:33.106 --> 00:01:35.106 Khi chúng ta frames vào 00:01:35.106 --> 00:01:37.890 hai components này, nó sẽ yêu cầu chúng ta 00:01:37.890 --> 00:01:41.581 lưu animation (cái mà chúng ta đã lưu) vào folder Animations con 00:01:41.975 --> 00:01:45.150 Nó cũng tạo ra animator controller, 00:01:45.150 --> 00:01:47.150 cho phép chúng ta quản lí 00:01:47.150 --> 00:01:48.938 animation đang chạy hiện tại. 00:01:48.938 --> 00:01:52.103 Chúng ta sẽ di chuyển nó đến folder Animator Controllers 00:01:52.775 --> 00:01:55.244 Và chúng ta sẽ thêm một số animations nữa cho player. 00:01:55.907 --> 00:01:57.340 Hãy trở lại sprites. 00:01:58.109 --> 00:02:00.493 Và trong trường hợp này tôi sẽ chọn 00:02:01.647 --> 00:02:05.141 hai PlayerChop animation frames, 00:02:05.141 --> 00:02:06.519 thả chúng vào player, 00:02:07.410 --> 00:02:09.410 và chúng ta sẽ đặt tên là PlayerChop. 00:02:10.102 --> 00:02:12.860 Chúng ta sẽ đặt nó vào folder Animations. 00:02:16.985 --> 00:02:18.985 Bây giờ để ý sẽ thấy khi chúng ta làm như vậy sẽ không thêm 00:02:18.985 --> 00:02:20.985 một animator controller khác nữa, thay vào đó 00:02:20.985 --> 00:02:24.008 sẽ thêm một animation 00:02:24.008 --> 00:02:26.249 vào animator controller đã tồn tại trên player. 00:02:26.249 --> 00:02:29.117 Chúng ta sẽ làm lại với PlayerHit animation. 00:02:34.021 --> 00:02:36.730 Tiếp theo chúng ta có thể kiểm tra để chắc chắn là chúng hoạt động. 00:02:40.288 --> 00:02:42.626 Và chúng ta có thể thấy PlayerIdle đang chạy. 00:02:42.626 --> 00:02:44.626 Bây giờ animation của chúng ta hơi nhanh 00:02:44.626 --> 00:02:46.626 nên chúng ta sẽ mở nó 00:02:46.626 --> 00:02:50.142 bằng việc click đúp vào animaor controller, 00:02:51.527 --> 00:02:53.930 làm rõ trạng thái PlayerIdle 00:02:53.930 --> 00:02:56.782 chúng ta chỉ cần cài đặt speed thành 0.5, 00:02:56.782 --> 00:02:59.492 nó sẽ chạy với một nửa tốc độ bình thường. 00:02:59.492 --> 00:03:01.492 Lưu ý rằng hai animations khác của chúng ta 00:03:01.492 --> 00:03:03.128 cũng vừa mới được thêm vào states, 00:03:03.128 --> 00:03:05.128 và trong loạt series sau này chúng ta sẽ 00:03:05.128 --> 00:03:07.380 học cách để thay đổi 00:03:07.380 --> 00:03:09.659 giữa các states bằng script. 00:03:10.140 --> 00:03:11.428 Bây giờ hãy kiểm tra nó. 00:03:14.255 --> 00:03:15.380 Đây. 00:03:17.418 --> 00:03:19.418 Với những animations chudng ta đã tạo cho Player 00:03:19.418 --> 00:03:21.418 chúng ta sẽ tiếp tục và áp dụng một tag 00:03:21.418 --> 00:03:24.699 cho player tên là Player. 00:03:24.699 --> 00:03:26.853 Bây giờ tag Player đã được xác định trước 00:03:26.853 --> 00:03:29.440 trong tất cả projects Unity, chúng ta cũng sẽ thêm 00:03:29.440 --> 00:03:32.332 vài tag nữa như là food, exit, 00:03:32.332 --> 00:03:33.929 enemy và soda. 00:03:33.929 --> 00:03:35.929 Vậy là đã xong thêm tag 00:03:38.496 --> 00:03:41.653 và gõ vào những trường này. 00:03:42.576 --> 00:03:45.362 Chúng ta sẽ cài đặt tag Player 00:03:45.362 --> 00:03:47.487 và chúng ta cũng thiết lập layer (lớp). 00:03:47.487 --> 00:03:49.314 Đây là layer mặc định của chúng ta, 00:03:49.314 --> 00:03:52.637 và chúng ta thêm một layer gọi là Blocking Layer (layer chặn). 00:03:52.637 --> 00:03:54.637 Đây là layer mà trên nó 00:03:54.637 --> 00:03:56.637 tất cả các collisions (va chạm) được kiểm tra 00:03:56.637 --> 00:03:58.637 và chúng ta sẽ chọn nó 00:03:58.637 --> 00:04:00.637 cho player, và chúng ta thêm nó theo cách tương tự, 00:04:00.935 --> 00:04:03.707 bằng việc chọn Add Layer và gõ vào đó. 00:04:03.707 --> 00:04:06.264 Chúng ta sẽ tiếp tục chọn blocking layer. 00:04:06.264 --> 00:04:08.264 Chúng ta sẽ thêm một layer nữa 00:04:08.264 --> 00:04:10.264 liên quan đến player, 00:04:10.264 --> 00:04:13.088 chúng ta sẽ thiết lập sorting layer cho sprite renderer. 00:04:13.088 --> 00:04:15.840 Bây giờ chúng ta đã có một số layer xác định trước ở đây, 00:04:15.840 --> 00:04:19.048 chúng ta có Floor layer, nó sẽ là background. 00:04:19.048 --> 00:04:21.048 và Item layer, nó sẽ được hiển thị phía trước floor, 00:04:21.048 --> 00:04:23.483 nó chính là food và soda. 00:04:23.483 --> 00:04:26.457 Và sau đó là Units layer cho player và enemy. 00:04:26.457 --> 00:04:29.356 Chúng ta sẽ chỉ định player cho Units layer. 00:04:29.592 --> 00:04:32.390 Tiếp theo chúng ta thêm hai component 00:04:32.390 --> 00:04:35.580 tới player, chúng ta sẽ thêm box collider 2D 00:04:35.580 --> 00:04:37.580 và rigidbody 2D. 00:04:37.580 --> 00:04:39.580 Box collider 2D sẽ cho phép chúng ta 00:04:39.580 --> 00:04:41.580 kiểm tra collision (va chạm) với người chơi 00:04:41.953 --> 00:04:43.953 Và rigidbody 2D sẽ cho phép chúng ta 00:04:43.953 --> 00:04:46.586 di chuyển player bằng cách sử dụng phương pháp vật lý. 00:04:46.959 --> 00:04:50.012 Chúng ta sẽ cài đặt rigidbody 2D là Is Kinematic 00:04:50.012 --> 00:04:52.012 để cho player không bay lên 00:04:52.012 --> 00:04:54.012 và nhảy lung tung, chúng ta sẽ chỉ cho anh ta di chuyển 00:04:54.012 --> 00:04:56.831 trong không gian cho phép. 00:04:56.831 --> 00:04:59.155 Chúng ta sẽ điều khiển nó bằng script 00:04:59.155 --> 00:05:01.155 và cài đặt nó là Is Kinematic. 00:05:01.446 --> 00:05:03.446 Chúng ta cũng sẽ điều chỉnh kích thước 00:05:03.446 --> 00:05:05.446 của box collider 2D 00:05:05.446 --> 00:05:07.446 làm nó nhỏ hơn chút để player 00:05:07.446 --> 00:05:09.446 sẽ không vô tình va chạm với 00:05:09.446 --> 00:05:11.898 những thứ trong không gian lân cận, 00:05:11.898 --> 00:05:14.391 chỉ khi chúng đang cố gắng để di chuyển vào một không gian 00:05:14.391 --> 00:05:16.507 bị chiếm bởi một collider khác. 00:05:16.507 --> 00:05:18.507 Chúng ta sẽ còn thêm một vài component khác cho player nữa 00:05:18.507 --> 00:05:21.159 nhưng hiện tại bây giờ như thế này là ok. 00:05:21.159 --> 00:05:23.159 Chúng ta sẽ lấy nó 00:05:23.159 --> 00:05:26.763 và kéo vào folder Prefabs để lưu nó lại. 00:05:27.369 --> 00:05:29.253 Bây giờ chúng ta sẽ tạo prefab 00:05:29.253 --> 00:05:31.860 chúng ta tạm thời có thể xóa player từ hierarchy 00:05:31.860 --> 00:05:33.860 và chúng ta sẽ tạo enemy đầu tiên. 00:05:34.151 --> 00:05:37.055 Chúng ta chọn Game Object - Create Empty 00:05:37.055 --> 00:05:39.113 và đặt tên là Enemy1. 00:05:39.113 --> 00:05:42.650 Bây giờ bắt đầu thêm animation cho Enemy1. 00:05:42.650 --> 00:05:44.250 Tôi sẽ quay lại sprites 00:05:44.833 --> 00:05:47.832 shift-click vào frames của animation EnemyIdle 00:05:47.832 --> 00:05:49.159 và thả chúng vào đây. 00:05:50.391 --> 00:05:52.391 Chúng ta sẽ gọi là Enemy1Idle. 00:05:52.659 --> 00:05:54.554 Nó sẽ tự động thêm component 00:05:54.554 --> 00:05:56.554 mà chúng ta cần và chúng ta sẽ thêm 00:05:56.554 --> 00:05:58.554 frame khác của animation này cho nó trông tốt hơn. 00:06:02.071 --> 00:06:04.071 Thêm animation Attack. 00:06:05.981 --> 00:06:07.981 Chúng ta có thể nháy đúp để xem nó hoạt động 00:06:11.265 --> 00:06:12.813 Và của chúng ta đây, trông khá tốt. 00:06:13.975 --> 00:06:18.123 Bây giờ hãy thêm box collider và rigidbody. 00:06:24.389 --> 00:06:26.389 Chúng ta cũng sẽ cài đặt rigidbody cho 00:06:26.389 --> 00:06:28.272 enemy là Is Kinematic 00:06:28.272 --> 00:06:30.543 và chúng ta thêm tag Enemy 00:06:30.543 --> 00:06:33.207 và chỉ định blocking layer. 00:06:33.207 --> 00:06:37.084 Chúng ta cũng sẽ thiết lập sorting layer của sprite renderer là Units. 00:06:41.172 --> 00:06:43.172 Sau khi xong chúng ta có thể kéo thả enemy xuống 00:06:43.172 --> 00:06:45.172 để tạo prefab của enemy đầu tiên. 00:06:48.944 --> 00:06:51.073 Thay vì xóa cái này chúng ta sẽ 00:06:51.073 --> 00:06:53.073 sửa đổi nó để tạo ra enemy thứ hai. 00:06:53.981 --> 00:06:55.981 Đổi tên thành Enemy2. 00:06:59.032 --> 00:07:00.870 Và chúng ta sẽ thả 00:07:00.870 --> 00:07:02.870 frames Enemy2Idle vào. 00:07:12.188 --> 00:07:14.188 Và frame Enemy2Attack. 00:07:20.943 --> 00:07:23.464 Bây giờ khi chúng ta thả animation 00:07:23.464 --> 00:07:26.704 tới enemy chúng ta đã tạo ra một animator controller mới. 00:07:26.704 --> 00:07:30.603 Chúng ta sẽ di chuyển những thứ này tới folder Animator Controllers. 00:07:30.603 --> 00:07:34.260 Tiếp theo chúng ta sẽ mở animator controller của Enemy1 00:07:34.260 --> 00:07:36.260 và chúng ta sẽ thấy bên trong tất cả aniamtion 00:07:36.260 --> 00:07:39.185 mà chúng ta đã thêm vào như là states. 00:07:39.185 --> 00:07:40.732 Bây giờ việc chúng ta cần làm là 00:07:40.732 --> 00:07:43.422 xóa Enemy2 states 00:07:43.422 --> 00:07:45.422 chúng ta shift-click lên từng phần 00:07:45.422 --> 00:07:48.892 và sau đó right-click để xóa chúng. 00:07:49.498 --> 00:07:51.498 Bây giờ nó sẽ hỏi chúng ta có muốn xóa assets đã chọn không 00:07:51.498 --> 00:07:53.498 chúng ta chọn xóa. 00:07:55.093 --> 00:07:57.407 Và việc chúng ta cần làm bây giờ là 00:07:57.407 --> 00:07:59.407 Enemy1 và Enemy2 sẽ chia sẻ 00:07:59.407 --> 00:08:02.800 cùng state giống nhau, chúng sẽ có hai state là 00:08:02.800 --> 00:08:04.730 Idle và Attack. 00:08:04.730 --> 00:08:06.730 Việc chúng ta cần làm bây giờ là tạo 00:08:06.730 --> 00:08:08.730 một animator override controller, 00:08:09.394 --> 00:08:12.734 nó sẽ cho phép chúng ta dùng cùng một state 00:08:12.734 --> 00:08:14.629 và cùng một script điều khiển nó 00:08:14.629 --> 00:08:16.629 nhưng chạy khác animation 00:08:16.629 --> 00:08:18.453 trong mỗi state. 00:08:18.453 --> 00:08:19.950 Chúng ta sẽ chọn 00:08:19.950 --> 00:08:23.629 Create - Animator Override Controller. 00:08:27.367 --> 00:08:29.367 Gọi nó là Enemy2 00:08:29.740 --> 00:08:31.740 Và điều đầu tiên chúng ta cần xác định 00:08:31.740 --> 00:08:34.645 controller nào chúng ta cần overriding (ghi đè), 00:08:34.645 --> 00:08:37.499 chúng ta chọn controller của Enemy1 và thả nó vào. 00:08:39.292 --> 00:08:41.292 Và chúng ta sẽ thấy, 00:08:41.292 --> 00:08:43.951 hai animation ban đầu sẽ chạy, 00:08:43.951 --> 00:08:46.619 Enemy1Idle và Enemy1Attack, 00:08:46.619 --> 00:08:49.206 và chúng ta sẽ ghi đè chúng với 00:08:49.807 --> 00:08:51.807 Enemy2Attack 00:08:54.101 --> 00:08:56.101 và Enemy2Idle. 00:08:58.546 --> 00:09:00.546 Trong Enemy2 chúng ta sẽ thay đổi 00:09:00.546 --> 00:09:02.546 controller của animator thành 00:09:02.546 --> 00:09:05.591 dùng animator override controller. 00:09:11.251 --> 00:09:13.251 Bây giờ chạy thử scene. 00:09:15.907 --> 00:09:16.956 Của chúng ta đây. 00:09:18.419 --> 00:09:22.616 Cuối cùng thả Enemy2 và folder prefabs 00:09:23.897 --> 00:09:25.510 để tạo prefab mới. 00:09:25.510 --> 00:09:28.348 Tiếp theo chúng ta xóa Enemy2 từ hierarchy 00:09:28.348 --> 00:09:30.348 và lưu scene lại. 00:09:31.373 --> 00:09:32.999 Chúng ta gọi nó là Main 00:09:32.999 --> 00:09:35.929 và lưu vào folder Scene trống. 00:09:36.826 --> 00:09:39.291 Bây giờ chúng ta đã tạo được các prefabs cơ bản 00:09:39.291 --> 00:09:41.773 cho Player và Enemy 00:09:41.773 --> 00:09:43.773 Bây giờ chúng ta sẽ tiếp tục tạo 00:09:43.773 --> 00:09:46.680 các prefab khác mà chúng ta cần để bố trí trò chơi. 00:09:46.680 --> 00:09:48.680 Trong video tiếp theo chúng ta sẽ tạo 00:09:48.680 --> 00:09:52.753 floor, wall, food, soda 00:09:52.753 --> 00:09:54.753 và exit prefabs.