I’m trying to test my enemy spawn script (c#), and I thought I had it pretty well figured out. For the meantime it’s all attached to my enemy prefab, but eventually I will attach it to the player. This is how the script is supposed to work:
- In the start function, check how many objects have the tag “Enemy”.
- If it’s greater than 0 (for testing) run the StartLevel function, passing a levelIndex variable.
- In StartLevel, do some things (not implemented), then call SpawnEnemy, passing the number of enemies to spawn.
- In SpawnEnemy, for each enemy that needs to be spawned, find a random point around the player (x,z), then pass that point to a function that finds the terrain height at this point. If it returns a valid number, and passes some other conditions (isn’t too close to player, or too close to other spawned enemies) spawn this enemy, facing the player.
- Save this spawn point as the lastSpawnPoint for any other enemies that need spawning.
Here is the relevant code:
using UnityEngine;
using System.Collections;
public class EnemyScript : MonoBehaviour {
public Transform playerPos;
public float enemySpeed = 5f;
public float detectionRadius = 150;
public CharacterController cc;
public GameObject enemyPrefab;
public bool sawPlayer = false;
public Vector3 playerDirection = Vector3.zero;
public float verticalSpeed;
public float spawnDistance = 50.0f;
public float minEnemySpawnDensity = 6f;
public float minSpawnDistance = 20f;
public int spawnThisMany = 0;
// Use this for initialization
void Start () {
//get the transform of the player
playerPos = GameObject.FindWithTag("Player").transform;
//get the character controller attached to the enemyPrefab
cc.GetComponent<CharacterController>();
//if there are no enemies present, start level 1
if(GameObject.FindGameObjectsWithTag("Enemy").Length >= 0){
StartLevel(spawnThisMany);
}
}
//this function handles the spawning of enemies around you. It is called
//from the startLevel function, which handles the number of enemies in
//each level.
void SpawnEnemy(int numberOfEnemies){
//find a random point around the player
Vector3 spawnPoint = Random.insideUnitCircle.normalized*spawnDistance;
Vector3 lastSpawnPoint = Vector3.zero;
//this sets the spawn point height to the terrain height, plus a the radius of the sphere's character controller
spawnPoint.y = TerrainHeight(spawnPoint) + cc.radius;
for(int enemyCount = 0; enemyCount < numberOfEnemies; enemyCount++){
//if terrain height returns infinity, or the difference in this spawn
//point and the last spawn point is greater than the minimus spawn
//density, or the enemy spawns to close to the player, start over.
if(spawnPoint.y == Mathf.Infinity || (spawnPoint - lastSpawnPoint).magnitude <= minEnemySpawnDensity || (spawnPoint - playerPos.position).magnitude <= minSpawnDistance){
SpawnEnemy(numberOfEnemies - enemyCount);
}
//if all the conditions are met, an enemy is spawned facing the player,
//and the spawn point is saved as the last spawn point.
else{
//setting look direction for enemy, cancelling out the y portion
Vector3 lookDirection = playerPos.position;
lookDirection.y = 0f;
Instantiate(enemyPrefab,spawnPoint,Quaternion.LookRotation(lookDirection));
lastSpawnPoint = spawnPoint;
}
}
}
//this starts each level
void StartLevel(int levelIndex){
//do stuff here
SpawnEnemy (levelIndex);
}
//TerrainHeight finds the height of the terrain given a 2D position vector
float TerrainHeight(Vector2 spawnPoint){
//declare a raycast hitpoint
RaycastHit hitPoint;
//go to spawnPoint and cast a ray upwards, if it hits return that y position.
//if it doesn't, shoot a ray downwards and it should hit, if not, return infinity.
if(Physics.Raycast(spawnPoint,Vector3.up, out hitPoint)){
return hitPoint.transform.position.y;
}
else if(Physics.Raycast(spawnPoint,Vector3.down, out hitPoint)){
return hitPoint.transform.position.y;
}
else{
return Mathf.Infinity;
}
}
}
I’m pretty sure the problem lies within my for statement, although for the life of me I can’t figure it out. It’s probably something silly. But everytime I go to play mode, the enemies just keep piling up and lagging my game. About 150 spawn before I can get out of play mode. Thanks for any help.