/// <summary> /// Places a spawned entity in the scene. /// </summary> protected virtual void PlaceSpawnedEntity(SpawnedEntity spawnedEntity) { if (spawnedEntity == null) { return; } if (positionInfo.positionType == PositionInfo.PositionType.Radius) { PlaceSpawnedEntityInRadius(spawnedEntity); } else { PlaceSpawnedEntityInSpawnpoint(spawnedEntity); } }
/// <summary> /// Places an entity within the specified radius of the spawner. /// </summary> protected void PlaceSpawnedEntityInRadius(SpawnedEntity spawnedEntity) { var rand1 = UnityEngine.Random.Range(-positionInfo.radius, positionInfo.radius); var rand2 = UnityEngine.Random.Range(-positionInfo.radius, positionInfo.radius); var position = (positionInfo.plane == PositionInfo.Plane.X_Z) ? new Vector3(transform.position.x + rand1, transform.position.y, transform.position.z + rand2) : new Vector3(transform.position.x + rand1, transform.position.y + rand2, transform.position.z); var navMeshAgent = spawnedEntity.GetComponent <NavMeshAgent>(); if (navMeshAgent != null) { navMeshAgent.Warp(position); } else { spawnedEntity.transform.position = position; } spawnedEntities.Add(spawnedEntity); }
/// <summary> /// Removes an entity from the spawnedEntities list. /// </summary> /// <param name="spawnedEntity"></param> protected virtual void RemoveSpawnedEntity(SpawnedEntity spawnedEntity) { if (spawnedEntity == null) { return; } spawnCount--; if (positionInfo.positionType == PositionInfo.PositionType.Radius) { // If using radius, just remove from list: spawnedEntities.Remove(spawnedEntity); } else { // If using spawnpoints, assign null to the list element. for (int i = 0; i < spawnedEntities.Count; i++) { if (spawnedEntities[i] == spawnedEntity) { spawnedEntities[i] = null; } } } }
/// <summary> /// Places an entity at an available spawnpoint. /// </summary> protected virtual void PlaceSpawnedEntityInSpawnpoint(SpawnedEntity spawnedEntity) { // Get available positions: m_availablePositions.Clear(); for (int i = 0; i < spawnedEntities.Count; i++) { if (spawnedEntities[i] == null) { m_availablePositions.Add(i); } } if (m_availablePositions.Count == 0) { return; } // Move entity to a random available position: var index = m_availablePositions[UnityEngine.Random.Range(0, m_availablePositions.Count - 1)]; spawnedEntities[index] = spawnedEntity; var spawnpoint = positionInfo.spawnpoints[Mathf.Min(index, positionInfo.spawnpoints.Length - 1)]; if (spawnpoint != null) { var navMeshAgent = spawnedEntity.GetComponent <NavMeshAgent>(); if (navMeshAgent != null) { navMeshAgent.Warp(spawnpoint.transform.position); } else { spawnedEntity.transform.position = spawnpoint.transform.position; } spawnedEntity.transform.rotation = spawnpoint.transform.rotation; } }
/// <summary> /// Invoked by a SpawnedEntity when it's disabled. Removes it from the spawnedEntities list. /// </summary> /// <param name="spawnedEntity"></param> protected virtual void OnSpawnedEntityDisabled(SpawnedEntity spawnedEntity) { RemoveSpawnedEntity(spawnedEntity); }
/// <summary> /// Despawns an entity. /// </summary> /// <param name="spawnedEntity"></param> protected virtual void DespawnEntity(SpawnedEntity spawnedEntity) { DestroyEntity(spawnedEntity.gameObject); }