Search…

C# Script - Lớp Random

24/09/20205 min read
Giới thiệu và hướng dẫn thao tác với lớp Random trong Unity để tạo ra con số ngẫu nhiên và tính ngẫu nhiên cho game.

Các yếu tố ngẫu nhiên là điều cơ bản và là nền tảng để xây dựng nên trí thông minh nhân tạo (AI) trong game. Tất nhiên, AI càng hoàn hảo càng tốt. Nhưng game thủ chẳng thể nào chịu được nếu như AI quá thông minh, không có  kẽ hở nào để khai thác và xây dựng chiến thuật.

Ngoài ra, yếu tố ngẫu nhiên còn được sử dụng để tạo nên điều bất ngờ trong 1 vài trường hợp. Do đó có thể nói Random là 1 phần không thể thiếu đối với lập trình game.

Riêng đối với Unity, lớp Random được cung cấp sẵn để tạo các yếu tố ngẫu nhiên đối với nhiều trường hợp. 

Random 1 số

Hàm Range

Nguyên mẫu hàm như sau:

public static float Range(float min, float max);
public static int Range(int min, int max);

Hàm sẽ trả về 1 giá trị ngẫu nhiên trong khoảng minmax với kiểu dữ liệu tương ứng. Hàm có thể trả về giá trị bằng với min, nhưng không bao giờ trả về giá trị max.

Random.Range được ứng dụng rất nhiều trong Unity. Tuỳ theo nhu cầu và logic game, có thể tuỳ biến sử dụng phù hợp.

value

Thuộc tính này sẽ trả về 1 giá trị thực ngẫu nhiên thuộc đoạn [0.0, 1.0].

Khác với Random.Range, thuộc tính có thể trả về giá trị của cả hai đầu mút 0.01.0.

Thuộc tính này thường được sử dụng để lấy ngẫu nhiên màu sắc, hoặc dùng với các thuộc tính có giá trị dao động trong đoạn [0.0, 1.0].

Random 1 vector

insideUnitCircle – insideUnitSphere

  • insideUnitCircle trả về 1 Vector2 là điểm nằm trong đường tròn đơn vị có bán kính là 1.
  • insideUnitSphere trả về 1 Vector3 là điểm nằm trong hình cầu có bán kính 1. Tâm của đường tròn và hình cầu là gốc toạ độ tương ứng với không gian 2D hoặc 3D.

2 thuộc tính này thường được sử dụng trong các hiệu ứng rung của các đối tượng. Ví dụ khi cần người chơi chú ý vào 1 đối tượng trong game, cho đối tượng đó lắc ngẫu nhiên để thu hút sự chú ý.

onUnitSphere

Thuộc tính này trả về 1 giá trị nằm trên mặt cầu đơn vị có bán kính 1.

Có nghĩa là khoảng cách tính từ gốc toạ độ đến điểm trả về luôn có độ dài bằng 1.

  • Giả sử thế giới game của bạn là 1 hình cầu, chẳng hạn như 1 quả địa cầu thu nhỏ. Các enemy sẽ xuất hiện ngẫu nhiên trên đó, có thể sử dụng onUnitSphere để xác định ngẫu nhiên 1 toạ độ chính xác và đúng với yêu cầu 1 cách dễ dàng nhất.
  • Khi cần tạo 1 vận tốc như nhau cho 1 đối tượng với bất kỳ hướng nào, thao tác tương tự như sau:
public float m_speed;
void RandomDirection()
{
    gameObject.GetComponent<Rigidbody>().velocity = Random.onUnitSphere * m_speed;
}

Random 1 góc

2 thuộc tính Random.rotationRandom.rotationUniform đều trả đều trả về 1 góc quay ngẫu nhiên (Quaternion). Chúng đều trả về 1 kiểu dữ liệu giống nhau, đồng thời giá trị trả về cũng thay đổi theo thời gian.

Tuy nhiên:

  • rotateUniform có xác suất xuất hiện các góc là như nhau.
  • rotation sẽ có 1 sự phân cụm các giá trị.

Với nhu cầu thông thường, không cần thiết phải quan tâm đến sự khác nhau của chúng mà có thể sử dụng thay thế cho nhau.

Thiết lập máy sinh số ngẫu nhiên

Nếu tìm hiểu sâu hơn về cách thức xây dựng lớp Random và các giá trị trả về ngẫu nhiên sẽ thấy các giá trị không hoàn toàn ngẫu nhiên.

Trong các "máy sinh số ngẫu nhiên" (Random Number Generator - RNG), có 1 giá trị quy định cách mà các giá trị sẽ được trả về trong các lần gọi 1 thành phần Random. Giá trị này được gọi là seed - hạt nhân của RNG. Hạt nhân này sẽ quy định trình tự phát sinh các số ngẫu nhiên giả (pseudo-random). Các giá trị được trả về sẽ dựa trên trình tự này.

Đối với hầu hết các RNG, trước khi sử dụng, chương trình sẽ tự quy định giá trị seed này dựa trên thời gian của hệ thống. Mục đích của việc này là để các lần chạy chương trình khác nhau sẽ thu được các trình tự ngẫu nhiên khác nhau. Tuy nhiên trong 1 số trường hợp, việc tự quản lý các trình tự ngẫu nhiên này cũng khá hữu ích.

Trường hợp khá thực tế có thể ứng dụng việc quản lý này là thiết kế màn chơi. Thông thường mỗi màn chơi sẽ có các tính chất giống nhau ngay cả khi chơi đi chơi lại nhiều lần. Do đó, có thể đảm bảo các giá trị ngẫu nhiên sẽ giống nhau bằng cách thiết đặt giá trị seed khi load tài nguyên của level. Trong Unity, giá trị seed được thiết đặt tương tự như sau:

Random.seed = value;

Trong đó, value có kiểu dữ liệu là số nguyên.

Lúc này, việc quản lý level sẽ bao gồm luôn việc xử lý biến seed này, đảm bảo từng màn chơi sẽ giữ đúng tính chất ở các lần chơi khác nhau.

IO Stream

IO Stream Co., Ltd

30 Trinh Dinh Thao, Hoa Thanh ward, Tan Phu district, Ho Chi Minh city, Vietnam
+84 28 22 00 11 12
developer@iostream.co

383/1 Quang Trung, ward 10, Go Vap district, Ho Chi Minh city
Business license number: 0311563559 issued by the Department of Planning and Investment of Ho Chi Minh City on February 23, 2012

©IO Stream, 2013 - 2024