我们可以通过Random.Range
方法结合权重来实现随机选择。具体步骤如下:
-
首先,创建一个数组,其中包含你要选择的项目,并为每个项目分配一个权重值。
-
计算所有权重值的总和。
-
使用
Random.Range
生成一个介于0和总权重之间的随机数。 -
遍历数组,并将随机数逐渐减去每个项目的权重值,直到找到最后一个权重导致随机数变为负数的项目。
-
返回所选项目。
所以具体的代码为
using UnityEngine;
public class WeightedRandom : MonoBehaviour
{
// 定义一个包含游戏对象和权重的内部类
[System.Serializable]
public class WeightedObject
{
public GameObject gameObject; // 游戏对象
public float weight; // 权重
}
public WeightedObject[] weightedObjects; // 存储带权重的游戏对象数组
private float totalWeight; // 所有对象的总权重
private void Start()
{
CalculateTotalWeight(); // 在启动时计算总权重
}
// 计算所有对象的总权重
private void CalculateTotalWeight()
{
totalWeight = 0f;
foreach (WeightedObject obj in weightedObjects)
{
totalWeight += obj.weight;
}
}
// 按照权重随机选择一个对象
public GameObject GetRandomObjectByWeight()
{
float randomValue = Random.Range(0f, totalWeight); // 生成随机值
foreach (WeightedObject obj in weightedObjects)
{
randomValue -= obj.weight; // 减去对象的权重
if (randomValue <= 0)
{
return obj.gameObject; // 如果随机值小于等于0,返回该对象
}
}
// 如果未找到对象,则返回数组中最后一个对象
return weightedObjects[weightedObjects.Length - 1].gameObject;
}
}
在这个示例中,WeightedObject
类包含了游戏对象以及它们的权重。在Start
方法中,计算了所有对象的总权重。然后,GetRandomObjectByWeight
方法根据总权重随机选择一个对象,并返回选定的游戏对象。
使用方法:将 此脚本附加到Unity游戏对象上,并在Unity编辑器中将权重和游戏对象分配给WeightedObject
数组。
测试:
场景树如下
脚本挂载
WeightedRandom 脚本里新增如下测试代码
public void OnClickRandomObject()
{
Debug.LogError(this.GetRandomObjectByWeight());
}
Button注册事件
随机结果