4. Hệ thống vật lý
Tới thời điểm này, bạn đã biết được:
- Cách tạo và chạy một dự án game
- Hiểu được vòng đời Script
Phần này chúng ta sẽ cùng tìm hiểu về Hệ thống vật lý trong Unity.
Hệ thống vật lý là gì?
Trong Unity, Hệ thống vật lý (physics engine) là bộ công cụ cho phép các đối tượng tương tác với nhau theo các quy luật tự nhiên như rơi tự do, va chạm, ma sát và nảy. Để một trò chơi có cảm giác “thật”, bạn cần nắm vững 4 thành phần cốt lõi sau:
- Rigidbody
- Colliders
- Physic materials
- Joints
Chúng ta sẽ cùng tìm hiểu về Rigidbody và thực hiện một dự án nhỏ để kết hợp nó với kiến thức Vòng đời Script (Lifecycle) mà bạn đã học.
4.1 Rigidbody
Nói một cách dễ hiểu nhất: Rigidbody là linh hồn vật lý của một đối tượng.
Trong Unity, một vật thể (như khối lập phương, quả cầu) mặc định chỉ là một cái "vỏ" đồ họa đứng yên. Khi bạn thêm thành phần (component) Rigidbody vào, bạn đang nói với Unity rằng: "Hãy áp dụng các quy luật vật lý của trái đất lên vật này".
Cụ thể:
- Trọng lực: Vật sẽ tự rơi xuống khi bắt đầu game
- Va chạm: Vật sẽ bị bật ra khi đụng vào vật khác thay vì đi xuyên qua
- Lực đẩy: Bạn có thể lập trình để "đá" hoặc "đẩy" vật di chuyển
Làm game “Viên gạch nhảy lò cò”
Để dễ hiểu hơn về Rigidbody chúng ta cùng làm một game đơn giản có tên là “Viên gạch nhảy lò cò”
Nội dung của game: Bạn điều khiển một viên gạch, nhấn phím Space để nó nhảy lên bằng lực vật lý, và quan sát vòng đời của nó trong Console.
Bước 1: Chuẩn bị môi trường (Scene)
1. Tạo mặt đất: Trong Unity Editor, bạn có thể tạo dự án mới, hoặc sử dụng dự án ScriptLifecycleProject đang mở sẵn ở bài học trước. Tại khung Hierarchy, chuột phải vào Main Camera > 3D Object > Plane. Đặt tên là "MatDat"
2. Tạo nhân vật: Tại khung Hierarchy, chuột phải vào Main Camera > 3D Object > Cube. Đặt tên là "VienGach". Kéo nó lên cao một chút (trục Y = 2)
3. Thêm tính vật lý cho viên gạch: Chọn "VienGach", vào Inspector (khung bên phải của Unity Editor) bấm Add Component > gõ Rigidbody
Bước 2: Viết Script điều khiển
Tại cửa sổ Project > chuột phải vào mục Assets > Create > Scripting > Empty C# Script, đặt tên là GachController. Sau đó mở trình soạn mã nguồn lên và viết như sau:
(bạn nên tự tay gõ từng dòng mã, để nhớ và hiểu mã nguồn, không nên chép/dán)
[GachController.cs]
using UnityEngine;
using UnityEngine.InputSystem;
public class GachController : MonoBehaviour
{
private Rigidbody rb; // Biến để lưu trữ Rigidbody
public float lucNhay = 5f; // Độ mạnh của cú nhảy
void Awake()
{
// Giai đoạn Khởi tạo: Lấy Rigidbody gắn trên Cube ngay khi game chạy
rb = GetComponent <Rigidbody>();
Debug.Log("1. Awake: Đã kết nối với hệ thống vật lý.");
}
void Start()
{
Debug.Log("2. Start: Game đã sẵn sàng!");
}
void Update()
{
// Giai đoạn Cập nhật: Kiểm tra phím bấm mỗi khung hình
if (Keyboard.current.spaceKey.wasPressedThisFrame)
{
Debug.Log("3. Update: Nhấn Space - Chuẩn bị nhảy!");
// Gọi hàm nhảy ở FixedUpdate để xử lý vật lý chuẩn hơn
NhayLen();
}
}
void FixedUpdate()
{
// Đây là nơi xử lý vật lý lý tưởng nhất
}
void NhayLen()
{
// Sử dụng Rigidbody để tác động một lực hướng lên trên (Vector3.up)
rb.AddForce(Vector3.up * lucNhay, ForceMode.Impulse);
}
void OnDisable()
{
// Giai đoạn Dọn dẹp: Khi tắt script
Debug.Log("4. OnDisable: Script điều khiển đã dừng.");
}
}
Bước 3: Hoàn thiện trong Unity
1. Kéo Script GachController thả vào đối tượng VienGach
2. Mở cửa sổ Console
3. Nhấn nút Play
Lưu ý: vì trong khung Hierarchy đang có nhiều object, để tắt các object không cần thiết (không cho nó chạy), bạn chọn object bên khung Hierarchy, và bỏ dấu chọn của nó ở khung Inspector. Xem hình minh họa.
Bước 4: Quan sát kết quả
- Lúc vừa bấm nút Play: Bạn sẽ thấy viên gạch rơi xuống sàn do trọng lực (Rigidbody làm việc). Console hiển thị: Awake rồi đến Start
- Khi nhấn Space: Viên gạch nảy lên. Console hiện: Update: Nhấn Space....
- Thử nghiệm: Trong lúc game đang chạy, hãy thử bỏ tích (uncheck) cái dấu ở cạnh tên Script GachController trong Inspector. Bạn sẽ thấy dòng OnDisable xuất hiện và bạn không thể nhấn Space để nhảy nữa.
Lưu ý: khi chạy có thể bạn bị lỗi, chỉ thấy màn hình màu xanh, mà không thấy viên gạch đâu?
- Khi chọn VienGach bên Hierarchy > bấm chuột vào màn hình Game > bấm phím Space > vẫn thấy tọa độ Y của VienGach trong Inspector thay đổi > chứng tỏ vẫn có viên gạch, nhưng nó vô hình
- Bạn kiểm tra trong Inspector > Materials > sẽ thấy Element 0 có giá trị là None (Materials), nghĩa là viên gạch đang tàng hình > bạn bấm vào biểu tượng hình tròn bên cạnh > chọn Sprites-Default để viên gạch có màu trắng xám.
Tóm lại, qua bài tập trên bạn đã biết được:
- Phương thức Awake dùng để chuẩn bị các thành phần vật lý (GetComponent<Rigidbody>)
- Phương thức Update dùng để bắt sự kiện người dùng (nhấn phím)
- Rigidbody xử lý liên quan đến vật rơi, nảy và chịu tác động của lực hướng lên (AddForce)
4.2 Bài tập và câu hỏi
Bài tập 4a. Cài đặt game “Viên gạch nhảy lò cò” trong phần lý thuyết.
Câu hỏi 4.1 Hệ thống vật lý (physics engine) trong Unity là gì? Phát biểu nào không đúng?
A. Là bộ công cụ cho phép các đối tượng tương tác với nhau theo các quy luật tự nhiên như rơi tự do, va chạm, ma sát và nảy
B. Colliders là một trong những thành phần của Hệ thống vật lý
C. Rigidbody là một trong những thành phần của Hệ thống vật lý
D. Là bộ công cụ cho phép các đối tượng tương tác với nhau không theo quy luật tự nhiên như rơi tự do, va chạm, ma sát và nảy
-----
Bài sau:

