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

随机结果
