我们可以通过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注册事件
随机结果