
Lập Trình Game Với Unity Như Thế Nào (Phần 4)?
Chào mừng các bạn đã quay trở lại với series về lập trình game với Unity, vậy là chúng ta đã đi qua được 3 phần rồi
Phần 1: Giới thiệu về Unity và chương trình điều khiển đối tượng từ lệnh nhập từ bàn phím.
Ở phần 4 này mình sẽ hướng dẫn các bạn xử lí 1 vấn đề rất quan trọng và nó hầu như có mặt ở mọi game, đó là việc xử lí va chạm. Xử lí va chạm có lẽ là vấn đề nan giải và khó nhất đối với việc lập trình game. Sau đó chúng ta sẽ làm quen về định nghĩa Prefabs để sử dụng cho bài sau.
1. Xử lí va chạm
Để các sự kiện trong game xảy ra, thì chúng ta cần phải xây dựng những cơ chế để “phát hiện” va chạm giữa các đối tượng trong game, từ các nhân vật, đến đường bay viên đạn, địa hình,… và “xử lí” chúng.
Nghe qua thì có vẻ đơn giản, nhưng đây lại là một vấn đề cực kì nan giải trong lập trình game, nhất là trong các tựa game 3D phức tạp với nhiều vật thể. Có lẽ khi chơi game, bạn thi thoảng gặp những lỗi như lạ như: kẹt vào tường, đi xuyên tường, bị chui góc lag và rơi ra ngoài thế giới game,… thì khả năng cao là lỗi ở việc xử lí va chạm trong lập trình game.
Ở phần này mình sẽ hướng dẫn các bạn xử lí va chạm mà cụ thể là xử lí chạm biên .
2. Thực hành
Đầu tiên, nếu bạn nào gặp vấn đề hiển thị của các đối tượng thì rất có thể là về Order in Layer. Để giải quyết vấn đề này các bạn kick vào đối tượng gặp vấn đề, trong thẻ Inspector, ở phần Additional Settings -> Order in Layer sửa thành giá trị lớn hơn.
Tại sao lại như vậy? Đó là bởi vì Order in Layer có thể hiểu như là “mức độ ưu tiên hiển thị”, số càng lớn thì đối tượng đó sẽ được ưu tiên hiển thị trước đè lên các đối tượng khác. Việc gặp vấn đề về hiển thị có khả năng là do độ ưu tiên hiển thị thấp hơn đối tượng khác nên bị đè lên (có thể bị background đè), nên việc chỉnh độ ưu tiên lớn hơn có thể giải quyết vấn đề này.
Chúng ta bắt đầu chương trình xử lí chạm biên:
Các bạn tạo 1 file C# Script, đặt lại tên và lập trình như sau:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class VT_GioiHan : MonoBehaviour
{
private float maxX, minX, maxY, minY; //khai báo các biến lấy giới hạn của maincamera
// Start is called before the first frame update
void Start()
{
//lấy các biên của main camera
Vector3 gioihan = Camera.main.ScreenToWorldPoint(new Vector3(Screen.width, Screen.height, 0f)); //không sử dụng trục z nên cho z=0
minX = -gioihan.x + 0.6f; //biên trái(tính cả đối tượng nên cộng với kích thước của đối tượng, các bạn có thể tìm hiểu thêm 1 số cách khác)
maxX = gioihan.x - 0.6f; //biên phải
minY = -gioihan.y + 0.6f; //biên dưới
maxY = gioihan.y - 0.6f; //biên trên
}
// Update is called once per frame
void Update()
{
Vector3 plane = transform.position; //lấy vị trí hiện tại của đối tượng(phi thuyền)
if(plane.x < minX) //nếu vị trí plane.x nhỏ hơn biên trái (minX) thì vị trí của phi thuyền luôn được khởi tạo = vị trí của biên trái
{
plane.x = minX;
}
else if(plane.x > maxX) //nếu vị trí plane.x nhỏ hơn biên phải (maxX) thì vị trí của phi thuyền luôn được khởi tạo = vị trí của biên phải
{
plane.x = maxX;
}
if (plane.y < minY) //nếu vị trí plane.x nhỏ hơn biên dưới (minY) thì vị trí của phi thuyền luôn được khởi tạo = vị trí của biên dưới
{
plane.y = minY;
}
else if (plane.y > maxY) //nếu vị trí plane.x nhỏ hơn biên trên (maxY) thì vị trí của phi thuyền luôn được khởi tạo = vị trí của biên trên
{
plane.y = maxY;
}
transform.position = plane; //gán vị trí mới của phi thuyền
}
}
Các bạn Save lại, kéo thả vào phi thuyền, nhấn Play để chạy thử chương trình. Các bạn sẽ thấy phi thuyền sẽ không thể vượt ra khỏi màn hình của game (bên ngoài maincamera). Ngoài ra Unity cũng có hỗ trợ một số tính năng phát hiện và xử lí va chạm khác chúng ta sẽ tìm hiểu sau.
3. Giới thiệu về kĩ thuật sử dụng file folder Prefabs
Ví dụ các bạn muốn cho phi thuyền của mình bắn ra được đạn liên tục, tạo ta các chướng ngại vật giống nhau xuất hiện liên tục, hay thay đổi tất cả thuộc tính của toàn bộ các đối tượng giống nhau,…. thì chúng ta phải làm thế nào? Có lẽ nào phải tạo ra nhiều đối tượng giống nhau, sửa đổi từng đối tượng,… việc này rất mất thời gian và tất nhiên là sẽ không ai làm vậy, vì vậy mà định nghĩa về Prefabs ra đời.
Ví dụ mình tạo 1 viên đạn cho máy bay:
Mình sẽ tạo 1 file folder Prefabs bằng cách tại vùng trống của thẻ Assets R_Click -> Create -> Folder và đặt lại tên là Prefabs.
Sau đó, mình vào file Prefabs vừa mới tạo kéo thả đối tượng là viên đạn vào file Prefabs này, thì sau khi kéo thả vào Prefabs thì đối tượng đó sẽ chuyển thành đối tượng có thể tái sử dụng.
Sau khi chuyển thành đối tượng tái sử dụng được nó sẽ chuyển thành màu xanh như thế này:
Bây giờ bạn có thể thoải mái xóa nó ở thẻ Hierarchy, và muốn tạo lại chỉ việc kéo thả đối tượng đã được lưu ở file Prefabs vào thẻ Hierarchy. Nó sẽ mang tất cả các thuộc tính của đối tượng cũ, muốn tạo bao nhiêu đối tượng với các thuộc tính giống nhau bằng cách này thì chỉ cần kéo thả đối tượng được lưu ở Prefabs vào thẻ Hierarchy bấy nhiêu lần. Trường hợp bạn muốn thay đổi một thuộc tính nào đó cho tất cả đối tượng giống nhau được tạo từ file Prefabs thì chỉ cần thay đổi đối tượng được lưu trong file Prefabs tất cả đối tượng được tạo ra từ nó sẽ thay đổi theo. Khi muốn một đối tượng có thuộc tính riêng biệt bạn có thẻ chọn riêng đối tượng đó và thay đổi, ngoài ra chúng ta có thể tái sử dụng nó. Ở bài sau chúng ta sẽ sử dụng nó để tạo ra đạn cho phi thuyền để học cách sử dụng file Prefabs.
4. Kết
Như vậy là chúng ta đã cùng nhau qua 4 phần của lập trình game với Unity.
Và phần tới mình sẽ cùng các bạn sử dụng file Folder Prefabs giúp tái sử dụng 1 số đối tượng ví dụ như tái sử dụng lại đạn từ máy bay, tái sử dụng các chướng ngại vật, … cho game của mình. Chúc các bạn thành công!
Tài liệu tham khảo: Tại đây
Tìm hiểu thêm về Prefabs: Tại đây
Post Comment