GameObject, Component, Scene và Prefab trong Unity là gì?
Nếu bạn mới mở Unity lần đầu, cảm giác rối là chuyện rất bình thường. Trên màn hình có Scene, Game, Hierarchy, Inspector, Project, Console... rồi trong tài liệu lại xuất hiện thêm GameObject, Component, Prefab, Asset, Script. Nhìn qua thì giống như có quá nhiều thứ cần nhớ cùng lúc. Ở bài này, Asceno muốn chia sẻ lại những khái niệm nền tảng nhất theo cách dễ hình dung hơn. Không cần học thuộc định nghĩa như trong sách. Chỉ cần hiểu mỗi phần đang đóng vai trò gì trong project, bạn sẽ thấy Unity dễ tiếp cận hơn rất nhiều. Nếu bài trước chúng ta đã nói Unity là gì, thì bài này giống như bước vào xưởng làm game và nhìn từng khu vực bên trong: đâu là màn chơi, đâu là đối tượng, đâu là chức năng gắn vào đối tượng, và đâu là mẫu có thể tái sử dụng nhiều lần.
1. Vì sao nên hiểu các khái niệm cơ bản này trước?
Trong Unity, rất nhiều thao tác hằng ngày xoay quanh bốn khái niệm: Scene, GameObject, Component và Prefab. Bạn tạo một màn chơi mới là làm việc với Scene. Bạn kéo nhân vật, camera, ánh sáng hay nút bấm vào là đang làm việc với GameObject. Bạn gắn vật lý, âm thanh, hình ảnh, script lên đối tượng là đang dùng Component. Bạn muốn tái sử dụng một enemy, một đồng coin hay một popup nhiều lần thì thường sẽ dùng Prefab.
Nói cách khác, đây là những “viên gạch đầu tiên” của Unity. Nếu hiểu sai từ đầu, về sau rất dễ bị rối: không biết vì sao object không chạy, vì sao script không gọi, vì sao sửa Prefab rồi Scene không đổi, hoặc vì sao object trong Project khác object đang nằm trong Hierarchy.
Cách Asceno hay hình dung
Hãy xem Unity như một sân khấu. Scene là sân khấu hoặc màn diễn. GameObject là mọi thứ đặt trên sân khấu. Component là chức năng của từng thứ đó. Prefab là mẫu dựng sẵn để mang ra dùng lại ở nhiều màn khác nhau.
2. Scene là gì trong Unity?
Scene có thể hiểu đơn giản là một màn chơi, một không gian, một menu, một phòng, hoặc một phần riêng trong ứng dụng. Khi bạn mở Unity và nhìn vào cửa sổ Scene View, bạn đang xem nội dung của một Scene nào đó.
Với game nhỏ, bạn có thể chỉ có một Scene duy nhất. Nhưng với sản phẩm thực tế, project thường có nhiều Scene khác nhau để dễ quản lý. Ví dụ một app học tập 3D có thể có LoginScene, MainMenuScene, CourseRoomScene, ShowroomScene và QuizScene. Một game mobile có thể có SplashScene, HomeScene, GameplayScene và ResultScene.
Ví dụ dễ hiểu
- MainMenu Scene: nơi đặt nút Play, Settings, Exit.
- Gameplay Scene: nơi nhân vật chạy, nhảy, nhặt coin, gặp quái.
- Battle Scene: nơi xử lý chiến đấu.
- Showroom3D Scene: nơi người dùng đi lại trong không gian 3D.
- Loading Scene: nơi hiển thị tiến trình tải dữ liệu hoặc asset.
Kinh nghiệm nhỏ từ Asceno
Đừng cố nhét mọi thứ vào một Scene ngay từ đầu. Khi project lớn hơn, việc tách Scene hợp lý sẽ giúp dễ debug, dễ test và dễ tối ưu hơn. Tuy nhiên, cũng đừng tách quá vụn nếu bạn chưa có lý do rõ ràng. Với người mới, cứ bắt đầu bằng một Scene nhỏ, sạch, dễ hiểu là tốt nhất.
3. GameObject là gì?
GameObject là đối tượng cơ bản trong Unity Scene. Gần như mọi thứ bạn thấy hoặc không thấy trong Scene đều có thể là GameObject: nhân vật, camera, đèn, cây, đá, cánh cửa, đồng coin, viên đạn, vùng trigger, nút UI hoặc một object rỗng dùng để quản lý logic.
Điểm dễ nhầm là GameObject không nhất thiết phải là vật thể nhìn thấy được. Một GameObject có thể không có hình ảnh gì cả, nhưng vẫn tồn tại trong Scene để giữ script, gom nhóm object con hoặc làm điểm mốc cho camera, spawn enemy, kiểm tra vùng va chạm.
Một số GameObject thường gặp
- Player: nhân vật do người chơi điều khiển.
- Main Camera: camera nhìn thế giới game.
- Directional Light hoặc Point Light: nguồn sáng trong Scene 3D.
- Enemy: quái hoặc đối thủ.
- Coin hoặc Item: vật phẩm có thể nhặt.
- Door hoặc Portal: cửa, cổng chuyển màn, vùng dịch chuyển.
- Canvas và Button: các đối tượng giao diện UI.
- GameManager: object rỗng chứa script quản lý điểm, trạng thái game hoặc luồng chơi.
Asceno nói dễ hiểu
GameObject giống như “cái thân” của một đối tượng. Bản thân cái thân đó chưa nói lên nhiều điều. Nó cần được gắn thêm Component để biết mình phải hiển thị ra sao, va chạm thế nào, phát âm thanh không, có chịu vật lý không, và có hành vi riêng hay không.
4. Component là gì?
Component là các thành phần được gắn lên GameObject để tạo chức năng. Đây là một trong những ý tưởng quan trọng nhất của Unity: thay vì tạo một object khổng lồ chứa mọi thứ, Unity cho phép bạn lắp từng thành phần nhỏ vào object.
Ví dụ, một GameObject tên Player có thể có Sprite Renderer để hiển thị hình ảnh 2D, Rigidbody2D để chịu vật lý, Collider2D để va chạm, Animator để chạy animation, AudioSource để phát âm thanh, và một script PlayerController để điều khiển di chuyển.
Các Component cơ bản người mới hay gặp
- Transform: quản lý vị trí, góc xoay và kích thước. Hầu như GameObject nào cũng có Transform.
- Sprite Renderer: hiển thị hình ảnh 2D cho object.
- Mesh Renderer / Mesh Filter: hiển thị mô hình 3D.
- Camera: biến GameObject thành camera nhìn thế giới game.
- Light: biến GameObject thành nguồn sáng.
- Rigidbody / Rigidbody2D: giúp object tham gia hệ vật lý.
- Collider / Collider2D: tạo vùng va chạm.
- AudioSource: phát âm thanh.
- Animator: điều khiển animation.
- Script: code C# do developer viết để tạo hành vi riêng.
Ví dụ thực tế
Một đồng coin trong game 2D có thể là một GameObject. Nó có Sprite Renderer để nhìn thấy được, Collider2D đặt Is Trigger để phát hiện người chơi chạm vào, Animator để xoay lấp lánh, và script CoinCollect để cộng điểm rồi biến mất.
5. Prefab là gì?
Prefab là một mẫu GameObject được lưu lại để tái sử dụng. Khi bạn đã tạo xong một object có đầy đủ hình ảnh, collider, script, animation và cấu hình, bạn có thể kéo nó vào Project để biến thành Prefab. Sau đó, bạn kéo Prefab đó vào Scene bao nhiêu lần cũng được.
Prefab rất hữu ích khi trong game có nhiều đối tượng giống nhau hoặc cùng một cấu trúc. Ví dụ: đồng coin, viên đạn, enemy, item rơi, popup UI, nút bấm, NPC, hiệu ứng nổ, điểm spawn hoặc cả một cụm object lớn.
Vì sao Prefab quan trọng?
- Tái sử dụng nhanh: tạo một lần, dùng nhiều lần.
- Dễ chỉnh sửa hàng loạt: sửa Prefab gốc, các instance có thể cập nhật theo.
- Giữ project gọn hơn: object có cấu trúc rõ ràng, dễ quản lý.
- Phù hợp với spawn runtime: enemy, bullet, item có thể được sinh ra bằng code từ Prefab.
- Giúp làm việc nhóm tốt hơn: object chuẩn hóa, ít bị mỗi người tạo một kiểu.
Lưu ý thân thiện
Người mới hay nhầm giữa Prefab trong Project và instance của Prefab trong Scene. Prefab gốc nằm trong Project như một mẫu. Khi bạn kéo nó vào Scene, bản xuất hiện trong Hierarchy là một instance. Bạn có thể chỉnh instance riêng, nhưng nếu muốn cập nhật lại mẫu chung thì cần hiểu thao tác Apply/Override.
6. Mối quan hệ giữa Scene, GameObject, Component và Prefab
Bốn khái niệm này không tách rời nhau. Chúng liên kết với nhau trong hầu hết mọi thao tác Unity. Khi hiểu được mối quan hệ này, bạn sẽ đọc tài liệu hoặc xem tutorial dễ hơn rất nhiều.
Công thức nhớ nhanh
Scene chứa GameObject. GameObject có Component. Prefab là mẫu GameObject để dùng lại. Project là nơi chứa toàn bộ tài nguyên và thiết lập của dự án.
7. Ví dụ nhỏ: tạo một đồng coin trong Unity
Để dễ hình dung, thử tưởng tượng chúng ta muốn tạo một đồng coin trong game 2D. Đây không phải là hướng dẫn thao tác chi tiết từng click, mà là cách nhìn theo cấu trúc Unity.
- Tạo GameObject Coin: Đây là object đại diện cho đồng coin trong Scene.
- Gắn Sprite Renderer: Để đồng coin có hình ảnh hiển thị trên màn hình.
- Gắn Collider2D: Để Unity biết vùng nào của coin có thể được chạm hoặc đi xuyên qua.
- Bật Is Trigger: Để coin không chặn người chơi, nhưng vẫn phát hiện khi người chơi đi vào vùng đó.
- Gắn script CoinCollect: Để khi Player chạm vào coin thì cộng điểm, phát âm thanh và ẩn hoặc xóa coin.
- Kéo Coin vào Project thành Prefab: Để có thể dùng lại coin ở nhiều vị trí hoặc nhiều Scene khác nhau.
using UnityEngine;
public class CoinCollect : MonoBehaviour
{
private void OnTriggerEnter2D(Collider2D other)
{
if (other.CompareTag("Player"))
{
// Cộng điểm, phát âm thanh, rồi ẩn coin
gameObject.SetActive(false);
}
}
}
Asceno nhìn ví dụ này như thế nào?
Coin là GameObject. Sprite Renderer, Collider2D và script CoinCollect là Component. Khi kéo Coin vào Project, nó trở thành Prefab. Khi đặt nhiều coin trong màn chơi, mỗi coin trong Scene là một instance của Prefab đó.
8. Những lỗi người mới hay gặp
- Tưởng GameObject nào cũng phải nhìn thấy được: thực tế object rỗng vẫn rất hữu ích để quản lý logic, spawn point hoặc gom nhóm.
- Quên gắn Collider nên object không va chạm hoặc không nhận trigger.
- Có Collider nhưng thiếu Rigidbody/Rigidbody2D trong một số trường hợp nên vật lý không hoạt động như mong muốn.
- Gắn script nhưng quên kéo reference vào Inspector, khiến biến bị null khi chạy.
- Sửa một instance trong Scene nhưng tưởng rằng Prefab gốc cũng đã đổi.
- Đặt quá nhiều object tên mặc định như Cube, Cube (1), Cube (2), khiến project rất khó kiểm soát.
- Không Save Scene rồi thắc mắc vì sao mở lại mất object hoặc mất cấu hình.
- Nhét mọi thứ vào một Scene duy nhất khiến việc test, load và tối ưu sau này khó hơn.
Gợi ý nhẹ nhàng
Không cần sợ mắc lỗi ở giai đoạn đầu. Unity là công cụ học bằng thử nghiệm rất tốt. Quan trọng là sau mỗi lỗi, bạn hiểu thêm một chút về Scene, GameObject, Component và Prefab. Tích lũy đủ vài vòng như vậy, project sẽ bắt đầu “có trật tự” hơn.
9. Cách học phần này cho đỡ ngợp
Thay vì đọc liên tục nhiều khái niệm, Asceno thường khuyên nên học bằng một project cực nhỏ. Ví dụ một màn 2D có nhân vật, vài coin, một cửa kết thúc màn và một UI hiển thị điểm. Chỉ với project nhỏ như vậy, bạn đã chạm vào gần đủ các phần căn bản.
Bạn sẽ có Scene để chứa màn chơi, GameObject cho Player và Coin, Component để tạo hình ảnh và va chạm, Prefab để tái sử dụng coin, Script để xử lý hành vi, UI để hiển thị điểm và Console để xem lỗi. Một vòng nhỏ nhưng rất đáng học.
Lộ trình mini đề xuất
- Ngày 1: Tạo Scene, thêm Camera, Light hoặc background đơn giản.
- Ngày 2: Tạo Player GameObject, gắn Sprite/Model, thử di chuyển vị trí.
- Ngày 3: Gắn Collider và Rigidbody/Rigidbody2D để hiểu va chạm.
- Ngày 4: Tạo Coin, biến thành Prefab, đặt nhiều coin trong Scene.
- Ngày 5: Viết script đơn giản để Player nhặt coin và tăng điểm.
10. Kết luận
GameObject, Component, Scene và Prefab là những khái niệm rất cơ bản, nhưng lại là nền móng cho gần như mọi project Unity. Khi hiểu được chúng, bạn sẽ không còn nhìn Unity như một giao diện đầy cửa sổ khó hiểu nữa, mà bắt đầu thấy nó là một hệ thống có cấu trúc rõ ràng.
Từ góc nhìn của Asceno, người mới không cần vội học quá nhiều thứ cùng lúc. Chỉ cần hiểu Scene là nơi đặt nội dung, GameObject là đối tượng, Component là chức năng, Prefab là mẫu tái sử dụng. Sau đó hãy làm một project nhỏ, nhấn Play thật nhiều lần, sửa lỗi thật nhiều lần và quan sát cách Unity phản hồi.
Khi bạn tự tạo được một object, gắn được component, biến nó thành prefab và dùng lại trong scene, bạn đã bước qua một cánh cửa rất quan trọng trong hành trình học Unity.
CTA cuối bài
Bạn đang học Unity hoặc muốn làm game 2D, game 3D, app giáo dục, showroom ảo hay mô phỏng tương tác? Asceno sẽ tiếp tục chia sẻ thêm các bài thực chiến về Unity Editor, Rigidbody, Collider, UI, Script C#, Prefab, Addressables và tối ưu sản phẩm Unity.