Mục lục nội dung
- Giới thiệu: Tại sao chọn Unity 6 để làm game 2D?
- Cài đặt Unity Hub và Unity Editor (Step-by-Step)
- Khởi tạo Dự án Game 2D Đầu tiên
- Làm chủ Giao diện Unity Editor
- Nhập khẩu (Import) và Thiết lập Sprite 2D
- Hệ thống Vật lý 2D: Thổi hồn vào game
- Viết Script C# đầu tiên: Di chuyển Nhân vật
- Thiết kế Kẻ địch (Enemy) tuần tra tự động
- Thiết kế Giao diện (UI) và Quản lý Điểm số
- Đóng gói và Xuất bản Game (Build Game)
- Cẩm nang gỡ lỗi: Các lỗi kinh điển và cách xử lý
- Lộ trình phát triển tiếp theo
1. Giới thiệu: Tại sao chọn Unity 6 để làm game 2D?
Chào mừng bạn đến với thế giới của những nhà sáng tạo trò chơi! Nếu bạn đang ấp ủ ước mơ tự tay xây dựng một tựa game 2D đầy lôi cuốn nhưng chưa biết bắt đầu từ đâu, bài viết này chính là bến đỗ dành cho bạn. Lập trình game không còn là "lãnh địa bất khả xâm phạm" dành riêng cho các tập đoàn công nghệ khổng lồ. Năm 2026, với sự bùng nổ của các engine phát triển game trực quan, bất kỳ ai sở hữu lòng đam mê và một chiếc máy tính tầm trung đều có thể tự tin thiết kế trò chơi của riêng mình.
Game 2D hoạt động như thế nào?
Khác với thế giới 3D đa chiều phức tạp, game 2D (Two-Dimensional) vận hành hoàn toàn trên một mặt phẳng hai chiều được xác định bởi hệ trục tọa độ X (Ngang) và Y (Dọc). Toàn bộ nhân vật, phong cảnh, chướng ngại vật thực chất là những hình ảnh phẳng (được gọi là Sprites). Bằng cách dịch chuyển các Sprites này hoặc di chuyển camera với các tốc độ khác nhau (hiệu ứng Parallax), chúng ta tạo ra ảo giác về không gian và chuyển động chân thực cho người chơi.
Sức mạnh mang tính cách mạng của Unity 6 (Phiên bản 2026)
Trong năm 2026, Unity 6 (phiên bản kế thừa LTS bền bỉ) là sự lựa chọn số một của hơn 80% studio game lớn nhỏ tại Việt Nam và trên toàn cầu nhờ những cải tiến vượt bậc:
- Universal Render Pipeline (URP) tối ưu hóa sâu: Game 2D của bạn sẽ có những hiệu ứng ánh sáng (2D Light) lung linh mà vẫn chạy siêu mượt trên các thiết bị di động cấu hình thấp.
- Cải tiến đáng kể hệ thống vật lý 2D: Loại bỏ hoàn toàn lỗi xuyên tường khi vật thể di chuyển ở tốc độ cao nhờ thuật toán Continuous Collision Detection mới.
- Cộng đồng khổng lồ tại Việt Nam: Các diễn đàn, hội nhóm phát triển game luôn sẵn sàng hỗ trợ giải đáp mọi lỗi kỹ thuật chỉ trong vài phút.
Bảng so sánh nhanh: Unity 6 vs Godot 4.x cho người mới
| Tiêu chí | Unity 6 (2026) | Godot 4.x |
|---|---|---|
| Ngôn ngữ chính | C# (Mạnh mẽ, chuẩn công nghiệp) | GDScript (Tương tự Python, dễ học) |
| Hệ thống 2D | Rất mạnh (Nhiều công cụ hỗ trợ ánh sáng, xương nhân vật) | Xuất sắc (Thiết kế thuần 2D gốc, gọn nhẹ) |
| Kho tài nguyên (Asset Store) | Khổng lồ (Hàng triệu mô hình, code mẫu, âm thanh có sẵn) | Hạn chế (Chủ yếu phải tự thiết kế hoặc tìm nguồn ngoài) |
| Cơ hội nghề nghiệp tại VN | Cực kỳ cao (90% các tin tuyển dụng game dev yêu cầu Unity) | Thấp (Chủ yếu phù hợp làm indie đơn độc) |
Lời khuyên: Nếu mục tiêu của bạn là học tập một cách bài bản, tiếp cận tư duy lập trình hệ thống vững chắc và mở rộng cơ hội nghề nghiệp tại các công ty game chuyên nghiệp, Unity 6 chính là sự đầu tư chính xác nhất.
2. Cài đặt Unity Hub và Unity Editor (Step-by-Step)
Để bắt đầu hành trình, chúng ta cần cài đặt hai công cụ cốt lõi: Unity Hub (trình quản lý dự án và các phiên bản engine) và Unity Editor (môi trường thiết kế trò chơi chính).
- Tải Unity Hub: Truy cập trang web chính thức của Unity (unity.com) và tải xuống trình cài đặt Unity Hub phù hợp với hệ điều hành của bạn (Windows hoặc macOS).
- Đăng ký tài khoản Unity Personal: Mở Unity Hub sau khi cài đặt. Bạn tiến hành đăng ký một tài khoản Unity ID mới. Hãy chọn giấy phép (License) là Unity Personal. Giấy phép này hoàn toàn miễn phí cho cá nhân hoặc nhóm phát triển có doanh thu dưới $100,000/năm.
- Cài đặt Unity Editor (Phiên bản Unity 6): Trong giao diện Unity Hub, nhấn vào mục Installs ở cột bên trái > Chọn Install Editor ở góc trên bên phải. Tìm đến phiên bản Unity 6 LTS mới nhất và nhấn Install. Trong bảng chọn Modules, hãy tích chọn:
- Microsoft Visual Studio Community: Trình soạn thảo code C# chuyên nghiệp tích hợp sâu với Unity.
- WebGL Build Support: Cực kỳ cần thiết để xuất bản game lên web.
- Android / iOS Build Support: Tích chọn nếu bạn định phát hành game lên điện thoại.
💡 Lưu ý quan trọng cho IDE viết code: Sau khi cài đặt xong, hãy mở Unity Hub, vào Preferences > External Tools. Tại dòng External Script Editor, đảm bảo đã chọn đúng Microsoft Visual Studio. Điều này giúp Unity tự động kích hoạt tính năng gợi ý code thông minh (IntelliSense).
3. Khởi tạo Dự án Game 2D Đầu tiên
Nào, hãy cùng tạo ra "vũ trụ" game đầu tiên của bạn:
- Mở Unity Hub, điều hướng đến tab Projects và nhấp vào nút New Project.
- Lựa chọn mẫu 2D Core (hoặc 2D URP nếu muốn đồ họa ánh sáng). Với bài hướng dẫn nhập môn này, hãy chọn 2D Core.
- Đặt tên dự án tại ô Project Name (Ví dụ:
MyFirst2DGame). Mẹo: Viết liền không dấu, không ký tự đặc biệt. - Chọn thư mục lưu trữ (dung lượng trống tối thiểu 5GB).
- Nhấp Create Project. Quá trình thiết lập mất 1-2 phút.
4. Làm chủ Giao diện Unity Editor
Khi Unity mở ra, bạn sẽ thấy giao diện đầy ắp thông tin. Ghi nhớ 5 khu vực chính:
1. Scene View (Cửa sổ Cảnh)
Đây là "phim trường" — nơi bạn kéo thả nhân vật, sắp xếp vật thể, căn chỉnh kích thước. Dùng chuột giữa để di chuyển góc nhìn, cuộn chuột để zoom.
2. Game View (Cửa sổ Trò chơi)
Góc nhìn thực tế của người chơi. Nhấn nút Play (tam giác) để chạy thử game.
3. Hierarchy Window (Cây phân cấp)
Liệt kê toàn bộ GameObjects đang tồn tại trong màn chơi (Camera, Nhân vật, Đất, Ánh sáng...).
4. Project Window (Thư mục tài nguyên)
"Kho chứa đồ" — nơi lưu trữ tất cả Sprites, âm thanh, code C#, thư viện. File ở đây chưa chắc có mặt trong màn chơi, cần kéo thả vào Scene để sử dụng.
5. Inspector Window (Bảng thuộc tính)
Khi chọn bất kỳ đối tượng nào, Inspector hiển thị chi tiết thuộc tính: vị trí (Transform), vật lý, màu sắc, scripts gắn kèm.
5. Nhập khẩu (Import) và Thiết lập Sprite 2D
Trong game 2D, mọi thực thể thị giác đều là Sprite. Kéo thả tệp ảnh từ máy tính vào cửa sổ Project của Unity để import.
Các thuộc tính Sprite quan trọng trong Inspector
- Texture Type: Phải là Sprite (2D and UI). Nếu không, Unity coi ảnh là chất liệu 3D.
- Sprite Mode:
- Single: Ảnh chứa 1 hình duy nhất (cái cây, viên kim cương).
- Multiple: Ảnh lớn chứa nhiều khung hình (Sprite Sheet) cần cắt nhỏ.
- Pixels Per Unit (PPU): Tỷ lệ pixel/mét trong Unity. Ví dụ nhân vật 64x64 pixel, PPU = 64 → chiếm đúng 1x1 ô lưới. Quy tắc vàng: Giữ PPU đồng bộ cho tất cả sprites.
Cách cắt Sprite Sheet bằng Sprite Editor
- Chuyển Sprite Mode thành Multiple.
- Nhấp nút Sprite Editor (nếu thiếu, cài gói 2D Sprite từ Package Manager).
- Trong Sprite Editor, nhấp menu Slice → chọn Automatic hoặc Grid By Cell Size (ví dụ 32x32 pixel).
- Nhấn Slice → Apply.
6. Hệ thống Vật lý 2D: Thổi hồn vào game
Để nhân vật rơi tự do, va chạm tường, đứng trên đất — cần gán các thành phần vật lý 2D.
Rigidbody 2D (Khối lượng và Lực)
Biến vật thể thành thực thể vật lý. Thêm bằng: chọn vật thể > Add Component > tìm Rigidbody 2D.
Các loại Body Type:
- Dynamic: Chịu trọng lực, lực đẩy, va chạm. Dùng cho nhân vật chính, kẻ địch, vật rơi.
- Static: Đứng im, khối lượng vô hạn. Dùng cho mặt đất, tường.
- Kinematic: Không chịu trọng lực, chỉ di chuyển bằng code. Dùng cho bệ đỡ di động.
⚠️ Đừng quên khóa trục xoay! Trong Rigidbody 2D > Constraints > tích Freeze Rotation Z. Nếu bỏ quên, nhân vật sẽ bị lật nhào khi vấp gờ tường!
Collider 2D (Vùng va chạm)
- Box Collider 2D: Hình vuông/chữ nhật. Cho đất phẳng, tường.
- Circle Collider 2D: Hình tròn. Cho đồng tiền, đạn.
- Capsule Collider 2D: Hình viên thuốc. Hoàn hảo cho nhân vật chính vì bo tròn giúp leo dốc mượt mà, không kẹt.
7. Viết Script C# đầu tiên: Di chuyển Nhân vật
Viết mã C# để điều khiển nhân vật chạy nhảy theo bàn phím.
Các bước chuẩn bị
- Cửa sổ Project > chuột phải > Create > C# Script.
- Đặt tên:
PlayerController(viết hoa đúng, không dấu cách). - Nhấp đúp để mở Visual Studio, thay thế nội dung bằng code sau:
using UnityEngine;
public class PlayerController : MonoBehaviour
{
[Header("Movement Settings")]
[SerializeField] private float moveSpeed = 8f;
[SerializeField] private float jumpForce = 12f;
[Header("Ground Check Settings")]
[SerializeField] private Transform groundCheckPoint;
[SerializeField] private float checkRadius = 0.2f;
[SerializeField] private LayerMask groundLayer;
private Rigidbody2D rb;
private float horizontalInput;
private bool isGrounded;
void Start()
{
rb = GetComponent<Rigidbody2D>();
}
void Update()
{
// Đọc phím di chuyển: -1 (trái), 0 (đứng), 1 (phải)
horizontalInput = Input.GetAxisRaw("Horizontal");
// Nhảy khi nhấn Space VÀ đang đứng trên đất
if (Input.GetButtonDown("Jump") && isGrounded)
{
rb.velocity = new Vector2(rb.velocity.x, jumpForce);
}
}
void FixedUpdate()
{
// Di chuyển ngang
rb.velocity = new Vector2(horizontalInput * moveSpeed, rb.velocity.y);
// Kiểm tra chạm đất
isGrounded = Physics2D.OverlapCircle(groundCheckPoint.position, checkRadius, groundLayer);
}
private void OnDrawGizmosSelected()
{
if (groundCheckPoint != null)
{
Gizmos.color = Color.red;
Gizmos.DrawWireSphere(groundCheckPoint.position, checkRadius);
}
}
}
Giải thích code cho người mới
[SerializeField]: Hiển thị biến ra Inspector để chỉnh tốc độ, lực nhảy mà không cần sửa code.GetComponent<Rigidbody2D>(): Kết nối đến thành phần vật lý để can thiệp vận tốc.Input.GetAxisRaw("Horizontal"): Đọc phím trái/phải tức thời, không trượt quán tính.Physics2D.OverlapCircle: Kiểm tra chạm đất — ngăn lỗi "nhảy vô hạn".
Thiết lập trong Unity Editor
- Kéo script
PlayerControllervào nhân vật. - Tạo Empty Object con dưới chân nhân vật, đặt tên
GroundCheckPoint. - Di chuyển
GroundCheckPointxuống sát mép dưới chân. - Trong Inspector script: kéo
GroundCheckPointvào ô tương ứng, tạo LayerGroundvà gán cho mặt đất.
8. Thiết kế Kẻ địch (Enemy) tuần tra tự động
Lập trình kẻ địch tự động đi qua lại giữa hai điểm giới hạn.
- Tạo Sprite mới cho kẻ địch, đặt tên
Enemy. - Gắn Rigidbody 2D (Freeze Rotation Z) + Box Collider 2D.
- Tạo script
PatrollingEnemy:
using UnityEngine;
public class PatrollingEnemy : MonoBehaviour
{
[SerializeField] private float speed = 3f;
[SerializeField] private Transform leftLimitPoint;
[SerializeField] private Transform rightLimitPoint;
private bool movingRight = true;
private Rigidbody2D rb;
void Start()
{
rb = GetComponent<Rigidbody2D>();
}
void Update()
{
if (movingRight && transform.position.x >= rightLimitPoint.position.x)
{
movingRight = false;
Flip();
}
else if (!movingRight && transform.position.x <= leftLimitPoint.position.x)
{
movingRight = true;
Flip();
}
}
void FixedUpdate()
{
float currentSpeed = movingRight ? speed : -speed;
rb.velocity = new Vector2(currentSpeed, rb.velocity.y);
}
void Flip()
{
Vector3 localScale = transform.localScale;
localScale.x *= -1;
transform.localScale = localScale;
}
}
Thiết lập mốc giới hạn
- Kéo script vào
Enemy. - Tạo 2 Empty Objects con:
LeftLimitvàRightLimit. - Dịch chuyển 2 mốc ra xa hai bên trái/phải.
- Kéo thả vào ô tương ứng trong Inspector. Nhấn Play kiểm tra!
9. Thiết kế Giao diện (UI) và Quản lý Điểm số
Khởi tạo TextMeshPro
- Hierarchy > chuột phải > UI > Text - TextMeshPro.
- Nhấp Import TMP Essentials khi được hỏi.
- Đổi tên thành
ScoreText, đặt vị trí góc trên màn hình.
GameManager - Bộ não điều khiển màn chơi
using UnityEngine;
using TMPro;
using UnityEngine.SceneManagement;
public class GameManager : MonoBehaviour
{
public static GameManager Instance { get; private set; }
[SerializeField] private TextMeshProUGUI scoreText;
[SerializeField] private GameObject gameOverPanel;
private int currentScore = 0;
void Awake()
{
if (Instance == null) Instance = this;
else Destroy(gameObject);
}
void Start()
{
UpdateScoreUI();
if (gameOverPanel != null) gameOverPanel.SetActive(false);
}
public void AddScore(int points)
{
currentScore += points;
UpdateScoreUI();
}
private void UpdateScoreUI()
{
if (scoreText != null) scoreText.text = "Score: " + currentScore;
}
public void TriggerGameOver()
{
if (gameOverPanel != null)
{
gameOverPanel.SetActive(true);
Time.timeScale = 0f;
}
}
public void RestartGame()
{
Time.timeScale = 1f;
SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex);
}
}
Vật phẩm đồng xu (Coin)
Tạo Sprite đồng xu, gắn Circle Collider 2D với Is Trigger = true. Tạo script Coin:
using UnityEngine;
public class Coin : MonoBehaviour
{
[SerializeField] private int pointsValue = 10;
private void OnTriggerEnter2D(Collider2D collision)
{
if (collision.CompareTag("Player"))
{
GameManager.Instance.AddScore(pointsValue);
Destroy(gameObject);
}
}
}
💡 Quan trọng: Nhấp chọn nhân vật > Inspector > mục Tag > đổi thành Player để code nhận diện va chạm hoạt động.
10. Đóng gói và Xuất bản Game (Build Game)
- Menu File > Build Settings...
- Nhấn Add Open Scenes.
- Chọn Platform:
- Windows/Mac/Linux: File chạy trực tiếp trên PC.
- WebGL: Chơi trên trình duyệt, chia sẻ lên itch.io.
- Nhấp Player Settings... để đặt tên game, logo.
- Nhấn Build, chọn thư mục lưu và chờ biên dịch hoàn tất.
11. Cẩm nang gỡ lỗi: Các lỗi kinh điển và cách xử lý
Lỗi 1: Nhân vật bị dính tường, không rơi xuống
- Nguyên nhân: Ma sát giữa Collider nhân vật và tường quá lớn.
- Fix: Tạo Physics Material 2D mới, đặt Friction = 0, gán vào Collider nhân vật (ô Material).
Lỗi 2: NullReferenceException
- Nguyên nhân: Code truy cập object chưa được gán trong Inspector (biến rỗng).
- Fix: Nhấp đúp vào lỗi trong Console → Unity chỉ dòng lỗi → kiểm tra biến nào chưa kéo thả gán giá trị.
Lỗi 3: Nhân vật di chuyển giật lag
- Nguyên nhân: Thay đổi vận tốc/vật lý trong
Update()thay vìFixedUpdate(). - Fix: Di chuyển code liên quan Rigidbody sang
FixedUpdate().
12. Lộ trình phát triển tiếp theo
Chúc mừng! Bạn đã hoàn thành game 2D đầu tiên bằng Unity 6. Đây là cột mốc đáng tự hào!
Kiến thức nâng cao tiếp theo
- Tilemap System: Thiết kế màn chơi bằng ô gạch — xây bản đồ lớn trong vài phút.
- Animator & State Machine: Tạo hoạt họa nhân vật (Đứng, Chạy, Nhảy, Tấn công) mượt mà.
- Cinemachine 2D Camera: Camera thông minh tự theo nhân vật, hiệu ứng Screen Shake.
- New Input System: Hỗ trợ Gamepad/tay cầm không cần viết lại code.
Tham gia cộng đồng
- Truy cập diễn đàn lamgame.vn — cập nhật xu hướng, tìm việc làm game dev.
- Tham gia Game Jam để rèn luyện sáng tạo và kết nối bạn đồng hành.
- Khám phá kho source game để học hỏi cách những developer khác xây dựng trò chơi.
"Mọi nhà phát triển game vĩ đại đều từng bắt đầu từ một dự án đơn giản chỉ có một nhân vật di chuyển và một khối hộp va chạm." Hãy kiên trì thực hành và tự tay tạo nên thế giới giải trí của riêng bạn!