This question was
closed Oct 06, 2016 at 11:22 PM by
bloxxyyy for the following reason:
The question is answered, right answer was accepted. Question would not be of importance to other people.
list.count gives back odd numbers c#
I am using System.Collection.generic to count all the objects currently created, however at a inconsistent time mostly arround 7/12 objects created list.count gives back odd numbers like 27 or 35 as example. I think this has to do with the update method not being fast enough at loading the objects. But I am quite unsure.
PS. Also as you might have noticed, the code isn't very optimalized any tips are very welcome.
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class EnemySpawner : MonoBehaviour {
private Material color;
private int spawnedCreatures = 0;
public int spawnCap = 5;
public float spawnClosest = 3, spawnFarest = 15; // min and max spawn distance of each enemy
private GameObject player;
private List<GameObject> units = new List<GameObject>();
private float playerPosX, playerPosZ;
/*
* set the material of the cube,
* get the position of the player
*/
void Start () {
color = (Material)Resources.Load ("goblin");
// we might eror on here if unity cant find the tag player but it should be fine because we set a tag in the player script
player = GameObject.FindGameObjectWithTag ("Player");
playerPosX = player.transform.position.x;
playerPosZ = player.transform.position.z;
}
/*
* loop to spawn enemies
* get a new position for a enemy
* check if the position of each enemy and the player is far away enough
* Set a new game object, insert a cuber and set the material for the cube.
* Set the position and add a tag Enemy
* Last the script Enemy
*/
void Update () {
if (spawnedCreatures < spawnCap) {
Vector3 newPosition = new Vector3 (Random.Range(playerPosX - spawnFarest, playerPosX + spawnFarest), 1f , Random.Range(playerPosZ - spawnFarest, playerPosZ + spawnFarest));
GameObject emptyObject, cube;
// Set all units in a list
foreach (GameObject enemy in GameObject.FindGameObjectsWithTag ("Enemy")) {
units.Add (enemy);
}
units.Add (player);
// check if the distance between all units is far away enough from echother.
// else we restart the loop
foreach (GameObject unit in units) {
if ((unit.transform.position - newPosition).magnitude < spawnClosest) {
return;
}
}
// set a new object
emptyObject = new GameObject ("Goblin");
cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
cube.transform.parent = emptyObject.transform;
cube.GetComponent<MeshRenderer>().material = color;
emptyObject.transform.position = newPosition;
emptyObject.tag = "Enemy";
emptyObject.AddComponent<Enemy> ();
spawnedCreatures = units.Count - 1; // -1 because we dont want to count the player
Debug.Log(spawnedCreatures);
units.Clear(); // clear the list of unallowed positions for the enemies. we dont want double entries
}
}
}
Comment
Best Answer
Answer by doublemax · Oct 06, 2016 at 11:07 PM
If you break out of Update() with the "return" in line 53 you don't clear the units list, so in the next Update() you add the same enemies to that list again.