Unity Particle System Component: học từ gốc đến đủ dùng
Minh Khoa
Tác giả
Dành cho người mới học Unity VFX. Viết theo kiểu blog dễ đọc, nhưng vẫn đi qua gần như toàn bộ các phần quan trọng trong Particle System component.
Project hiện tại dùng Unity 6000.3.13f1. Nội dung dưới đây dựa trên Unity Particle System hiện đại trong Unity 6; một vài tên field có thể khác nhẹ nếu bạn mở project bằng phiên bản Unity cũ hơn.
## 1. Particle System là gì?
Particle System là một component dùng để tạo ra rất nhiều “hạt” nhỏ gọi là particle.
Mỗi particle thường chỉ là:
Một tấm ảnh nhỏ quay về camera, ví dụ khói, bụi, ánh sáng, tia lửa.
Hoặc một mesh nhỏ, ví dụ mảnh đá, lá cây, mảnh vỡ.
Một hạt riêng lẻ nhìn rất đơn giản. Nhưng khi Unity sinh ra nhiều hạt, di chuyển chúng, đổi màu chúng, làm chúng mờ dần, xoay, nở ra, va chạm… mắt người sẽ thấy thành hiệu ứng lớn như:
Khói bếp.
Lửa.
Bụi khi nhân vật chạy.
Coin bay ra.
Sao lấp lánh.
Hit effect khi chém trúng quái.
Bong bóng, tuyết, mưa, pháo hoa.
Hãy tưởng tượng Particle System như một cái máy phun confetti. Bạn không điều khiển từng mảnh giấy bằng tay. Bạn chỉnh cái máy: phun bao nhiêu, phun từ đâu, bay nhanh cỡ nào, màu gì, sống bao lâu, chết thì làm gì.
2. Built-in Particle System hay Visual Effect Graph?
Unity có 2 hướng chính để làm particle:
Hệ thống
Khi nào nên dùng
Built-in Particle System
Hiệu ứng vừa và nhỏ, dễ chỉnh trong Inspector, cần script đọc/ghi từng particle, phù hợp mobile và gameplay VFX thường ngày.
Visual Effect Graph
Hiệu ứng rất lớn, hàng trăm nghìn hoặc hàng triệu particle, chạy GPU, phù hợp PC/console/URP/HDRP tùy cấu hình.
Với game kiểu idle/mobile như Sushi Bar Idle, đa số hiệu ứng gameplay nên bắt đầu bằng Built-in Particle System: nhẹ, quen thuộc, dễ prefab, dễ pooling.
3. Mô hình tư duy: Particle System chạy như thế nào?
Một particle thường đi qua vòng đời này:
Emitter sinh particle
↓
Particle nhận giá trị ban đầu
↓
Particle sống trong vài giây
↓
Các module thay đổi nó theo thời gian
↓
Renderer vẽ particle ra màn hình
↓
Particle hết lifetime và biến mất
Ví dụ với khói:
Emission sinh 20 hạt/giây.
Shape cho hạt sinh từ một vòng tròn nhỏ.
Main đặt lifetime 2 giây, speed chậm, màu xám.
Size over Lifetime làm hạt to dần.
Color over Lifetime làm hạt mờ dần.
Noise làm hạt lượn tự nhiên.
Renderer vẽ bằng material khói.
4. Cách tạo Particle System trong Unity
Có 2 cách phổ biến:
Tạo mới: GameObject > Effects > Particle System.
Thêm vào object có sẵn: chọn object, Add Component > Effects > Particle System.
Khi chọn object có Particle System, trong Scene View Unity có bảng preview nhỏ:
Play / Pause / Stop để xem thử.
Playback Speed để tua nhanh/chậm.
Playback Time để kéo thời gian mô phỏng.
Particle Count để biết hiện có bao nhiêu hạt đang sống.
Đây là chỗ bạn chỉnh hiệu ứng như chỉnh một cái nhạc cụ: kéo số, nhìn kết quả, kéo tiếp.
5. Đọc Inspector của Particle System
Particle System trong Inspector được chia thành nhiều khối gọi là module.
Mỗi module phụ trách một nhóm hành vi:
Main: cấu hình tổng và giá trị ban đầu.
Emission: sinh bao nhiêu particle, sinh lúc nào.
Shape: sinh từ hình gì, hướng bay ban đầu.
Color over Lifetime: đổi màu theo thời gian sống.
Size over Lifetime: đổi kích thước theo thời gian sống.
Renderer: vẽ particle ra màn hình bằng material/mesh/billboard.
Một số module có checkbox bật/tắt. Nếu module tắt, phần đó không ảnh hưởng đến particle. Ví dụ tắt Size over Lifetime thì particle không tự phóng to/thu nhỏ theo lifetime nữa.
6. Các kiểu nhập giá trị quan trọng
Nhiều field trong Particle System không chỉ nhận một con số cố định. Unity cho bạn nhiều kiểu nhập:
Kiểu
Ý nghĩa dễ hiểu
Constant
Một giá trị cố định. Ví dụ speed luôn là 5.
Curve
Giá trị thay đổi theo thời gian. Ví dụ lúc đầu nhỏ, giữa to, cuối nhỏ.
Random Between Two Constants
Mỗi particle lấy ngẫu nhiên một số giữa hai giá trị. Ví dụ size từ 0.8 đến 1.2.
Random Between Two Curves
Mỗi particle lấy ngẫu nhiên giữa hai đường cong. Dùng khi muốn hiệu ứng tự nhiên hơn.
Color
Một màu cố định.
Gradient
Màu thay đổi theo thời gian. Ví dụ vàng → cam → trong suốt.
Random Between Two Colors
Mỗi particle chọn màu ngẫu nhiên giữa hai màu.
Random Between Two Gradients
Mỗi particle dùng biến thể ngẫu nhiên giữa hai gradient.
Một quy tắc rất hay:
Over Lifetime nghĩa là thay đổi theo phần trăm tuổi đời của particle.
By Speed nghĩa là thay đổi theo tốc độ của particle.
Rate over Time nghĩa là sinh theo thời gian.
Rate over Distance nghĩa là object di chuyển được bao xa thì sinh bấy nhiêu.
7. Main module: trái tim của hệ thống
Main là module luôn có mặt. Nó quyết định trạng thái ban đầu và hành vi tổng thể của Particle System.
Thuộc tính
Tác dụng
Duration
Thời lượng một chu kỳ chạy của hệ thống. Nếu Looping bật, hết duration thì lặp lại.
Looping
Cho hệ thống chạy lặp mãi. Dùng cho khói, lửa, nước chảy, aura.
Prewarm
Nếu bật cùng Looping, hiệu ứng xuất hiện như đã chạy sẵn một vòng. Rất hữu ích cho lửa/khói không muốn bắt đầu từ trạng thái trống.
Start Delay
Đợi một khoảng thời gian rồi mới bắt đầu phát particle.
Start Lifetime
Particle sống bao lâu. Lifetime ngắn tạo hiệu ứng nhanh/gắt; lifetime dài tạo vệt hoặc khói kéo dài.
Start Speed
Tốc độ ban đầu của particle.
3D Start Size
Cho chỉnh size riêng từng trục X/Y/Z. Nếu tắt, dùng một size chung.
Start Size
Kích thước ban đầu.
3D Start Rotation
Cho chỉnh rotation riêng từng trục. Hay dùng khi render mesh particle.
Start Rotation
Góc xoay ban đầu. Dùng để random texture không bị lặp nhìn giả.
Flip Rotation
Cho một phần particle xoay ngược hướng, giúp chuyển động tự nhiên hơn.
Start Color
Màu ban đầu. Có thể dùng gradient/random color.
Gravity Modifier
Mức độ chịu trọng lực. 0 là không rơi; 1 dùng gravity Physics mặc định; số âm làm bay lên.
Simulation Space
Không gian mô phỏng: Local, World, hoặc Custom.
Simulation Speed
Tốc độ chạy của toàn bộ hệ thống. 0.5 chậm bằng nửa, 2 nhanh gấp đôi.
Delta Time
Dùng thời gian Scaled hoặc Unscaled. Unscaled phù hợp hiệu ứng UI khi game pause.
Scaling Mode
Cách scale Transform ảnh hưởng lên particle: theo hierarchy, local, hoặc chỉ shape.
Play On Awake
Object vừa active là particle tự chạy. Nếu tắt, phải gọi Play() bằng script hoặc trigger thủ công.
Emitter Velocity
Cách Unity tính vận tốc emitter, dùng cho Inherit Velocity và Rate over Distance.
Max Particles
Số particle tối đa sống cùng lúc. Đây là “cầu chì” chống hiệu ứng nổ máy.
Auto Random Seed
Bật thì mỗi lần chạy trông hơi khác; tắt thì hiệu ứng lặp lại y hệt theo Random Seed.
Random Seed
Hạt giống random cố định khi tắt Auto Random Seed. Dùng khi muốn effect deterministic.
Stop Action
Khi particle chết hết thì làm gì: None, Disable, Destroy, hoặc gọi callback.
Culling Mode
Khi off-screen có tiếp tục mô phỏng không. Cực kỳ quan trọng cho performance.
Ring Buffer Mode
Thay vì chết khi hết lifetime, particle cũ có thể chờ được tái sử dụng khi đạt Max Particles.
Local hay World Simulation Space?
Mode
Hiểu đơn giản
Dùng khi
Local
Particle đi theo object cha.
Aura dính vào nhân vật, flame dính vào torch.
World
Particle đã sinh ra thì ở lại trong world, dù emitter di chuyển.
Khói từ xe chạy, bụi chân, vệt di chuyển.
Custom
Particle mô phỏng theo một Transform khác.
Hiệu ứng cần bám một reference riêng.
Mẹo nhớ: nếu nhân vật chạy mà khói phải bị bỏ lại phía sau, dùng World. Nếu hào quang phải dính vào nhân vật, dùng Local.
8. Emission module: sinh bao nhiêu hạt?
Emission quyết định tốc độ và thời điểm sinh particle.
Thuộc tính
Tác dụng
Rate over Time
Sinh particle theo thời gian. Ví dụ 10 nghĩa là khoảng 10 particle mỗi giây.
Rate over Distance
Sinh particle theo quãng đường emitter di chuyển. Dùng rất tốt cho bụi chân, vệt bánh xe, trail khi object chạy.
Bursts
Sinh một cụm particle tại thời điểm cụ thể. Dùng cho nổ, pop, coin burst, hit impact.
Burst Time
Thời điểm burst kể từ lúc hệ thống bắt đầu chạy.
Burst Count
Số particle trong burst.
Burst Cycles
Burst lặp lại bao nhiêu lần.
Burst Interval
Khoảng cách thời gian giữa các cycle của burst.
Burst Probability
Xác suất burst xảy ra. 1 là chắc chắn, 0.5 là 50%.
Ví dụ:
Khói liên tục: Rate over Time = 15, không cần burst.
Nổ nhỏ: Rate over Time = 0, Burst Count = 30.
Bụi chân: Rate over Time = 0, Rate over Distance = 4.
9. Shape module: particle sinh từ đâu?
Shape quyết định vùng sinh particle và hướng vận tốc ban đầu.
Các shape phổ biến
Shape
Dễ hiểu là
Dùng khi
Sphere
Sinh trong hoặc trên một hình cầu.
Aura, explosion tròn, magic orb.
Hemisphere
Nửa hình cầu.
Bụi bay lên từ mặt đất, splash một phía.
Cone
Sinh từ hình nón.
Lửa phun, vòi nước, confetti bắn ra.
Donut
Hình bánh vòng/torus.
Vòng ma thuật, ring aura.
Box
Hộp chữ nhật.
Mưa, tuyết, vùng bụi rộng.
Mesh
Sinh từ mesh được chọn.
Hiệu ứng trên bề mặt model.
Mesh Renderer
Lấy mesh từ object có Mesh Renderer.
Particle bám model đang render.
Skinned Mesh Renderer
Sinh từ mesh có animation xương.
Spark/blood/aura trên nhân vật animated.
Sprite
Sinh từ sprite.
VFX 2D theo hình sprite.
Sprite Renderer
Lấy sprite từ object có Sprite Renderer.
VFX bám sprite trong scene.
Circle
Hình tròn phẳng.
Ring, ripple, shockwave 2D.
Edge
Một đoạn thẳng.
Mưa từ mép màn, line emitter.
Rectangle
Hình chữ nhật phẳng.
Tuyết/mưa theo vùng mặt phẳng.
Thuộc tính shape hay gặp
Thuộc tính
Tác dụng
Radius
Bán kính của sphere/circle/cone/donut.
Radius Thickness
0 sinh trên bề mặt, 1 sinh trong toàn bộ thể tích.
Arc
Chỉ dùng một phần vòng tròn. Ví dụ 180° là nửa vòng.
Mode
Cách Unity phân bố vị trí sinh: random, loop, ping-pong, burst spread.
Spread
Chia vị trí sinh thành các khoảng rời rạc để particle đều hơn hoặc có nhịp.
Speed
Tốc độ điểm sinh chạy quanh arc khi dùng mode loop/ping-pong.
Angle
Góc mở của cone. Góc lớn bắn tỏa rộng, góc nhỏ bắn tập trung.
Length
Độ dài cone khi sinh trong volume.
Emit From
Sinh từ base, volume, edge, shell… tùy shape.
Texture
Dùng texture để tint hoặc loại bỏ vị trí sinh.
Position
Offset vùng sinh so với Transform của Particle System.
Rotation
Xoay vùng sinh.
Scale
Scale vùng sinh.
Align to Direction
Xoay particle theo hướng bay ban đầu. Dùng cho mảnh vỡ, tia, lá.
Randomize Direction
Pha hướng bay với hướng random. Tăng lên để particle tỏa tự nhiên hơn.
Spherize Direction
Làm hướng bay tỏa ra từ tâm như hình cầu.
Randomize Position
Thêm random vị trí sinh, tránh quá đều/giả.
Mẹo: khi effect nhìn “máy móc”, hãy thử random nhẹ Start Size, Start Rotation, Start Lifetime, Randomize Position, hoặc Randomize Direction.
10. Velocity over Lifetime: đổi vận tốc theo tuổi đời
Module này thêm hoặc chỉnh vận tốc khi particle đang sống.
Thuộc tính
Tác dụng
Linear X/Y/Z
Thêm vận tốc tuyến tính theo từng trục. Ví dụ Y dương làm particle bay lên.
Space
Vận tốc theo Local hay World.
Orbital X/Y/Z
Làm particle quay quanh trục, giống xoáy/vòng.
Offset X/Y/Z
Dịch tâm quỹ đạo khi dùng orbital.
Radial
Đẩy particle ra xa hoặc kéo về gần tâm.
Speed Modifier
Nhân tốc độ hiện tại theo thời gian.
Ví dụ:
Khói bay lên: Linear Y dương nhẹ.
Magic swirl: thêm Orbital Y.
Explosion tan ra: Radial dương.
Implosion hút vào: Radial âm.
11. Noise: làm chuyển động tự nhiên
Noise thêm nhiễu/turbulence vào particle. Nếu Velocity là đường đi có chủ ý, Noise là gió, lắc, hỗn loạn, “đời không như spline”.
Thuộc tính
Tác dụng
Separate Axes
Chỉnh noise riêng từng trục.
Strength
Độ mạnh của noise. Cao hơn thì particle lệch xa/mạnh hơn.
Frequency
Tần suất đổi hướng. Thấp thì mềm; cao thì rung nhanh/gắt.
Scroll Speed
Làm trường noise trôi theo thời gian, tạo cảm giác sống hơn.
Damping
Giữ noise ổn định hơn khi đổi frequency/strength.
Octaves
Số lớp noise chồng lên nhau. Nhiều lớp đẹp hơn nhưng tốn hơn.
Octave Multiplier
Lớp noise sau yếu đi bao nhiêu.
Octave Scale
Lớp noise sau có frequency khác bao nhiêu.
Quality
Chất lượng noise. Thấp nhẹ hơn; cao đẹp hơn nhưng tốn hơn.
Remap
Ánh xạ lại giá trị noise sang range khác.
Remap Curve
Đường cong để biến đổi noise output.
Position Amount
Noise ảnh hưởng lên vị trí bao nhiêu.
Rotation Amount
Noise ảnh hưởng lên xoay bao nhiêu.
Size Amount
Noise ảnh hưởng lên size bao nhiêu.
Mẹo mobile: chỉ bật noise khi thật sự cần. Octaves cao có thể đắt.
12. Limit Velocity over Lifetime: giới hạn tốc độ
Module này giống “phanh” hoặc “ma sát”.
Thuộc tính
Tác dụng
Separate Axes
Giới hạn tốc độ riêng X/Y/Z.
Speed
Tốc độ tối đa. Particle vượt quá sẽ bị giảm.
Space
Giới hạn theo local/world khi tách trục.
Dampen
Mức giảm tốc khi vượt limit.
Drag
Lực cản tuyến tính, làm particle chậm dần.
Multiply by Size
Particle lớn bị drag mạnh hơn.
Multiply by Velocity
Particle nhanh bị drag mạnh hơn.
Dùng cho:
Bụi hoặc khói ban đầu bật nhanh rồi chậm lại.
Mảnh vụn không bay vô hạn.
Magic particles muốn trôi chậm dần.
13. Inherit Velocity: kế thừa vận tốc
Module này thường dùng cho Sub Emitters. Nó cho particle con kế thừa vận tốc từ particle cha hoặc emitter cha.
Thuộc tính
Tác dụng
Mode: Current
Mỗi frame particle tiếp tục nhận vận tốc hiện tại của emitter/parent. Nếu parent chậm lại, particle cũng chậm theo.
Mode: Initial
Chỉ nhận vận tốc lúc particle sinh ra. Sau đó tự bay riêng.
Multiplier
Tỷ lệ kế thừa. 0 không kế thừa, 1 kế thừa đủ, 0.5 kế thừa một nửa.
Ví dụ: xe chạy tạo khói. Khói có thể kế thừa một chút vận tốc xe để trông tự nhiên hơn, nhưng không nên kế thừa quá nhiều nếu muốn khói bị bỏ lại phía sau.
14. Lifetime by Emitter Speed: sống lâu theo tốc độ emitter
Module này chỉnh Start Lifetime dựa vào tốc độ của emitter khi particle được sinh ra.
Thuộc tính
Tác dụng
Multiplier
Hệ số nhân lifetime. Có thể là constant, curve, random constants, random curves.
Speed Range
Khoảng tốc độ emitter được map vào curve multiplier.
Ví dụ:
Nhân vật chạy nhanh thì bụi sống lâu hơn.
Object đứng yên thì particle gần như không xuất hiện hoặc chết nhanh.
15. Force over Lifetime: tác dụng lực theo thời gian
Module này thêm lực vào particle, giống gió, hút, đẩy.
Thuộc tính
Tác dụng
X/Y/Z
Lực theo từng trục.
Space
Lực theo local hoặc world.
Randomize
Khi dùng random between two constants/curves, mỗi frame chọn hướng lực mới trong range, tạo chuyển động hỗn loạn hơn.
Khác với Velocity over Lifetime, Force giống gia tốc: nó làm vận tốc thay đổi dần theo thời gian.
16. Color over Lifetime: đổi màu/mờ dần theo tuổi đời
Đây là module cực kỳ hay dùng.
Thuộc tính
Tác dụng
Color
Gradient màu/alpha theo lifetime của particle. Bên trái là lúc mới sinh, bên phải là lúc sắp chết.
Ví dụ:
Lửa: vàng sáng → cam → đỏ tối → trong suốt.
Khói: xám nhạt alpha cao → xám đậm alpha thấp → trong suốt.
Spark: trắng/vàng rất sáng → cam → biến mất.
Mẹo quan trọng: muốn particle biến mất mềm, hãy kéo alpha về 0 ở cuối gradient.
17. Color by Speed: đổi màu theo tốc độ
Module này đổi màu dựa trên tốc độ hiện tại.
Thuộc tính
Tác dụng
Color
Gradient màu theo speed.
Speed Range
Tốc độ thấp/cao tương ứng với đầu/cuối gradient.
Ví dụ:
Particle bay nhanh thì sáng/vàng hơn.
Particle chậm lại thì chuyển đỏ/tối.
Dùng cho slash, spark, speed trail.
18. Size over Lifetime: đổi kích thước theo tuổi đời
Module này gần như luôn xuất hiện trong effect đẹp.
Thuộc tính
Tác dụng
Separate Axes
Chỉnh size riêng từng trục.
Size
Curve size theo lifetime.
Ví dụ curve:
Smoke: nhỏ lúc đầu → to dần → mờ biến mất.
Hit flash: to rất nhanh → nhỏ/mất nhanh.
Bubble: phình nhẹ → vỡ.
Một công thức dễ dùng:
Start nhỏ → giữa lớn → cuối giữ lớn hoặc giảm nhẹ
Alpha cuối = 0
19. Size by Speed: đổi kích thước theo tốc độ
Thuộc tính
Tác dụng
Separate Axes
Chỉnh size riêng từng trục.
Size
Curve size theo speed.
Speed Range
Tốc độ thấp/cao tương ứng với đầu/cuối curve.
Dùng khi muốn particle nhanh thì dài/to hơn, particle chậm thì nhỏ lại.
20. Rotation over Lifetime: xoay theo tuổi đời
Thuộc tính
Tác dụng
Separate Axes
Xoay riêng X/Y/Z.
Angular Velocity
Tốc độ xoay, tính bằng độ/giây.
Dùng cho:
Spark xoay.
Lá rơi xoay.
Coin/mảnh vụn quay.
Texture khói random xoay chậm để đỡ lặp.
21. Rotation by Speed: xoay theo tốc độ
Thuộc tính
Tác dụng
Separate Axes
Xoay riêng từng trục.
Angular Velocity
Tốc độ xoay dựa theo speed.
Speed Range
Khoảng speed map vào curve xoay.
Ví dụ: mảnh vỡ bay nhanh thì xoay nhanh, chậm lại thì xoay chậm.
22. External Forces: chịu ảnh hưởng từ lực bên ngoài
Module này cho Particle System nhận tác động từ Wind Zone hoặc Particle System Force Field.
Thuộc tính
Tác dụng
Multiplier
Nhân độ mạnh lực ngoài.
Influence Filter
Chọn force field bằng Layer Mask hoặc danh sách cụ thể.
List
Danh sách force field ảnh hưởng đến hệ thống.
Influence Mask
Layer mask quyết định force field nào ảnh hưởng.
Dùng cho:
Khói bị gió thổi.
Magic field hút/đẩy particle.
Vùng vortex làm particle xoáy.
23. Collision: particle va chạm
Collision cho particle phản ứng với mặt phẳng hoặc collider trong scene.
Type
Type
Ý nghĩa
Planes
Va chạm với các mặt phẳng do bạn chỉ định. Nhẹ hơn, kiểm soát tốt.
World
Va chạm với collider thật trong world, có mode 2D/3D. Thực tế hơn nhưng tốn hơn.
Thuộc tính Planes
Thuộc tính
Tác dụng
Planes
Danh sách Transform làm mặt phẳng va chạm.
Visualization
Hiển thị plane dạng wireframe hoặc solid trong Scene View.
Scale Plane
Scale hình preview của plane.
Dampen
Particle mất bao nhiêu tốc độ sau va chạm.
Bounce
Particle bật lại mạnh bao nhiêu.
Lifetime Loss
Mất bao nhiêu phần lifetime khi va chạm.
Min Kill Speed
Sau va chạm nếu chậm hơn mức này thì particle bị kill.
Max Kill Speed
Nếu nhanh hơn mức này thì particle bị kill.
Radius Scale
Scale bán kính va chạm của particle cho khớp hình ảnh.
Send Collision Messages
Cho script nhận OnParticleCollision.
Visualize Bounds
Hiển thị bounds va chạm của từng particle.
Thuộc tính World
Thuộc tính
Tác dụng
Collision Mode
Chọn va chạm 2D hoặc 3D.
Dampen, Bounce, Lifetime Loss
Tương tự Planes.
Min/Max Kill Speed
Kill particle theo tốc độ sau va chạm.
Radius Scale
Cỡ collider ảo của particle.
Collision Quality
High chính xác nhất nhưng tốn nhất; Medium/Low nhẹ hơn cho static colliders.
Collides With
Layer particle được phép va chạm.
Max Collision Shapes
Số collision shape tối đa được xét.
Enable Dynamic Colliders
Cho va chạm với collider động. Tốn hơn static.
Voxel Size
Kích thước grid cache khi dùng Medium/Low. Nhỏ hơn chính xác hơn nhưng tốn bộ nhớ hơn.
Collider Force
Particle tác dụng lực lên collider vật lý.
Multiply by Collision Angle
Lực phụ thuộc góc va chạm.
Multiply by Particle Speed
Particle nhanh đẩy mạnh hơn.
Multiply by Particle Size
Particle lớn đẩy mạnh hơn.
Send Collision Messages
Cho script nhận va chạm.
Visualize Bounds
Xem bounds va chạm trong Scene View.
Mẹo performance: nếu chỉ cần particle biến mất khi chạm đất phẳng, dùng Planes thay vì World.
24. Triggers: particle đi vào/ra vùng trigger
Triggers không giống Collision. Nó cho bạn xử lý particle khi particle:
Đang ở trong collider.
Đang ở ngoài collider.
Vừa đi vào collider.
Vừa đi ra khỏi collider.
Thuộc tính
Tác dụng
Inside
Hành động khi particle đang nằm trong collider.
Outside
Hành động khi particle đang nằm ngoài collider.
Enter
Hành động ở frame particle vừa đi vào collider.
Exit
Hành động ở frame particle vừa đi ra collider.
Collider Query Mode
Có lấy thông tin collider particle tương tác hay không. Disabled nhẹ nhất.
Radius Scale
Scale bounds trigger của particle.
Visualize Bounds
Hiển thị bounds trigger trong Scene View.
Các hành động thường có:
Action
Ý nghĩa
Callback
Đưa particle vào danh sách để script xử lý bằng OnParticleTrigger().
Kill
Xóa particle.
Ignore
Bỏ qua.
Ví dụ: particle “lá rơi” đi vào vùng nước thì đổi hiệu ứng, hoặc snowflake đi vào trigger gần camera thì biến mất.
25. Sub Emitters: particle sinh particle khác
Sub Emitters cho một particle cha tạo ra Particle System khác ở vị trí của nó.
Ví dụ:
Viên đạn bay, khi va chạm sinh vụ nổ.
Firework bay lên, khi chết sinh chùm pháo hoa.
Spark chạm đất sinh khói nhỏ.
Thuộc tính
Tác dụng
Spawn condition
Khi nào particle cha sinh particle con.
Inherit
Particle con kế thừa thuộc tính gì từ particle cha.
Emit Probability
Xác suất sinh sub emitter. 0 không sinh, 1 luôn sinh.
Spawn condition
Điều kiện
Ý nghĩa
Birth
Sinh sub emitter khi particle cha được sinh ra.
Collision
Sinh khi particle cha va chạm.
Death
Sinh khi particle cha chết.
Trigger
Sinh khi particle cha tương tác trigger.
Manual
Chỉ sinh khi script gọi ParticleSystem.TriggerSubEmitter.
Cảnh báo nhẹ: Sub Emitter rất dễ nhân số particle lên cực nhanh. Một particle sinh 10 particle, rồi mỗi particle lại sinh tiếp… chiếc máy nướng FPS bắt đầu hoạt động.
26. Texture Sheet Animation: animate texture của particle
Particle không nhất thiết là một ảnh tĩnh. Module này cho texture được chia thành nhiều frame, rồi particle phát frame như animation.
Grid mode
Thuộc tính
Tác dụng
Tiles
Chia texture thành bao nhiêu cột/hàng. Ví dụ spritesheet 4x4.
Animation
Whole Sheet chạy toàn bộ sheet; Single Row chỉ chạy một hàng.
Time Mode: Lifetime
Chọn frame dựa trên tuổi đời particle.
Time Mode: Speed
Chọn frame dựa trên tốc độ particle.
Time Mode: FPS
Chạy theo số frame/giây.
Row Mode
Chọn hàng cụ thể, random hàng, hoặc theo mesh index.
Random Row
Mỗi particle random một hàng khi dùng Single Row.
Row
Chọn hàng cố định.
Frame over Time
Curve quyết định frame tăng theo thời gian.
Start Frame
Frame bắt đầu. Có thể random để particle không đồng bộ quá máy móc.
Cycles
Animation lặp bao nhiêu lần trong lifetime.
Affected UV Channels
UV stream nào bị module này ảnh hưởng.
Sprites mode
Thuộc tính
Tác dụng
Frame over Time
Chọn sprite frame theo thời gian.
Start Frame
Sprite frame ban đầu.
Cycles
Số lần lặp animation.
Enabled UV Channels
UV channel được dùng.
Dùng cho:
Nổ dạng flipbook.
Lửa hoạt hình.
Smoke flipbook.
Magic rune animating.
27. Lights: particle phát sáng thật
Module này gắn real-time Light vào một phần particle.
Thuộc tính
Tác dụng
Light
Prefab light dùng cho particle.
Ratio
Tỷ lệ particle có light. 0.1 nghĩa là khoảng 10%.
Random Distribution
Bật: random particle có light; tắt: phân bố theo chu kỳ.
Use Particle Color
Light lấy màu từ particle.
Size Affects Range
Particle lớn làm range light lớn hơn.
Alpha Affects Intensity
Particle mờ thì light yếu đi.
Range Multiplier
Curve nhân range light theo lifetime.
Intensity Multiplier
Curve nhân intensity light theo lifetime.
Maximum Lights
Giới hạn số light tối đa để tránh tụt FPS.
Mẹo mobile: real-time lights rất đắt. Nếu chỉ cần glow, thường dùng material additive hoặc sprite glow rẻ hơn.
28. Trails: vệt kéo phía sau particle
Trails cho particle để lại vệt phía sau.
Thuộc tính
Tác dụng
Mode: Particle
Mỗi particle có trail riêng.
Mode: Ribbon
Nối các particle thành ribbon dựa theo tuổi.
Ratio
Tỷ lệ particle có trail.
Lifetime
Trail vertex sống bao lâu, thường tính theo lifetime particle.
Minimum Vertex Distance
Particle đi bao xa thì trail thêm một vertex mới.
World Space
Trail vertex nằm lại trong world, không bị kéo theo object.
Die With Particles
Particle chết thì trail biến mất ngay; nếu tắt, trail tự tàn theo lifetime.
Ribbon Count
Số ribbon khi dùng ribbon mode.
Split Sub Emitter Ribbons
Với sub emitter, particle cùng parent dùng chung ribbon.
Texture Mode
Cách texture dàn trên trail: stretch, tile, repeat per segment, distribute per segment.
Size affects Width
Particle lớn làm trail rộng hơn.
Size affects Lifetime
Particle lớn làm trail sống lâu hơn.
Inherit Particle Color
Trail lấy màu từ particle.
Color over Lifetime
Màu toàn trail theo tuổi particle.
Width over Trail
Độ rộng trail theo chiều dài trail.
Color over Trail
Màu trail theo chiều dài trail.
Generate Lighting Data
Tạo normal/tangent để trail nhận lighting.
Shadow Bias
Dịch shadow để giảm artifact.
Dùng cho:
Slash trail.
Sao băng.
Spark kéo vệt.
Coin sparkle.
29. Custom Data: dữ liệu riêng cho particle
Module này cho bạn thêm dữ liệu riêng vào mỗi particle qua 2 kênh:
Custom1
Custom2
Dữ liệu này thường dùng cho shader hoặc gameplay đặc biệt.
Thuộc tính
Tác dụng
Mode: Disabled
Không dùng custom data.
Mode: Vector
Dữ liệu dạng vector tối đa 4 component: X/Y/Z/W.
Mode: Color
Dữ liệu dạng màu/gradient HDR.
Number of Components
Số component vector được dùng, từ 1 đến 4.
X/Y/Z/W
Curve hoặc random value cho từng component.
Color
Màu/gradient/custom color data.
Ví dụ nâng cao:
Shader đọc Custom1.x để dissolve particle.
Shader đọc Custom1.y để chọn biến thể noise.
Gameplay dùng custom data để lưu “nhiệt độ”, “damage scale”, hoặc “id”.
Lưu ý: nếu bạn muốn set custom data hoàn toàn bằng script, Unity khuyến nghị tắt module Custom Data.
30. Renderer: particle được vẽ ra sao?
Renderer là module quyết định hình ảnh cuối cùng. Particle có thể đang bay rất hay, nhưng Renderer sai material/sort mode thì nhìn vẫn hỏng.
Thuộc tính
Tác dụng
Render Mode: Billboard
Particle là quad luôn quay theo hướng alignment. Dùng nhiều nhất.
Render Mode: Stretched Billboard
Particle bị kéo dài theo camera/velocity. Dùng cho speed line, rain, spark nhanh.
Render Mode: Horizontal Billboard
Quad nằm song song mặt phẳng XZ.
Render Mode: Vertical Billboard
Quad dựng đứng theo trục Y và quay về camera.
Render Mode: Mesh
Particle render bằng mesh 3D.
Render Mode: None
Không vẽ particle, thường dùng khi chỉ muốn vẽ Trails.
Normal Direction
Cách tính lighting cho billboard: giống cầu hay mặt phẳng.
Material
Material chính để vẽ particle. Đây là nơi shader/blend mode phát huy tác dụng.
Trail Material
Material dùng cho trails.
Sort Mode
Thứ tự vẽ particle trong cùng hệ thống: by distance, oldest, youngest, by depth…
Sorting Fudge
Bias thứ tự sort giữa Particle System và transparent object khác.
Min Particle Size
Kích thước nhỏ nhất trên viewport.
Max Particle Size
Kích thước lớn nhất trên viewport.
Render Alignment
Particle quay theo camera, world, local, facing, hoặc velocity.
Enable Mesh GPU Instancing
Khi render mesh particle, dùng GPU instancing nếu shader hỗ trợ.
Flip
Mirror một phần particle theo trục để tạo biến thể.
Allow Roll
Cho particle camera-facing xoay quanh trục camera. Tắt hữu ích trong VR.
Pivot
Dời tâm xoay của particle.
Visualize Pivot
Hiện pivot trong Scene View.
Masking
Particle tương tác với Sprite Mask: không mask, visible inside, visible outside.
Apply Active Color Space
Khi Linear Color Space, chuyển màu particle từ Gamma trước khi gửi GPU.
Custom Vertex Streams
Chọn dữ liệu particle gửi vào shader. Rất quan trọng khi viết shader custom.
Cast Shadows
Particle có đổ bóng không.
Shadow Bias
Giảm artifact bóng của billboard/trail.
Motion Vectors
Có ghi motion vector cho renderer không.
Receive Shadows
Particle có nhận bóng không. Thường chỉ áp dụng tốt với opaque material.
Sorting Layer ID
Sorting layer của renderer, rất quan trọng trong 2D.
Order in Layer
Thứ tự trong sorting layer.
Light Probes
Cách particle nhận lighting từ light probes.
Reflection Probes
Cách nhận reflection probe.
Anchor Override
Transform dùng làm điểm nội suy probe.
Stretched Billboard settings
Thuộc tính
Tác dụng
Camera Scale
Kéo particle theo chuyển động camera.
Velocity Scale
Kéo particle theo tốc độ.
Length Scale
Kéo theo size hiện tại dọc hướng velocity.
Freeform Stretching
Giữ stretch đẹp hơn khi nhìn head-on.
Rotate With Stretch
Xoay particle theo hướng stretch.
Mesh render settings
Thuộc tính
Tác dụng
Mesh Distribution: Uniform Random
Random mesh đều nhau.
Mesh Distribution: Non-uniform Random
Random theo trọng số.
Mesh Weightings
Mesh nào có trọng số cao hơn thì xuất hiện nhiều hơn.
Mẹo: nếu particle không hiện, kiểm tra Renderer > Material đầu tiên. Rất nhiều lỗi particle “mất tích” là do material/shader/blend/sorting.
31. Particle System Force Field component
Đây không phải module nằm trong Particle System, mà là component riêng để tạo vùng lực ảnh hưởng lên particle khi External Forces cho phép.
Nhóm
Thuộc tính
Tác dụng
Shape
Shape
Hình vùng ảnh hưởng.
Shape
Start Range
Vùng trong bắt đầu có ảnh hưởng.
Shape
End Range
Vùng ngoài kết thúc ảnh hưởng.
Shape
Direction X/Y/Z
Lực tuyến tính theo trục.
Gravity
Strength
Độ hút particle về focal point.
Gravity
Gravity Focus
Điểm hút nằm ở tâm hay rìa shape.
Rotation
Speed
Tốc độ xoáy quanh vortex.
Rotation
Attraction
Độ kéo particle vào chuyển động xoáy.
Rotation
Rotation Randomness
Random trục xoáy.
Drag
Strength
Lực cản làm particle chậm lại.
Drag
Multiply Drag by Size
Particle lớn chịu drag mạnh hơn.
Drag
Multiply Drag by Velocity
Particle nhanh chịu drag mạnh hơn.
Vector Field
Volume Texture
Texture 3D chứa vector field.
Vector Field
Speed
Độ mạnh khi particle đi qua vector field.
Vector Field
Attraction
Độ kéo particle vào chuyển động vector field.
32. Điều khiển Particle System bằng C
ParticleSystem là component trong UnityEngine.
Ví dụ cơ bản:
using UnityEngine;
public class ParticleExample : MonoBehaviour
{
[SerializeField] private ParticleSystem effect;
public void PlayEffect()
{
effect.Play();
}
public void StopEffect()
{
effect.Stop();
}
}
Bật/tắt module bằng script
Các module trong script là struct đặc biệt. Bạn cần lấy module ra biến local rồi set:
var emission = effect.emission;
emission.enabled = true;
emission.rateOverTime = 20f;
Không viết như thế này:
// Không compile:
// effect.emission.enabled = true;
Một số API hay dùng
API
Tác dụng
Play()
Chạy particle.
Pause()
Tạm dừng.
Stop()
Dừng.
Clear()
Xóa particle đang sống.
Emit(count)
Sinh ngay một số particle.
Simulate(time)
Mô phỏng tua tới một thời điểm.
IsAlive()
Kiểm tra còn particle sống hoặc sẽ sinh tiếp không.
particleCount
Số particle hiện đang sống.
TriggerSubEmitter()
Kích hoạt sub emitter thủ công.
33. Công thức thực chiến cho một số effect
Khói bếp mềm
Module
Gợi ý
Main
Start Lifetime 2-4s, Start Speed thấp, Simulation Space = World.
Emission
Rate over Time 5-20.
Shape
Circle hoặc Cone nhỏ.
Velocity over Lifetime
Y dương nhẹ.
Noise
Strength thấp-vừa, Frequency thấp.
Size over Lifetime
Nhỏ → lớn dần.
Color over Lifetime
Xám nhạt alpha cao → alpha 0.
Renderer
Material smoke mềm, transparent/additive tùy style.
Spark khi nhận thưởng coin
Module
Gợi ý
Main
Lifetime 0.3-0.8s, speed random.
Emission
Burst 10-30, Rate over Time 0.
Shape
Sphere/Circle nhỏ.
Color over Lifetime
Vàng/trắng → trong suốt.
Size over Lifetime
To nhanh rồi nhỏ/mất.
Trails
Ratio thấp-vừa nếu muốn lấp lánh.
Renderer
Additive material.
Bụi chân khi nhân vật chạy
Module
Gợi ý
Main
Simulation Space = World, Lifetime 0.4-1s, Gravity nhẹ.
Emission
Rate over Distance thay vì Rate over Time.
Shape
Circle/Edge ở chân.
Velocity over Lifetime
Đẩy ra ngang và lên nhẹ.
Noise
Rất nhẹ.
Size over Lifetime
Nhỏ → to → mờ.
Color over Lifetime
Nâu/xám → alpha 0.
Hit impact nhanh
Module
Gợi ý
Main
Lifetime rất ngắn 0.1-0.4s.
Emission
Burst một lần.
Shape
Cone hoặc Sphere.
Start Speed
Khá cao, random.
Color over Lifetime
Trắng/vàng sáng → alpha 0.
Size over Lifetime
Pop nhanh rồi biến mất.
Renderer
Additive hoặc alpha blend tùy style.
34. Checklist debug khi particle không đúng ý
Triệu chứng
Kiểm tra
Không thấy particle
Play On Awake, Emission, Renderer Material, layer/camera/sorting, alpha trong color.
Particle sinh quá ít
Rate over Time, Bursts, Max Particles, lifetime quá ngắn.
Particle sinh quá nhiều
Rate, Bursts, Sub Emitters, Looping, Max Particles.
Hiệu ứng bị kéo theo object sai ý
Simulation Space: thử World thay vì Local.
Particle bị cắt khi ra ngoài màn/camera
Bounds/culling, Culling Mode, material/sorting.
Nhìn quá đều/giả
Random Start Size, Start Lifetime, Start Rotation, thêm nhẹ Noise.
Tụt FPS
Giảm Max Particles, giảm overdraw/size, tắt Lights, giảm Collision, giảm Noise Octaves, hạn chế Sub Emitters.
Particle 2D nằm sai layer
Renderer > Sorting Layer ID và Order in Layer.
Transparent sort sai
Sort Mode, Sorting Fudge, material render queue, sorting layer.
35. Checklist tối ưu performance
Particle đẹp nhưng rất dễ tốn tài nguyên vì overdraw và số lượng hạt.
Ưu tiên kiểm tra:
Max Particles có quá cao không?
Particle có quá to, phủ nhiều màn hình không?
Material có additive/transparent gây overdraw nặng không?
Có bật Collision World High không?
Có quá nhiều Sub Emitters không?
Có bật Lights cho nhiều particle không?
Noise Octaves có cao không?
Có nhiều Particle System chạy loop dù đang off-screen không?
Có pooling effect thay vì instantiate/destroy liên tục chưa?
Có tắt object/effect khi không dùng không?
Với mobile idle game, thường nên:
Dùng sprite/material fake glow thay vì real-time light.
Dùng burst nhỏ, lifetime ngắn.
Dùng pooling cho prefab effect.
Hạn chế collision thật.
Test trên device thật, không chỉ trong Editor.
36. Lộ trình học đề xuất
Nếu bạn mới học, đừng bật tất cả module cùng lúc. Học theo thứ tự này sẽ dễ thấm hơn: