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)
我在 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)