public IEnumerator Spawn(MonoBehaviour mono, OnSpawnAI callBack = null, bool forceSpawn = false) { aiSpawnedList.RemoveAll(ai => ai == null || ai.isDead); spawnPoints.RemoveAll(sp => sp == null); spawnDestinations.RemoveAll(sd => sd == null); vAIMotor _ai = null; if (forceSpawn) { spawned = aiSpawnedList.Count; } if (canSpawn && (!pauseSpawning || forceSpawn) && !inSpawn) { inSpawn = true; yield return(new WaitForEndOfFrame()); var _spawnPoints = spawnPoints.FindAll(sp => sp.isValid); if (_spawnPoints.Count > 0) { onStartSpawn.Invoke(); yield return(new WaitForSeconds(!firstSpawnDone ? timeToFirstSpawn : randomTimeToSpawn ? Random.Range(minTimeBetweenSpawn, maxTimeBetweenSpawn) : maxTimeBetweenSpawn)); var randomPoint = Mathf.Clamp(Random.Range(-1, _spawnPoints.Count), 0, _spawnPoints.Count - 1); var point = _spawnPoints[randomPoint]; if (randomPrefab.Length > 0) { var _prefab = randomPrefab[Random.Range(0, randomPrefab.Length - 1)]; if (_prefab) { _ai = Instantiate(_prefab, point.transform.position, point.transform.rotation) as vAIMotor; } } else { _ai = Instantiate(prefab, point.transform.position, point.transform.rotation) as vAIMotor; } firstSpawnDone = true; if (_ai) { _ai.onDead.AddListener(OnDead); onSpawn.Invoke(); aiSpawnedList.Add(_ai); var aiController = _ai.GetComponent <vIControlAI>(); yield return(new WaitForSeconds(.1f)); if (enableFSMOnSpawn) { var fsm = _ai.GetComponent <vIFSMBehaviourController>(); if (fsm != null && enableFSMOnSpawn) { fsm.isStopped = true; if (delayToEnableFSM <= 0) { fsm.isStopped = false; } else { mono.StartCoroutine(EnableFSM(fsm)); } } } if (aiController != null) { aiController.SetSpeed(destinationSpeed); var destination = spawnDestinations.Count == 0 ? aiController.transform.position : GetSpawnDestination(); aiController.selfStartPosition = destination; if (spawnDestinations.Count > 0) { aiController.MoveTo(destination); //aiController.RotateTo(); } if (waypointArea) { if (setWaypointAreaDelay <= 0) { aiController.waypointArea = waypointArea; } else { mono.StartCoroutine(SetWaypointAreaToAI(aiController)); } } if (overrideDetectionSettings) { aiController.SetDetectionLayer(detectionLayer); aiController.SetDetectionTags(detectionTags); if (aiController is vIControlAIMelee) { var melee = aiController as vIControlAIMelee; melee.SetMeleeHitTags(damageTags); } if (aiController is vIControlAIShooter) { var shooter = aiController as vIControlAIShooter; shooter.SetShooterHitLayer(damageLayer); } } } spawned++; } } } else { yield return(new WaitForSeconds(!firstSpawnDone ? timeToFirstSpawn : randomTimeToSpawn ? Random.Range(minTimeBetweenSpawn, maxTimeBetweenSpawn) : maxTimeBetweenSpawn)); } inSpawn = false; if (!forceSpawn && callBack != null) { callBack.Invoke(_ai, this); } }
void OnAISpawned(vAIMotor ai, vAISpawnProperties spawnProperties) { StartCoroutine(spawnProperties.Spawn(this, OnAISpawned)); }