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); } } }
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); } } } } } }