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)