Home > front end >  Error in 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

Time:04-24

I found a code on the Internet that works like Python's 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;
    }
}

Added to my code:

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;
    }
}

But it gives me an error:

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

How do I fix this? Maybe there is another way to write this function?

UPD: code that instantiate 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;
                }
            }   
        }
    }
}

CodePudding user response:

This code seems to have been written for C#'s System.Random rather than the Unity-specific UnityEngine.Random class. You can resolve the error by specifying System.Random in the parameters:

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

CodePudding user response:

On the parameters, just replace "Random" with "System.Random", the error is because it thinks you're using UnityEngine.Random, which is a static type.

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