1 00:00:02,194 --> 00:00:05,801 Chào mừng trở lại với loạt video game scavengers. 2 00:00:05,801 --> 00:00:07,801 Trong video trước, chúng ta đã xem xét thiết lập 3 00:00:07,801 --> 00:00:10,498 dự án và trình diễn sản phẩm hoàn chỉnh. 4 00:00:11,442 --> 00:00:13,739 Trong video này, chúng ta sẽ tạo animation 5 00:00:13,739 --> 00:00:15,739 cho người chơi (player) và kẻ địch (enemy) 6 00:00:15,739 --> 00:00:17,555 từ sprite sheet 7 00:00:17,555 --> 00:00:21,030 và thiết lập player và enemy prefabs 8 00:00:21,568 --> 00:00:23,568 Hãy tạo một new scene 9 00:00:26,904 --> 00:00:31,072 và chúng ta sẽ bắt đầu tạo player prefab 10 00:00:31,072 --> 00:00:33,341 cùng với animations của player 11 00:00:34,178 --> 00:00:37,309 Chúng ta chọn Game Object - Create Empty 12 00:00:39,328 --> 00:00:41,328 và chúng ta sẽ có bảng Player hiện ra 13 00:00:43,260 --> 00:00:45,777 Trong folder Sprite chúng ta có một sprite sheet 14 00:00:45,777 --> 00:00:48,753 bây giờ chúng ta cắt nó 15 00:00:48,753 --> 00:00:50,387 thành nhiều sprites nhỏ 16 00:00:50,387 --> 00:00:52,934 Để biết thông tin thêm về sprite sheets và sprites 17 00:00:52,934 --> 00:00:54,934 bạn có thể xem ở link bên dưới 18 00:00:55,309 --> 00:00:57,309 Trong trường hợp này chúng ta sẽ lấy 19 00:00:57,309 --> 00:01:00,148 frames đầu tiên 20 00:01:00,148 --> 00:01:01,543 nó là player idle animation, 21 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 22 00:01:03,543 --> 00:01:05,726 và sau đó shift-clicking đến farme cuối cùng mà tôi muốn 23 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 24 00:01:07,726 --> 00:01:09,188 tới player prefab 25 00:01:09,784 --> 00:01:11,386 và sau đó ta đặt cho nó một cái tên 26 00:01:11,386 --> 00:01:14,109 chúng ta sẽ gọi nó là PlayerIdle 27 00:01:14,109 --> 00:01:15,879 Đây sẽ là animation sẽ chạy khi 28 00:01:15,879 --> 00:01:17,792 player không làm bất cứ thứ gì 29 00:01:17,792 --> 00:01:20,467 Chúng ta sẽ đặt cái này vào folder Animations 30 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) 31 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), 32 00:01:25,911 --> 00:01:28,585 nó sẽ hiển thị các frame hiện tại 33 00:01:28,585 --> 00:01:33,106 Và một animator, nó sẽ cho phép chúng ta chạy animation. 34 00:01:33,106 --> 00:01:35,106 Khi chúng ta frames vào 35 00:01:35,106 --> 00:01:37,890 hai components này, nó sẽ yêu cầu chúng ta 36 00:01:37,890 --> 00:01:41,581 lưu animation (cái mà chúng ta đã lưu) vào folder Animations con 37 00:01:41,975 --> 00:01:45,150 Nó cũng tạo ra animator controller, 38 00:01:45,150 --> 00:01:47,150 cho phép chúng ta quản lí 39 00:01:47,150 --> 00:01:48,938 animation đang chạy hiện tại. 40 00:01:48,938 --> 00:01:52,103 Chúng ta sẽ di chuyển nó đến folder Animator Controllers 41 00:01:52,775 --> 00:01:55,244 Và chúng ta sẽ thêm một số animations nữa cho player. 42 00:01:55,907 --> 00:01:57,340 Hãy trở lại sprites. 43 00:01:58,109 --> 00:02:00,493 Và trong trường hợp này tôi sẽ chọn 44 00:02:01,647 --> 00:02:05,141 hai PlayerChop animation frames, 45 00:02:05,141 --> 00:02:06,519 thả chúng vào player, 46 00:02:07,410 --> 00:02:09,410 và chúng ta sẽ đặt tên là PlayerChop. 47 00:02:10,102 --> 00:02:12,860 Chúng ta sẽ đặt nó vào folder Animations. 48 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 49 00:02:18,985 --> 00:02:20,985 một animator controller khác nữa, thay vào đó 50 00:02:20,985 --> 00:02:24,008 sẽ thêm một animation 51 00:02:24,008 --> 00:02:26,249 vào animator controller đã tồn tại trên player. 52 00:02:26,249 --> 00:02:29,117 Chúng ta sẽ làm lại với PlayerHit animation. 53 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. 54 00:02:40,288 --> 00:02:42,626 Và chúng ta có thể thấy PlayerIdle đang chạy. 55 00:02:42,626 --> 00:02:44,626 Bây giờ animation của chúng ta hơi nhanh 56 00:02:44,626 --> 00:02:46,626 nên chúng ta sẽ mở nó 57 00:02:46,626 --> 00:02:50,142 bằng việc click đúp vào animaor controller, 58 00:02:51,527 --> 00:02:53,930 làm rõ trạng thái PlayerIdle 59 00:02:53,930 --> 00:02:56,782 chúng ta chỉ cần cài đặt speed thành 0.5, 60 00:02:56,782 --> 00:02:59,492 nó sẽ chạy với một nửa tốc độ bình thường. 61 00:02:59,492 --> 00:03:01,492 Lưu ý rằng hai animations khác của chúng ta 62 00:03:01,492 --> 00:03:03,128 cũng vừa mới được thêm vào states, 63 00:03:03,128 --> 00:03:05,128 và trong loạt series sau này chúng ta sẽ 64 00:03:05,128 --> 00:03:07,380 học cách để thay đổi 65 00:03:07,380 --> 00:03:09,659 giữa các states bằng script. 66 00:03:10,140 --> 00:03:11,428 Bây giờ hãy kiểm tra nó. 67 00:03:14,255 --> 00:03:15,380 Đây. 68 00:03:17,418 --> 00:03:19,418 Với những animations chudng ta đã tạo cho Player 69 00:03:19,418 --> 00:03:21,418 chúng ta sẽ tiếp tục và áp dụng một tag 70 00:03:21,418 --> 00:03:24,699 cho player tên là Player. 71 00:03:24,699 --> 00:03:26,853 Bây giờ tag Player đã được xác định trước 72 00:03:26,853 --> 00:03:29,440 trong tất cả projects Unity, chúng ta cũng sẽ thêm 73 00:03:29,440 --> 00:03:32,332 vài tag nữa như là food, exit, 74 00:03:32,332 --> 00:03:33,929 enemy và soda. 75 00:03:33,929 --> 00:03:35,929 Vậy là đã xong thêm tag 76 00:03:38,496 --> 00:03:41,653 và gõ vào những trường này. 77 00:03:42,576 --> 00:03:45,362 Chúng ta sẽ cài đặt tag Player 78 00:03:45,362 --> 00:03:47,487 và chúng ta cũng thiết lập layer (lớp). 79 00:03:47,487 --> 00:03:49,314 Đây là layer mặc định của chúng ta, 80 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). 81 00:03:52,637 --> 00:03:54,637 Đây là layer mà trên nó 82 00:03:54,637 --> 00:03:56,637 tất cả các collisions (va chạm) được kiểm tra 83 00:03:56,637 --> 00:03:58,637 và chúng ta sẽ chọn nó 84 00:03:58,637 --> 00:04:00,637 cho player, và chúng ta thêm nó theo cách tương tự, 85 00:04:00,935 --> 00:04:03,707 bằng việc chọn Add Layer và gõ vào đó. 86 00:04:03,707 --> 00:04:06,264 Chúng ta sẽ tiếp tục chọn blocking layer. 87 00:04:06,264 --> 00:04:08,264 Chúng ta sẽ thêm một layer nữa 88 00:04:08,264 --> 00:04:10,264 liên quan đến player, 89 00:04:10,264 --> 00:04:13,088 chúng ta sẽ thiết lập sorting layer cho sprite renderer. 90 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, 91 00:04:15,840 --> 00:04:19,048 chúng ta có Floor layer, nó sẽ là background. 92 00:04:19,048 --> 00:04:21,048 và Item layer, nó sẽ được hiển thị phía trước floor, 93 00:04:21,048 --> 00:04:23,483 nó chính là food và soda. 94 00:04:23,483 --> 00:04:26,457 Và sau đó là Units layer cho player và enemy. 95 00:04:26,457 --> 00:04:29,356 Chúng ta sẽ chỉ định player cho Units layer. 96 00:04:29,592 --> 00:04:32,390 Tiếp theo chúng ta thêm hai component 97 00:04:32,390 --> 00:04:35,580 tới player, chúng ta sẽ thêm box collider 2D 98 00:04:35,580 --> 00:04:37,580 và rigidbody 2D. 99 00:04:37,580 --> 00:04:39,580 Box collider 2D sẽ cho phép chúng ta 100 00:04:39,580 --> 00:04:41,580 kiểm tra collision (va chạm) với người chơi 101 00:04:41,953 --> 00:04:43,953 Và rigidbody 2D sẽ cho phép chúng ta 102 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ý. 103 00:04:46,959 --> 00:04:50,012 Chúng ta sẽ cài đặt rigidbody 2D là Is Kinematic 104 00:04:50,012 --> 00:04:52,012 để cho player không bay lên 105 00:04:52,012 --> 00:04:54,012 và nhảy lung tung, chúng ta sẽ chỉ cho anh ta di chuyển 106 00:04:54,012 --> 00:04:56,831 trong không gian cho phép. 107 00:04:56,831 --> 00:04:59,155 Chúng ta sẽ điều khiển nó bằng script 108 00:04:59,155 --> 00:05:01,155 và cài đặt nó là Is Kinematic. 109 00:05:01,446 --> 00:05:03,446 Chúng ta cũng sẽ điều chỉnh kích thước 110 00:05:03,446 --> 00:05:05,446 của box collider 2D 111 00:05:05,446 --> 00:05:07,446 làm nó nhỏ hơn chút để player 112 00:05:07,446 --> 00:05:09,446 sẽ không vô tình va chạm với 113 00:05:09,446 --> 00:05:11,898 những thứ trong không gian lân cận, 114 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 115 00:05:14,391 --> 00:05:16,507 bị chiếm bởi một collider khác. 116 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 117 00:05:18,507 --> 00:05:21,159 nhưng hiện tại bây giờ như thế này là ok. 118 00:05:21,159 --> 00:05:23,159 Chúng ta sẽ lấy nó 119 00:05:23,159 --> 00:05:26,763 và kéo vào folder Prefabs để lưu nó lại. 120 00:05:27,369 --> 00:05:29,253 Bây giờ chúng ta sẽ tạo prefab 121 00:05:29,253 --> 00:05:31,860 chúng ta tạm thời có thể xóa player từ hierarchy 122 00:05:31,860 --> 00:05:33,860 và chúng ta sẽ tạo enemy đầu tiên. 123 00:05:34,151 --> 00:05:37,055 Chúng ta chọn Game Object - Create Empty 124 00:05:37,055 --> 00:05:39,113 và đặt tên là Enemy1. 125 00:05:39,113 --> 00:05:42,650 Bây giờ bắt đầu thêm animation cho Enemy1. 126 00:05:42,650 --> 00:05:44,250 Tôi sẽ quay lại sprites 127 00:05:44,833 --> 00:05:47,832 shift-click vào frames của animation EnemyIdle 128 00:05:47,832 --> 00:05:49,159 và thả chúng vào đây. 129 00:05:50,391 --> 00:05:52,391 Chúng ta sẽ gọi là Enemy1Idle. 130 00:05:52,659 --> 00:05:54,554 Nó sẽ tự động thêm component 131 00:05:54,554 --> 00:05:56,554 mà chúng ta cần và chúng ta sẽ thêm 132 00:05:56,554 --> 00:05:58,554 frame khác của animation này cho nó trông tốt hơn. 133 00:06:02,071 --> 00:06:04,071 Thêm animation Attack. 134 00:06:05,981 --> 00:06:07,981 Chúng ta có thể nháy đúp để xem nó hoạt động 135 00:06:11,265 --> 00:06:12,813 Và của chúng ta đây, trông khá tốt. 136 00:06:13,975 --> 00:06:18,123 Bây giờ hãy thêm box collider và rigidbody. 137 00:06:24,389 --> 00:06:26,389 Chúng ta cũng sẽ cài đặt rigidbody cho 138 00:06:26,389 --> 00:06:28,272 enemy là Is Kinematic 139 00:06:28,272 --> 00:06:30,543 và chúng ta thêm tag Enemy 140 00:06:30,543 --> 00:06:33,207 và chỉ định blocking layer. 141 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. 142 00:06:41,172 --> 00:06:43,172 Sau khi xong chúng ta có thể kéo thả enemy xuống 143 00:06:43,172 --> 00:06:45,172 để tạo prefab của enemy đầu tiên. 144 00:06:48,944 --> 00:06:51,073 Thay vì xóa cái này chúng ta sẽ 145 00:06:51,073 --> 00:06:53,073 sửa đổi nó để tạo ra enemy thứ hai. 146 00:06:53,981 --> 00:06:55,981 Đổi tên thành Enemy2. 147 00:06:59,032 --> 00:07:00,870 Và chúng ta sẽ thả 148 00:07:00,870 --> 00:07:02,870 frames Enemy2Idle vào. 149 00:07:12,188 --> 00:07:14,188 Và frame Enemy2Attack. 150 00:07:20,943 --> 00:07:23,464 Bây giờ khi chúng ta thả animation 151 00:07:23,464 --> 00:07:26,704 tới enemy chúng ta đã tạo ra một animator controller mới. 152 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. 153 00:07:30,603 --> 00:07:34,260 Tiếp theo chúng ta sẽ mở animator controller của Enemy1 154 00:07:34,260 --> 00:07:36,260 và chúng ta sẽ thấy bên trong tất cả aniamtion 155 00:07:36,260 --> 00:07:39,185 mà chúng ta đã thêm vào như là states. 156 00:07:39,185 --> 00:07:40,732 Bây giờ việc chúng ta cần làm là 157 00:07:40,732 --> 00:07:43,422 xóa Enemy2 states 158 00:07:43,422 --> 00:07:45,422 chúng ta shift-click lên từng phần 159 00:07:45,422 --> 00:07:48,892 và sau đó right-click để xóa chúng. 160 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 161 00:07:51,498 --> 00:07:53,498 chúng ta chọn xóa. 162 00:07:55,093 --> 00:07:57,407 Và việc chúng ta cần làm bây giờ là 163 00:07:57,407 --> 00:07:59,407 Enemy1 và Enemy2 sẽ chia sẻ 164 00:07:59,407 --> 00:08:02,800 cùng state giống nhau, chúng sẽ có hai state là 165 00:08:02,800 --> 00:08:04,730 Idle và Attack. 166 00:08:04,730 --> 00:08:06,730 Việc chúng ta cần làm bây giờ là tạo 167 00:08:06,730 --> 00:08:08,730 một animator override controller, 168 00:08:09,394 --> 00:08:12,734 nó sẽ cho phép chúng ta dùng cùng một state 169 00:08:12,734 --> 00:08:14,629 và cùng một script điều khiển nó 170 00:08:14,629 --> 00:08:16,629 nhưng chạy khác animation 171 00:08:16,629 --> 00:08:18,453 trong mỗi state. 172 00:08:18,453 --> 00:08:19,950 Chúng ta sẽ chọn 173 00:08:19,950 --> 00:08:23,629 Create - Animator Override Controller. 174 00:08:27,367 --> 00:08:29,367 Gọi nó là Enemy2 175 00:08:29,740 --> 00:08:31,740 Và điều đầu tiên chúng ta cần xác định 176 00:08:31,740 --> 00:08:34,645 controller nào chúng ta cần overriding (ghi đè), 177 00:08:34,645 --> 00:08:37,499 chúng ta chọn controller của Enemy1 và thả nó vào. 178 00:08:39,292 --> 00:08:41,292 Và chúng ta sẽ thấy, 179 00:08:41,292 --> 00:08:43,951 hai animation ban đầu sẽ chạy, 180 00:08:43,951 --> 00:08:46,619 Enemy1Idle và Enemy1Attack, 181 00:08:46,619 --> 00:08:49,206 và chúng ta sẽ ghi đè chúng với 182 00:08:49,807 --> 00:08:51,807 Enemy2Attack 183 00:08:54,101 --> 00:08:56,101 và Enemy2Idle. 184 00:08:58,546 --> 00:09:00,546 Trong Enemy2 chúng ta sẽ thay đổi 185 00:09:00,546 --> 00:09:02,546 controller của animator thành 186 00:09:02,546 --> 00:09:05,591 dùng animator override controller. 187 00:09:11,251 --> 00:09:13,251 Bây giờ chạy thử scene. 188 00:09:15,907 --> 00:09:16,956 Của chúng ta đây. 189 00:09:18,419 --> 00:09:22,616 Cuối cùng thả Enemy2 và folder prefabs 190 00:09:23,897 --> 00:09:25,510 để tạo prefab mới. 191 00:09:25,510 --> 00:09:28,348 Tiếp theo chúng ta xóa Enemy2 từ hierarchy 192 00:09:28,348 --> 00:09:30,348 và lưu scene lại. 193 00:09:31,373 --> 00:09:32,999 Chúng ta gọi nó là Main 194 00:09:32,999 --> 00:09:35,929 và lưu vào folder Scene trống. 195 00:09:36,826 --> 00:09:39,291 Bây giờ chúng ta đã tạo được các prefabs cơ bản 196 00:09:39,291 --> 00:09:41,773 cho Player và Enemy 197 00:09:41,773 --> 00:09:43,773 Bây giờ chúng ta sẽ tiếp tục tạo 198 00:09:43,773 --> 00:09:46,680 các prefab khác mà chúng ta cần để bố trí trò chơi. 199 00:09:46,680 --> 00:09:48,680 Trong video tiếp theo chúng ta sẽ tạo 200 00:09:48,680 --> 00:09:52,753 floor, wall, food, soda 201 00:09:52,753 --> 00:09:54,753 và exit prefabs.