unity c#报错:error CS0721: 'Random': static types cannot be used as parameters

Error in unity c#: error CS0721: 'Random': static types cannot be used as parameters

我在 Internet 上找到了一个代码,其工作方式类似于 Python 的 random.choices():

static class RandomUtils
{
    public static string Choice(this Random rnd, IEnumerable<string> choices, IEnumerable<int> weights)
    {
        var cumulativeWeight = new List<int>();
        int last = 0;
        foreach (var cur in weights)
        {
            last += cur;
            cumulativeWeight.Add(last);
        }
        int choice = rnd.Next(last);
        int i = 0;
        foreach (var cur in choices)
        {
            if (choice < cumulativeWeight[i])
            {
                return cur;
            }
            i++;
        }
        return null;
    }
}

添加到我的代码中:

using UnityEngine;
using System.Linq;
using System.Collections.Generic;

public class GroundTile : MonoBehaviour
{
    GroundSpawner groundSpawner;
    public GameObject player;

    private bool doDoubleSpawn;
    private int chanceForDoubleSpawn = 45;

    void Start()
    {   
        groundSpawner = GameObject.FindObjectOfType<GroundSpawner>();
        player = GameObject.Find("Tractor");
        SpawnObstacle();
        chanceForDoubleSpawn = GroundSpawner.levelObstaclesMultiplier;
    }

    // Spawn weight values for obstacles
    private int boxWeightValue = 40;
    private int antitankWeightValue = 40;
    private int barricadeWeightValue = 40;
    private int wheelsWeightValue = 40;
    private int molotovItemWeightValue = 5;

    // Prefabs
    public GameObject obstaclePrefab;

    public GameObject boxPrefab;
    public GameObject antitankPrefab;
    public GameObject barricadePrefab;
    public GameObject wheelsPrefab;

    public GameObject tankLevel1Prefab;
    public GameObject molotovItemPrefab;

    // Destroy if player too far away
    void Update()
    {
        if(transform.position.z < player.transform.position.z - 30)
        {
            Destroy(gameObject);
        }
    }
}

static class RandomUtils
{
    public static string Choice(this Random rnd, IEnumerable<string> choices, IEnumerable<int> weights)
    {
        var cumulativeWeight = new List<int>();
        int last = 0;
        foreach (var cur in weights)
        {
            last += cur;
            cumulativeWeight.Add(last);
        }
        int choice = rnd.Next(last);
        int i = 0;
        foreach (var cur in choices)
        {
            if (choice < cumulativeWeight[i])
            {
                return cur;
            }
            i++;
        }
        return null;
    }
}

但是它给我一个错误:

Assets\Scripts\GroundGenerator\GroundTile.cs(61,30): error CS0721: 'Random': static types cannot be used as parameters

我该如何解决这个问题?也许还有另一种写这个函数的方法?

UPD:实例化 GroundTile 的代码:

using UnityEngine;

public class GroundSpawner : MonoBehaviour
{   
    public GameObject groundTile;
    public GameObject groundTileEnd;
    public GameObject player;

    Vector3 nextSpawnPoint;
    private int numOfTiles = 10;
    private int plusTiles = 5;
    private int count = 0;
    public static int level = 1;

    public static int levelObstaclesMultiplier = 45;

    // Weight values for tanks and items
    public static int tankWeightValue = 100;
    public static int molotovItemWeightValue = 10;
    public static int molotovItemWeightValuePlus = 3;


    public void SpawnTile()
    {
        GameObject temp = Instantiate(groundTile, nextSpawnPoint, Quaternion.identity);
        nextSpawnPoint = temp.transform.GetChild(1).transform.position;
    }

    public void SpawnEndTile()
    {
        GameObject temp = Instantiate(groundTileEnd, nextSpawnPoint, Quaternion.identity);
        nextSpawnPoint = temp.transform.GetChild(1).transform.position;
    }

    void Start()
    {
        for (int i = 0; i < 10; i++)
        {
            SpawnTile();
        }

        SpawnEndTile();


        InvokeRepeating("Spawn", 1.5f, 1.5f);
    }

    public void Spawn()
    {
        if (Time.timeScale != 0 && PlayerController.forwardSpeed != 0)
        {
            if (count != numOfTiles)
            {
                SpawnTile();
                count += 1;
            }
            else
            {
                SpawnEndTile();
                numOfTiles += plusTiles;
                count = 0;
                if (levelObstaclesMultiplier <= 65)
                {
                    levelObstaclesMultiplier += 1;
                }
            }   
        }
    }
}

此代码似乎是为 C# 的 System.Random 而不是 Unity-specific UnityEngine.Random class 编写的。您可以通过在参数中指定 System.Random 来解决错误:

public static string Choice(this System.Random rnd, IEnumerable<string> choices, IEnumerable<int> weights)

在参数上,将“Random”替换为“System.Random”即可,错误是因为它认为您使用的是静态类型UnityEngine.Random。

public static string Choice(this System.Random rnd, IEnumerable<string> choices, IEnumerable<int> weights)