示例#1
0
            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);
                }
            }
示例#2
0
 void OnAISpawned(vAIMotor ai, vAISpawnProperties spawnProperties)
 {
     StartCoroutine(spawnProperties.Spawn(this, OnAISpawned));
 }