STDIO
Tìm kiếm gần đây
    • Nội dung
    • QR Code
    • 0
    • 0
    • Sao chép

    C# Script - Lớp Random

    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.

    Rye Nguyen

    07/08/2015
    24/09/2020
    5 phút đọc
    C# Script - Lớp Random

    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.

    0 Bình luận
    Lập Trình Game

    Lập Trình Game

    Kiến thức, kỹ thuật, kinh nghiệm lập trình game.

    Đề xuất

    GameObject - Thao Tác với C# Script
    Giới thiệu các thành phần chung của 1 GameObject và các thao tác với C# ...
    C# Script - Lớp Time
    Giới thiệu về lớp Time trong Unity, 1 số thuộc tính và chức năng, ứng ...

    Khám phá

    9 Tính Năng Quan Trọng Trong C++11
    C++11 là một phiên bản cải tiến và nâng cấp từ C++98 (hay các bạn vẫn ...
    13/08/2015
    Interface Trong C#
    Giới thiệu về interface trong C#, ý nghĩa sử dụng, tính ứng dụng và cách ...
    Hello World với Objective-C
    Giới thiệu ngôn ngữ Objective-C và cách hiện thực chương trình bằng ...
    09/12/2015
    Hiệu Ứng Camera Shake trong Unity
    Hướng dẫn xây dựng hiệu ứng Camera Shake trong Unity
    STL - Map Trong C++
    Sử dụng STL Map trong C++, tìm hiểu, các phương thức thường được dùng ...
    C++11 - OOP - override
    Tìm hiểu về ý nghĩa và cách sử dụng từ khoá override trong C++11.
    17/06/2014
    Random Số Trong C++
    Hướng dẫn cách sinh ra số ngẫu nhiên và số ngẫu nhiên trong 1 khoảng xác ...
    16/06/2015
    std::string và Xử Lý Chuỗi trong C++
    Giới thiệu và hướng dẫn sử dụng thư viện std::string trong C++ xử lý ...
    15/08/2015
    Khi bạn nhấn vào liên kết sản phẩm do STDIO đề xuất và mua hàng, STDIO có thể nhận được hoa hồng. Điều này hỗ trợ STDIO tạo thêm nhiều nội dung hữu ích.. Tìm hiểu thêm.
    STDIO
    Trang chính
    Công ty TNHH STDIO

    30, Trịnh Đình Thảo, Hòa Thạnh, Tân Phú, Hồ Chí Minh
    +84 28.36205514 - +84 942.111912
    developer@stdio.vn

    383/1 Quang Trung, Phường 10, Quận Gò Vấp, Hồ Chí Minh
    Số giấy phép ĐKKD: 0311563559 do sở Kế hoạch và Đầu Tư TPHCM cấp ngày 23/02/2012

    ©STDIO, 2013 - 2020