Menu
CoddyTech

Tạo đối tượng ngẫu nhiên

Thuộc phần Những kiến thức cơ bản về lập trình trong Unity trong hành trình Unity của Coddy. Bài học 68 trên 85.

Random.Range(min, max) chọn một số ngẫu nhiên, và giá trị hàm có thể trả về tùy thuộc vào kiểu của các số bạn đưa vào. Với số thực, mọi giá trị từ min đến max đều có thể xuất hiện, bao gồm cả hai đầu mút. Với số nguyên, bản thân max không được tính. Vì vậy, để tung xúc xắc, ta dùng khoảng từ 1 đến 7:

int roll = Random.Range(1, 7);   // 1, 2, 3, 4, 5 hoặc 6
Debug.Log("You rolled " + roll);

Phiên bản số nguyên không tính max, nên Random.Range(0, names.Length) luôn cho ra một chỉ số mảng hợp lệ. Điều đó cũng có nghĩa là Random.Range(-5, 5) chỉ cho ra các số nguyên từ -5 đến 4, ngay cả khi bạn lưu kết quả vào một biến số thực. Hãy viết Random.Range(-5f, 5f) để lấy mọi giá trị trong khoảng đó.

Để tạo vị trí và hướng trong không gian 3D, Unity có sẵn hai vectơ ngẫu nhiên. Random.insideUnitSphere là một điểm ngẫu nhiên bên trong khối cầu bán kính 1, có tâm tại (0, 0, 0). Random.onUnitSphere là một điểm ngẫu nhiên trên bề mặt khối cầu đó, nên nó tạo ra một hướng ngẫu nhiên có độ dài 1. transform.position + Random.insideUnitSphere * 2f tạo ra một vị trí cách tối đa 2 đơn vị theo bất kỳ hướng nào, kể cả lên trên và xuống dưới.

challenge icon

Thử thách

Trung bình

Mỗi lần nhấp, một chiếc thùng rơi từ vị trí ngẫu nhiên trên sàn.

  1. Bên trong if xử lý thao tác nhấp, hãy chọn float x = Random.Range(-4f, 4f); và float z theo cách tương tự.
  2. Gọi Instantiate(cratePrefab, new Vector3(x, 5, z), Quaternion.identity);.

Nhấn Chơi rồi nhấp vài lần: các thùng rơi ở những vị trí mới. Sau đó nhấn Kiểm tra.

Tự làm thử

using UnityEngine;

public class CrateDropper : MonoBehaviour
{
    public GameObject cratePrefab;

    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            // Thả một thùng từ vị trí ngẫu nhiên: x và z từ -4 đến 4, y = 5
        }
    }
}

Tất cả bài học trong Những kiến thức cơ bản về lập trình trong Unity

Tự luyện tập: Playground Unity