Ich habe Spawner für Tiere über das Gelände in meinem Spiel verstreut. Die Idee ist, dass Tiere nur spawnen, wenn ein Spieler in Reichweite des Spawners ist, aber nicht, wenn zu viele Tiere in unmittelbarer Nähe des Spawners sind. Das was ich bisher gemacht habe aber jetzt bin ich ein wenig festgefahren. Könnte mir jemand eine Anleitung zu folgenden Dingen geben:C# Tier Spawner Logik - Beratung erforderlich
- Werden die Spawn Odds korrekt berechnet? Wird das Setzen von zwei Tieren zum Beispiel mit einer Spawnchance von 10% und 90% tatsächlich dazu führen, dass TierA eine Chance von 10% hat zu spawnen, und animalB eine Chance von 90% haben oder ist meine Mathematik falsch?
- Sind meine Radiusberechnungen korrekt?
- Am wichtigsten: Kann ich es verbessern?
Der Code:
[System.Serializable]
public class SpawnableAnimal
{
public string AnimalName;
public float spawnWeight;
public float spawnPercentage;
}
public class AnimalSpawner : MonoBehaviour {
public float maxSpawnRadius = 1000.0f;
public float noSpawnRadius = 700.0f;
public GameObject spawnedAnimal;
public SpawnableAnimal[] spawnableAnimals;
void Start() {
System.Random rand = new System.Random();
int randInt = rand.Next(0, 100);
float startTime = randInt/100f;
float repeatTime = randInt/100f;
InvokeRepeating("ReadyToSpawn", startTime, (60.0f + repeatTime));
}
void ReadyToSpawn()
{
Debug.Log("Ready to spawn");
bool canSpawn = true;
GameObject[] players = GameObject.FindGameObjectsWithTag("Player");
GameObject[] animals = GameObject.FindGameObjectsWithTag("Animal");
for(int i = 0; i < players.Length; i++)
{
if (Vector3.Distance(this.transform.position, players[i].transform.position) > maxSpawnRadius)
canSpawn = false;
if (Vector3.Distance(this.transform.position, players[i].transform.position) < noSpawnRadius)
canSpawn = false;
}
if (players.Length < 1)
canSpawn = false;
if (spawnedAnimal != null)
canSpawn = false;
if (canSpawn)
SpawnAnimal();
}
void SpawnAnimal()
{
System.Random rand = new System.Random();
double x = rand.NextDouble();
var totalWeight = spawnableAnimals.Select(a => a.spawnWeight).Sum();
for(int i = 0; i < spawnableAnimals.Length; i++)
{
float spawnPercentage = spawnableAnimals[i].spawnWeight/totalWeight;
if(x < spawnPercentage)
{
InstantiateAnimal(i);
return;
}
x -= spawnPercentage;
}
}
void InstantiateAnimal(int animalToSpawn)
{
if (animalToSpawn != -1)
spawnedAnimal = GameObject.Find("AnimalManager").GetComponent<AnimalManager>().SpawnAnimal(spawnableAnimals[animalToSpawn].AnimalName, this.transform.position, this.transform.rotation);
else Debug.Log("No animal to spawn!");
}
}
sollten Sie dies auf http://codereview.stackexchange.com/, diese Art von Fragen sind Off-Thema hier – Stephen
Vielen Dank! Wusste nicht einmal über codereview.stackexchange.com –