public void SyncTriggers()
        {
            using (var lst = TempCollection.GetList <Collider>())
            {
                this.GetComponentsInChildren <Collider>(true, lst);

                //purge entries if necessary
                if (_colliders.Count > 0)
                {
                    using (var purge = TempCollection.GetList <Collider>())
                    {
                        var ed = _colliders.GetEnumerator();
                        while (ed.MoveNext())
                        {
                            if (!ObjUtil.IsObjectAlive(ed.Current.Key) || ed.Current.Value == null || !lst.Contains(ed.Current.Key))
                            {
                                purge.Add(ed.Current.Key);
                                ObjUtil.SmartDestroy(ed.Current.Value);
                            }
                        }
                        if (purge.Count > 0)
                        {
                            var e = purge.GetEnumerator();
                            while (e.MoveNext())
                            {
                                _colliders.Remove(e.Current);
                            }
                        }
                    }
                }

                //fill unknowns
                if (lst.Count > 0)
                {
                    var e = lst.GetEnumerator();
                    while (e.MoveNext())
                    {
                        if (!_colliders.Contains(e.Current))
                        {
                            var m = e.Current.AddComponent <CompoundTriggerMember>();
                            m.Init(this, e.Current);
                            _colliders.Add(e.Current, m);
                        }
                    }
                }
            }
        }
        void IUpdateable.Update()
        {
            //stop if we shouldn't be running
            if (!_activelyScanning || !this.isActiveAndEnabled || _intersectingObjects.Count == 0)
            {
                this.StopUpdate();
                return;
            }

            //check timer
            if (_activeScanInterval > 0f)
            {
                _timer += Time.unscaledDeltaTime;
                if (_timer < _activeScanInterval)
                {
                    return;
                }
            }
            _timer = 0f;

            //perform scan of current objects
            bool containsActiveObjects = _activeObjects.Count > 0;

            using (var toRemove = TempCollection.GetSet <GameObject>())
            {
                var e = _intersectingObjects.GetEnumerator();
                while (e.MoveNext())
                {
                    if (!ObjUtil.IsObjectAlive(e.Current) || !e.Current.activeInHierarchy)
                    {
                        _activeObjects.Remove(e.Current);
                        toRemove.Add(e.Current);
                        continue;
                    }

                    if (_mask.Value != null)
                    {
                        if (_mask.Value.Intersects(e.Current))
                        {
                            _activeObjects.Add(e.Current);
                        }
                        else
                        {
                            _activeObjects.Remove(e.Current);
                        }
                    }
                }

                if (toRemove.Count > 0)
                {
                    e = toRemove.GetEnumerator();
                    while (e.MoveNext())
                    {
                        _intersectingObjects.Remove(e.Current);
                    }
                }
            }

            //wrap up by firing of appropriate events
            if (_activeObjects.Count == 0 && _intersectingObjects.Count == 0)
            {
                this.StopUpdate();
            }

            if (containsActiveObjects)
            {
                if (_activeObjects.Count == 0)
                {
                    _onTriggerLastExited.ActivateTrigger(this, null);
                }
            }
            else
            {
                if (_activeObjects.Count > 0)
                {
                    _onTriggerOccupied.ActivateTrigger(this, null);
                }
            }
        }
Esempio n. 3
0
        private void DealWithDisable(MonoBehaviour component)
        {
            using (var lst = TempCollection.GetList <RadicalCoroutine>())
            {
                var e = _routines.GetEnumerator();
                while (e.MoveNext())
                {
                    if (e.Current.Owner == component)
                    {
                        lst.Add(e.Current);
                    }
                }

                if (lst.Count > 0)
                {
                    RadicalCoroutine routine;
                    if (ObjUtil.IsObjectAlive(this) && this.gameObject.activeInHierarchy)
                    {
                        for (int i = 0; i < lst.Count; i++)
                        {
                            routine = lst[i];
                            if ((routine.DisableMode & RadicalCoroutineDisableMode.CancelOnDisable) != 0)
                            {
                                routine.ManagerCancel();
                                _routines.Remove(routine);
                            }
                            else if ((routine.DisableMode & RadicalCoroutineDisableMode.StopOnDisable) != 0)
                            {
                                if (!routine.Finished && (routine.DisableMode & RadicalCoroutineDisableMode.Resumes) != 0)
                                {
                                    routine.Pause();
                                }
                                else
                                {
                                    routine.Stop();
                                    _routines.Remove(routine);
                                }
                            }
                        }
                    }
                    else
                    {
                        for (int i = 0; i < lst.Count; i++)
                        {
                            routine = lst[i];
                            if ((routine.DisableMode & RadicalCoroutineDisableMode.StopOnDeactivate) != 0)
                            {
                                if (!routine.Finished && (routine.DisableMode & RadicalCoroutineDisableMode.Resumes) != 0)
                                {
                                    routine.Pause();
                                }
                                else
                                {
                                    routine.Stop();
                                    _routines.Remove(routine);
                                }
                            }
                            else
                            {
                                routine.ManagerCancel();
                                _routines.Remove(routine);
                            }
                        }
                    }
                }
            }
        }