-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathNote.txt
More file actions
215 lines (132 loc) · 8.18 KB
/
Copy pathNote.txt
File metadata and controls
215 lines (132 loc) · 8.18 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
1) Import tài nguyên đã thiết kế
2) Vào Folder background rồi - kéo img vào vùng camera
2) Kéo dãn img ra - vào tab game rồi chỉnh free aspect thành FullHD
3) Kéo phi thuyền ship vào Scene tab - và kéo protected vào Scence tab
4) Chọn protected tại sprite để hiện inspect của no chỉnh phần inspect - SpriteMode -
pixelsPerUnit thành 600 để khớp với ship - apply
5) Kéo gameObj protected vào gameObj ship rồi chỉnh thông số xyz của protected về 000 để ship
ở giữa - gọi mới là Shield
6) Dùng animation để xoay gameObj Shield quanh ship
7) Tại Asset tạo folder Animation rồi tạo Folder Shield cho ship
8) Chọn gameObj Shield rồi STRL 6 để mở AnimationTab
9) Tạo bằng nút create - rồi chọn add prop - chọn transform - chọn rotate - đưa tỏ tới 0.15
rồi set z về -97 - add key frame rồi xóa key cuối đi
10) Vào compo Shield rồi chọn Animator rồi bật Apply root motion lên là ok
================================================================================
11) Vào Background - đặt order in layer thành -10
12) Tạo folder sccipt ỏ asset vào script để tạo ship script
13) Script theo kiểu monoBehave nhé và kéo vào compo và dup click để vào IDE
14) Exlain in script and then update speed to 10 to move ship
================================================================================
Fix logic ship move out of boundary
Vector3 TopLeftPoint = Camera.main.ScreenToWorldPoint(new Vector3(Screen.width, Screen.height, 0));
Screen.width và Screen.height là kích thước màn hình tính bằng pixel.
Camera.main.ScreenToWorldPoint(...) chuyển đổi tọa độ từ màn hình (Screen Space) sang thế giới (World Space).
Điểm (Screen.width, Screen.height, 0) đại diện cho góc trên bên phải của màn hình.
TopLeftPoint có tọa độ thực trong không gian 3D Unity.
TopLeftPoint.x là giới hạn bên phải của màn hình trong hệ tọa độ thế giới.
TopLeftPoint.y là giới hạn trên của màn hình trong hệ tọa độ thế giới.
Vì trục x và y có đối xứng qua (0,0), giới hạn bên trái là -TopLeftPoint.x, giới hạn dưới là -TopLeftPoint.y.
Giới hạn vị trí của tàu trong phạm vi màn hình
Vector3 TopLeftPoint = Camera.main.ScreenToWorldPoint(new Vector3(Screen.width, Screen.height,0));
transform.position = new Vector3(
Mathf.Clamp(transform.position.x,TopLeftPoint.x*-1,TopLeftPoint.x),
Mathf.Clamp(transform.position.y,TopLeftPoint.y*-1,TopLeftPoint.y));
Mathf.Clamp(value, min, max):
Nếu value nhỏ hơn min, gán value = min
Nếu value lớn hơn max, gán value = max
Nếu value nằm trong phạm vi [min, max], giữ nguyên.
Tóm tắt
🔹 Chuyển đổi tọa độ từ màn hình sang thế giới để biết giới hạn của màn hình trong hệ tọa độ 3D.
🔹 Giữ tàu trong màn hình bằng cách giới hạn x và y trong phạm vi của TopLeftPoint.
🔹 Sử dụng Mathf.Clamp() để đảm bảo tàu không ra ngoài vùng chơi.
===============================
Tao prefab các viên đạn
Kéo từng hình ảnh sprites bullet lên tab inspect
Có thẻ tắt khung trắng cam bằng nút quả cầu 3 dấu chấm
rồi kéo thả chọn cả cụm
Trục positoin x ghi L(0,4) để phân ra
Bôi đen chọn hết rồi thêm BoxCollider2D hitbox cho viên đạn
Kéo hết vào folder PreFabs để tạo prefab
Time.deltaTime:
Đây là thời gian giữa hai frame liên tiếp, giúp di chuyển mượt mà ở các tốc độ khung hình
khác nhau.
Nếu không dùng Time.deltaTime, tốc độ viên đạn sẽ phụ thuộc vào FPS (khung hình/giây),
gây ra lỗi chạy nhanh hoặc chậm không đều.
Tất cả bullet prefabs đặt overrides applyAll nhé
Thiết lập tất cả
==========================================================
Vô ship script để tạo logic bắn
Tạo 2 hàm move và fire : move di chuyển fire thì bắn đạn bằng khởi tạo prefabs
Kê cái list đạn và tier đạn
Hàm update : Move() ; Fire()
Kéo list prefabs đạn và bullet list của ship script
===========
Viên đạn bắn ra phải biến mất để tránh nặng game - logic xử lý đạn
Idea : Tạo biến khoảng cách để nếu đạn bay quá khoảng cách thì xóa đạn
==== Tiếp tục ci-6
Chú gà từ sprite to tách ra cho nó nhỏ rồi kéo mảnh nhỏ vào hierachy để tạo game obj
sau đó add component BoxCollider2D và Rigidbody2D vào
Animation bay thì CTRL 6 và game object - create - kéo sprite chuỗi vào và thêm sữa xóa
các key frame để có animation cho game obj
BoxCollider 2D bật cái nút EditColider để chịnh khung va chạm
Rigid 2D cho gravity scale là 0 để gà nó bay
Đặt đạn trigger có thể xuyên vật
Vào prefab bullet bôi đen hết rồi tại compo box collider tick cái isTrigger lên
------------------
Lập trình gà đẻ trứng
Tạo chickenscript
Có sử dụng coroutine
Coroutine trong Unity là gì?
Coroutine (hợp tác luồng) là một phương thức đặc biệt trong Unity giúp bạn thực hiện
các tác vụ bất đồng bộ mà không chặn toàn bộ chương trình.
Nó cho phép tạm dừng thực thi tại một số điểm nhất định và tiếp tục chạy ở khung hình
tiếp theo hoặc sau một khoảng thời gian cụ thể.
Tại sao cần Coroutine?
Thông thường, khi bạn chạy một vòng lặp hoặc chờ trong một hàm Update(), Unity sẽ bị
chặn và game có thể bị đơ (freeze). Coroutine giúp chạy nền các tác vụ mà không ảnh hưởng
đến hiệu suất game.Nhưng với Coroutine, game vẫn tiếp tục chạy mà không bị chặn
SpawnEgg()
IEnumerator, cho phép Unity tạm dừng thực thi tại một số điểm mà không cần chặn
toàn bộ chương trình.
3. Instantiate(EggPrefabs, transform.position, Quaternion.identity);
Instantiate: Tạo ra một bản sao của EggPrefabs tại vị trí hiện tại (transform.position).
Quaternion.identity: Giữ nguyên hướng quay của trứng (không xoay).
4. yield return new WaitForSeconds(Random.Range(2, 7));
WaitForSeconds(n): Tạm dừng coroutine trong n giây.
Random.Range(2, 7): Chọn ngẫu nhiên một số từ 2 đến 6 giây
(vì giá trị tối đa của Random.Range dạng int sẽ không bao gồm 7).
Đưa script vào con gà
Keo hinh anh egg và screen de tao game obj trung
add component rigid 2d de co trong luc roi
Tao prefab cho chicken and egg roi sau do keo egg prefab vao chicken script roi
apply all de ap dung cho chick ken prefab
//////////////////////////
Video 6
Thêm hitbox để xử lý vacaham cho phi thuyen = poligon collider 2d componen
poligon collider 2d sẽ bị lem nên phải dùng thêm Composite collider 2d
Thông qua composite Operation merge nha
Composite Colli 2D bật isTrigger lên
Còn tắt gravity nha
THÊM HIT BOX CHO EGG
Dùng capsule collider
Tắt cái box collider nhé và chọn tam tinh để chỉnh kích cỡ bao
Chỉnh ship script để xử lý logic va chạm
Có 1 lỗi là khi viế hàm OnTriggerEnter2D thì bắn đạn ra nó cx nghĩ là
va chạm mà destroy cái ship
====
Chuẩn bị thiết kế cơ chế explosive
Sau khi soạn xong hàm ondestroy để tạo hiệu úng thì
kéo prefab vụ nổ vào ship gameobj từ sprite/toonExplo/prefab
Nổ liên tục thì phải thêm logic nổ 1 lần
bằng var và destroy kèm time
logic trong shipScript
====== End v6
==============================
Lam ga bien mat khi va cham voi dan
Xu ly van de dan va cham voi phi thuyen gay no
Bo sung logic neu trung va ga va cham thi moi no
Kiem tra bang tag
Thiet ke logic va cham khi ga voi vien dan
Nhay dup vao gameObj trong hierachy de tro vao gameObj
Chinh tat ta component collider cua bullet va chicken thanh istrigger