Ejemplo n.º 1
0
        public int CastAll(Vector3 direction, ICollection <RaycastHit> results, float distance, int layerMask, QueryTriggerInteraction query)
        {
            if (results == null)
            {
                throw new System.ArgumentNullException("results");
            }

            using (var set = TempCollection.GetSet <RaycastHit>())
            {
                foreach (var c in _colliders)
                {
                    GeomUtil.GetGeom(c).CastAll(direction, set, distance, layerMask, query);
                }

                if (set.Count > 0)
                {
                    var e = set.GetEnumerator();
                    while (e.MoveNext())
                    {
                        results.Add(e.Current);
                    }
                    return(set.Count);
                }
            }

            return(0);
        }
        public static int OverlapGeomAgainst(IPhysicsGeom geom, ICollection<Collider> results, IEnumerable<Collider> colliders, int layerMask = Physics.AllLayers, QueryTriggerInteraction query = QueryTriggerInteraction.UseGlobal)
        {
            if (results == null) throw new System.ArgumentNullException("results");
            if (geom == null) return 0;
            if (colliders == null) return 0;

            int cnt = 0;
            using (var set = TempCollection.GetSet<Collider>())
            {
                if (geom.Overlap(set, layerMask, query) > 0)
                {
                    var e = LightEnumerator.Create<Collider>(colliders);
                    while (e.MoveNext())
                    {
                        if (set.Contains(e.Current))
                        {
                            cnt++;
                            results.Add(e.Current);
                        }
                    }
                }
            }

            return cnt;
        }
        public static string[] GetCustomAccessorIds(System.Type tp, System.Predicate <CustomAccessorData> predicate = null)
        {
            if (tp == null)
            {
                throw new System.ArgumentNullException("tp");
            }
            if (_targetToCustomAccessor == null)
            {
                BuildAccessorDictionary();
            }

            using (var set = TempCollection.GetSet <string>())
            {
                var e = _targetToCustomAccessor.GetEnumerator();
                while (e.MoveNext())
                {
                    var lst = e.Current.Value;
                    for (int i = 0; i < lst.Count; i++)
                    {
                        if (lst[i].TargetType.IsAssignableFrom(tp) &&
                            (predicate == null || predicate(lst[i])))
                        {
                            set.Add(e.Current.Key);
                            break;
                        }
                    }
                }

                return(set.ToArray());
            }
        }
        public void FixedUpdate()
        {
            if (_fixedSequences.Count > 0)
            {
                using (var set = TempCollection.GetSet <ISequence>())
                {
                    var e2 = _fixedSequences.GetEnumerator();
                    while (e2.MoveNext())
                    {
                        if (e2.Current.Update())
                        {
                            set.Add(e2.Current);
                        }
                    }

                    if (set.Count > 0)
                    {
                        e2 = set.GetEnumerator();
                        while (e2.MoveNext())
                        {
                            _fixedSequences.Remove(e2.Current);
                        }
                    }
                }
            }
        }
            public static void Add(T listener)
            {
                if (_receivers == null)
                {
                    _receivers = new HashSet <T>();
                }

                switch (_state)
                {
                case ExecutingState.None:
                    _receivers.Add(listener);
                    break;

                case ExecutingState.Executing:
                    if (_toAdd == null)
                    {
                        _toAdd = TempCollection.GetSet <T>();
                    }
                    _toAdd.Add(listener);
                    break;

                case ExecutingState.CleaningUp:
                    _receivers.Add(listener);
                    break;
                }
            }
        public static bool CheckGeomAgainst(IPhysicsGeom geom, IEnumerable <Collider> colliders, int layerMask = Physics.AllLayers, QueryTriggerInteraction query = QueryTriggerInteraction.UseGlobal)
        {
            if (geom == null)
            {
                return(false);
            }
            if (colliders == null)
            {
                return(false);
            }

            using (var set = TempCollection.GetSet <Collider>())
            {
                if (geom.Overlap(set, layerMask, query) > 0)
                {
                    var e = LightEnumerator.Create <Collider>(colliders);
                    while (e.MoveNext())
                    {
                        if (set.Contains(e.Current))
                        {
                            return(true);
                        }
                    }
                }
            }

            return(false);
        }
Ejemplo n.º 7
0
        public int Overlap(ICollection <Collider> results, int layerMask, QueryTriggerInteraction query)
        {
            if (results == null)
            {
                throw new System.ArgumentNullException("results");
            }

            using (var set = TempCollection.GetSet <Collider>())
            {
                foreach (var c in _colliders)
                {
                    GeomUtil.GetGeom(c).Overlap(set, layerMask, query);
                }

                if (set.Count > 0)
                {
                    var e = set.GetEnumerator();
                    while (e.MoveNext())
                    {
                        results.Add(e.Current);
                    }
                    return(set.Count);
                }
            }

            return(0);
        }
Ejemplo n.º 8
0
        void IUpdateable.Update()
        {
            if (_currentToken == null)
            {
                GameLoopEntry.UpdatePump.Remove(this);
                return;
            }

            TempHashSet <AudibleSensor> activeSet = null;

            if (_activeSensors.Count > 0)
            {
                activeSet = TempCollection.GetSet(_activeSensors);
            }

            var   pos = this.transform.position;
            float d, r;

            var e = AudibleSensor.Pool.GetEnumerator();

            while (e.MoveNext())
            {
                var sensor = e.Current;
                if (_activeSensors.Contains(sensor) || sensor.Ignores(this))
                {
                    continue;
                }

                d = (sensor.transform.position - pos).sqrMagnitude;
                r = (sensor.Range + _range);
                if (d < r * r)
                {
                    _activeSensors.Add(sensor);
                    sensor.SignalEnterSiren(this);
                }
            }

            if (activeSet != null)
            {
                var e2 = activeSet.GetEnumerator();
                while (e2.MoveNext())
                {
                    var sensor = e.Current;

                    d = (sensor.transform.position - pos).sqrMagnitude;
                    r = (sensor.Range + _range);
                    if (d < r * r)
                    {
                        sensor.SignalSirenStay(this);
                    }
                    else
                    {
                        _activeSensors.Remove(sensor);
                        sensor.SignalExitSiren(this);
                    }
                }

                activeSet.Dispose();
            }
        }
        public static int OverlapGeomIgnoring(IPhysicsGeom geom, ICollection <Collider> results, IEnumerable <Collider> ignoredColliders, int layerMask = Physics.AllLayers, QueryTriggerInteraction query = QueryTriggerInteraction.UseGlobal)
        {
            if (results == null)
            {
                throw new System.ArgumentNullException("results");
            }
            if (geom == null)
            {
                return(0);
            }

            int cnt = 0;

            using (var set = TempCollection.GetSet <Collider>())
            {
                if (geom.Overlap(set, layerMask, query) > 0)
                {
                    var e = set.GetEnumerator();
                    while (e.MoveNext())
                    {
                        if (!ignoredColliders.Contains(e.Current))
                        {
                            cnt++;
                            results.Add(e.Current);
                        }
                    }
                }
            }

            return(cnt);
        }
            public static void Remove(T listener)
            {
                if (_receivers == null || _receivers.Count == 0)
                {
                    return;
                }

                switch (_state)
                {
                case ExecutingState.None:
                    _receivers.Remove(listener);
                    break;

                case ExecutingState.Executing:
                    if (_toRemove == null)
                    {
                        _toRemove = TempCollection.GetSet <T>();
                    }
                    _toRemove.Add(listener);
                    break;

                case ExecutingState.CleaningUp:
                    _receivers.Remove(listener);
                    break;
                }
            }
        /// <summary>
        /// Create a MessageToken to invoke at a later point. If no targets found null is returned.
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="includeDisabledComponents"></param>
        /// <returns></returns>
        public static MessageToken <T> CreateFindAndBroadcastToken <T>(bool includeDisabledComponents = false) where T : class
        {
            using (var lst = TempCollection.GetSet <T>())
            {
                ObjUtil.FindObjectsOfInterface <T>(lst);
                if (lst.Count == 0)
                {
                    return(null);
                }

                if (includeDisabledComponents)
                {
                    return(new MessageToken <T>(lst.ToArray()));
                }

                using (var lst2 = TempCollection.GetList <T>(lst.Count))
                {
                    var e = lst.GetEnumerator();
                    while (e.MoveNext())
                    {
                        if (TargetIsValid(e.Current))
                        {
                            lst.Add(e.Current);
                        }
                    }

                    if (lst.Count > 0)
                    {
                        return(new MessageToken <T>(lst2.ToArray()));
                    }
                }
            }

            return(null);
        }
        private static TempHashSet <System.Type> ReduceLikeTypes(System.Type[] arr)
        {
            var set = TempCollection.GetSet <System.Type>();

            foreach (var tp in arr)
            {
                if (set.Contains(tp))
                {
                    continue;
                }

                var  e        = set.GetEnumerator();
                bool donotadd = false;
                while (e.MoveNext())
                {
                    if (TypeUtil.IsType(tp, e.Current))
                    {
                        donotadd = true;
                        break;
                    }
                    if (TypeUtil.IsType(e.Current, tp))
                    {
                        set.Remove(e.Current);
                        break;
                    }
                }

                if (!donotadd)
                {
                    set.Add(tp);
                }
            }
            return(set);
        }
Ejemplo n.º 13
0
        /// <summary>
        /// Adds targets to a Trigger/SPEvent.
        ///
        /// This method applies changes to the SerializedProperty. Only call if you expect this behaviour.
        /// </summary>
        /// <param name="triggerProperty"></param>
        /// <param name="objs"></param>
        public static void AddObjectsToTrigger(SerializedProperty triggerProperty, UnityEngine.Object[] objs)
        {
            if (triggerProperty == null)
            {
                throw new System.ArgumentNullException("triggerProperty");
            }
            if (triggerProperty.serializedObject.isEditingMultipleObjects)
            {
                throw new System.ArgumentException("Can not use this method for multi-selected SerializedObjects.", "triggerProperty");
            }

            try
            {
                triggerProperty.serializedObject.ApplyModifiedProperties();
                var trigger = EditorHelper.GetTargetObjectOfProperty(triggerProperty) as BaseSPEvent;
                if (trigger == null)
                {
                    return;
                }

                Undo.RecordObject(triggerProperty.serializedObject.targetObject, "Add Trigger Targets");
                using (var set = TempCollection.GetSet <UnityEngine.Object>())
                {
                    for (int i = 0; i < trigger.Targets.Count; i++)
                    {
                        set.Add(trigger.Targets[i].Target);
                    }

                    foreach (var obj in objs)
                    {
                        if (set.Contains(obj))
                        {
                            continue;
                        }
                        set.Add(obj);

                        var targ = trigger.AddNew();
                        if (EventTriggerTarget.IsValidTriggerTarget(obj, TriggerActivationType.TriggerAllOnTarget))
                        {
                            targ.ConfigureTriggerAll(obj);
                        }
                        else
                        {
                            targ.ConfigureCallMethod(obj, "");
                        }
                        targ.Weight = 1f;
                    }
                }

                triggerProperty.serializedObject.Update();
            }
            catch (System.Exception ex)
            {
                Debug.LogException(ex);
            }
        }
Ejemplo n.º 14
0
        /// <summary>
        /// Replace all references to 'old' with 'replacement' as a service.
        /// This is usually used when decorating an existing service.
        /// </summary>
        /// <param name="old">The service to replace</param>
        /// <param name="replacement">The service to replace with</param>
        /// <param name="keepOldIfCannotReplace">If the service look-up type does not match the replacement type, should 'old' be left in place or removed for that look-up type</param>
        private static void ReplaceReferences(IService old, IService replacement)
        {
            if (old != null)
            {
                _services.Remove(old);
                old.Disposed -= OnServiceInadvertentlyDisposed;
            }
            if (replacement != null)
            {
                _services.Add(replacement);

                //make sure we don't add it multiple times
                replacement.Disposed -= OnServiceInadvertentlyDisposed;
                replacement.Disposed += OnServiceInadvertentlyDisposed;
            }

            //Find all references
            using (var cache = TempCollection.GetSet <System.Type>())
            {
                var e1 = _serviceTable.GetEnumerator();
                while (e1.MoveNext())
                {
                    if (object.ReferenceEquals(e1.Current.Value, old))
                    {
                        cache.Add(e1.Current.Key);
                    }
                }

                //Replace references
                var rtp = replacement != null?replacement.GetType() : null;

                var e2 = cache.GetEnumerator();
                while (e2.MoveNext())
                {
                    bool cannotReplace = (rtp != null && !e2.Current.IsAssignableFrom(rtp));

                    if (cannotReplace || replacement == null)
                    {
                        _serviceTable.Remove(e2.Current);
                    }
                    else
                    {
                        _serviceTable[e2.Current] = replacement;
                    }


                    var field = GetStaticEntryFieldInfo(e2.Current, false);
                    if (field != null)
                    {
                        field.SetValue(null, cannotReplace ? null : replacement);
                    }
                }
            }
        }
Ejemplo n.º 15
0
        public override bool Trigger(object sender, object arg)
        {
            if (!this.CanTrigger)
            {
                return(false);
            }

            switch (_targetSearchMode)
            {
            case TargetMode.All:
                foreach (var t1 in _targets)
                {
                    foreach (var t2 in t1.GetTargets <UnityEngine.Object>(arg))
                    {
                        if (t2 != null)
                        {
                            _action.ActivateTrigger(this, t2);
                        }
                    }
                }
                break;

            case TargetMode.First:
                foreach (var t1 in _targets)
                {
                    var t2 = t1.GetTarget <UnityEngine.Object>(arg);
                    if (t2 != null)
                    {
                        _action.ActivateTrigger(this, t2);
                    }
                }
                break;

            case TargetMode.FirstUnique:
                using (var set = TempCollection.GetSet <UnityEngine.Object>())
                {
                    foreach (var t1 in _targets)
                    {
                        foreach (var t2 in t1.GetTargets <UnityEngine.Object>(arg))
                        {
                            if (t2 != null && !set.Contains(t2))
                            {
                                set.Add(t2);
                                _action.ActivateTrigger(this, t2);
                                break;
                            }
                        }
                    }
                }
                break;
            }
            return(true);
        }
Ejemplo n.º 16
0
        public static object[] GetAllFromSource(System.Type tp, object obj)
        {
            if (obj == null)
            {
                return(ArrayUtil.Empty <object>());
            }

            using (var set = TempCollection.GetSet <object>())
            {
                var otp = obj.GetType();
                if (TypeUtil.IsType(otp, tp))
                {
                    set.Add(obj);
                }
                if (obj is IComponent)
                {
                    var c = (obj as IComponent).component;
                    if (!object.ReferenceEquals(c, null) && TypeUtil.IsType(c.GetType(), tp))
                    {
                        set.Add(c);
                    }
                }

                var go = GameObjectUtil.GetGameObjectFromSource(obj);
                if (go != null)
                {
                    if (typeof(SPEntity).IsAssignableFrom(tp))
                    {
                        var entity = SPEntity.Pool.GetFromSource(tp, go);
                        if (entity != null)
                        {
                            set.Add(entity);
                        }
                    }
                    else if (ComponentUtil.IsAcceptableComponentType(tp))
                    {
                        using (var lst = TempCollection.GetList <UnityEngine.Component>())
                        {
                            go.GetComponents(tp, lst);
                            var e = lst.GetEnumerator();
                            while (e.MoveNext())
                            {
                                set.Add(e.Current);
                            }
                        }
                    }
                }

                return(set.Count > 0 ? set.ToArray() : ArrayUtil.Empty <object>());
            }
        }
Ejemplo n.º 17
0
        public static T[] GetAllFromSource <T>(object obj) where T : class
        {
            if (obj == null)
            {
                return(ArrayUtil.Empty <T>());
            }

            using (var set = TempCollection.GetSet <T>())
            {
                if (obj is T)
                {
                    set.Add(obj as T);
                }
                if (obj is IComponent)
                {
                    var c = (obj as IComponent).component;
                    if (c is T)
                    {
                        set.Add(c as T);
                    }
                }

                var go = GameObjectUtil.GetGameObjectFromSource(obj);
                if (go is T)
                {
                    set.Add(go as T);
                }

                //if (go != null && ComponentUtil.IsAcceptableComponentType(typeof(T))) go.GetComponentsAlt<T>(set);
                if (go != null)
                {
                    var tp = typeof(T);
                    if (typeof(SPEntity).IsAssignableFrom(tp))
                    {
                        var entity = SPEntity.Pool.GetFromSource(tp, go) as T;
                        if (entity != null)
                        {
                            set.Add(entity);
                        }
                    }
                    if (ComponentUtil.IsAcceptableComponentType(tp))
                    {
                        go.GetComponentsAlt <T>(set);
                    }
                }

                return(set.Count > 0 ? set.ToArray() : ArrayUtil.Empty <T>());
            }
        }
Ejemplo n.º 18
0
        public static T[] FindObjectsOfInterface <T>() where T : class
        {
            var tp  = typeof(T);
            var map = GetInterfaceComponentMap(tp);

            using (var lst = TempCollection.GetSet <T>())
            {
                foreach (var ctp in map)
                {
                    foreach (var obj in UnityEngine.Object.FindObjectsOfType(ctp))
                    {
                        lst.Add(obj as T);
                    }
                }
                return(lst.ToArray());
            }
        }
        public static bool CheckGeomIgnoring(IPhysicsGeom geom, IEnumerable<Collider> ignoredColliders, int layerMask = Physics.AllLayers, QueryTriggerInteraction query = QueryTriggerInteraction.UseGlobal)
        {
            if (geom == null) return false;

            using (var set = TempCollection.GetSet<Collider>())
            {
                if(geom.Overlap(set, layerMask, query) > 0)
                {
                    var e = set.GetEnumerator();
                    while(e.MoveNext())
                    {
                        if (!ignoredColliders.Contains(e.Current)) return true;
                    }
                }
            }

            return false;
        }
Ejemplo n.º 20
0
            public static void Remove(T listener)
            {
                if (_receivers == null || _receivers.Count == 0)
                {
                    return;
                }

                if (_executing)
                {
                    if (_toRemove == null)
                    {
                        _toRemove = TempCollection.GetSet <T>();
                    }
                    _toRemove.Add(listener);
                }
                else
                {
                    _receivers.Remove(listener);
                }
            }
Ejemplo n.º 21
0
            public static void Add(T listener)
            {
                if (_receivers == null)
                {
                    _receivers = new HashSet <T>();
                }

                if (_executing)
                {
                    if (_toAdd == null)
                    {
                        _toAdd = TempCollection.GetSet <T>();
                    }
                    _toAdd.Add(listener);
                }
                else
                {
                    _receivers.Add(listener);
                }
            }
Ejemplo n.º 22
0
        /// <summary>
        /// Broadcast a message globally to all that match T. This can be slow, use sparingly.
        /// </summary>
        /// <typeparam name="TInterface"></typeparam>
        /// <typeparam name="TArg"></typeparam>
        /// <param name="arg"></param>
        /// <param name="functor"></param>
        public static void FindAndBroadcast <TInterface, TArg>(TArg arg, System.Action <TInterface, TArg> functor, bool includeDisabledComponents = false) where TInterface : class
        {
            if (functor == null)
            {
                throw new System.ArgumentNullException("functor");
            }

            using (var lst = TempCollection.GetSet <TInterface>())
            {
                ObjUtil.FindObjectsOfInterface <TInterface>(lst);
                var e = lst.GetEnumerator();
                while (e.MoveNext())
                {
                    if (includeDisabledComponents || TargetIsValid(e.Current))
                    {
                        functor(e.Current, arg);
                    }
                }
            }
        }
Ejemplo n.º 23
0
        public static void ClearAll(bool destroyIfCan = false, bool donotSignalUnregister = false)
        {
            using (var types = TempCollection.GetSet <System.Type>(_serviceTable.Keys))
                using (var services = TempCollection.GetSet <IService>(_serviceTable.Values))
                {
                    //Replace references
                    var e2 = types.GetEnumerator();
                    while (e2.MoveNext())
                    {
                        var field = GetStaticEntryFieldInfo(e2.Current, false);
                        if (field != null)
                        {
                            field.SetValue(null, null);
                        }
                    }

                    //Signal
                    if (!donotSignalUnregister)
                    {
                        foreach (var service in services)
                        {
                            if (service is UnityEngine.Object)
                            {
                                service.SignalServiceUnregistered();
                            }
                        }
                    }

                    if (destroyIfCan)
                    {
                        foreach (var service in services)
                        {
                            if (service is UnityEngine.Object)
                            {
                                ObjUtil.SmartDestroy(service as UnityEngine.Object);
                            }
                        }
                    }
                }
        }
        /// <summary>
        /// Broadcast a message globally to all that match T. This can be slow, use sparingly.
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="functor"></param>
        public static void FindAndBroadcast <T>(System.Action <T> functor, bool includeDisabledComponents = false) where T : class
        {
            if (functor == null)
            {
                throw new System.ArgumentNullException("functor");
            }

            using (var coll = TempCollection.GetSet <T>())
            {
                ObjUtil.FindObjectsOfInterface <T>(coll);
                GlobalMessagePool <T> .CopyReceivers(coll);

                var e = coll.GetEnumerator();
                while (e.MoveNext())
                {
                    if (includeDisabledComponents || TargetIsValid(e.Current))
                    {
                        functor(e.Current);
                    }
                }
            }
        }
        /// <summary>
        /// Call once per frame
        /// </summary>
        private void Update()
        {
            var e = _dict.GetEnumerator();

            while (e.MoveNext())
            {
                if (e.Current.Value.Active)
                {
                    e.Current.Value.Update();
                }
            }

            if (_sequences.Count > 0)
            {
                using (var set = TempCollection.GetSet <ISequence>())
                {
                    var e2 = _sequences.GetEnumerator();
                    while (e2.MoveNext())
                    {
                        if (e2.Current.Update())
                        {
                            set.Add(e2.Current);
                        }
                    }

                    if (set.Count > 0)
                    {
                        e2 = set.GetEnumerator();
                        while (e2.MoveNext())
                        {
                            _sequences.Remove(e2.Current);
                        }
                    }
                }
            }
        }
Ejemplo n.º 26
0
        public override int SenseAll <T>(ICollection <T> lst, System.Func <T, bool> p = null)
        {
            if (lst == null)
            {
                throw new System.ArgumentNullException("lst");
            }
            if (lst.IsReadOnly)
            {
                throw new System.ArgumentException("List to fill can not be read-only.", "lst");
            }
            if (_sensors == null)
            {
                this.SyncChildSensors();
            }
            if (_sensors.Length == 0)
            {
                return(0);
            }

            if (_mustBeVisibleByAll && _sensors.Length > 1)
            {
                using (var set = com.spacepuppy.Collections.TempCollection.GetSet <T>())
                {
                    int resultCnt = 0;
                    _sensors[0].SenseAll <T>(set, p);
                    var e = set.GetEnumerator();
                    while (e.MoveNext())
                    {
                        int cnt = 1;
                        for (int i = 1; i < _sensors.Length; i++)
                        {
                            if (!_sensors[i].Visible(e.Current))
                            {
                                cnt++;
                            }
                        }
                        if (cnt == _sensors.Length)
                        {
                            resultCnt++;
                            lst.Add(e.Current);
                        }
                    }
                    return(resultCnt);
                }
            }
            else
            {
                /*
                 * //todo - make distinct
                 * int cnt = 0;
                 * for (int i = 0; i < _sensors.Length; i++)
                 * {
                 *  cnt += _sensors[i].SenseAll<T>(lst, p);
                 * }
                 * return cnt;
                 */
                using (var set = TempCollection.GetSet <T>())
                {
                    for (int i = 0; i < _sensors.Length; i++)
                    {
                        _sensors[i].SenseAll <T>(set, p);
                    }

                    var e = set.GetEnumerator();
                    while (e.MoveNext())
                    {
                        lst.Add(e.Current);
                    }
                    return(set.Count);
                }
            }
        }
        public static int OverlapCapsule(Vector3 point1, Vector3 point2, float radius, ICollection<Collider> results,
                                         int layerMask = Physics.AllLayers, QueryTriggerInteraction query = QueryTriggerInteraction.UseGlobal)
        {
            if (results == null) throw new System.ArgumentNullException("results");

            //note, HashSets are inherently unique collections... so no need to check if contains during second and third overlaps
            using (var tmpSet = TempCollection.GetSet<Collider>())
            {
                if (VectorUtil.FuzzyEquals(point1, point2))
                {
                    int cnt = Physics.OverlapSphereNonAlloc(point1, radius, _nonallocColliderBuffer, layerMask, query);
                    for (int i = 0; i < cnt; i++)
                    {
                        tmpSet.Add(_nonallocColliderBuffer[i]);
                        _nonallocColliderBuffer[i] = null;
                    }
                }
                else
                {
                    if (_nonallocColliderBuffer == null) _nonallocColliderBuffer = new Collider[MAX_BUFFER];
                    if (_nonallocRaycastBuffer == null) _nonallocRaycastBuffer = new RaycastHit[MAX_BUFFER];

                    int cnt;
                    cnt = Physics.OverlapSphereNonAlloc(point1, radius, _nonallocColliderBuffer, layerMask, query);
                    for (int i = 0; i < cnt; i++)
                    {
                        tmpSet.Add(_nonallocColliderBuffer[i]);
                        _nonallocColliderBuffer[i] = null;
                    }

                    cnt = Physics.OverlapSphereNonAlloc(point2, radius, _nonallocColliderBuffer, layerMask, query);
                    for (int i = 0; i < cnt; i++)
                    {
                        tmpSet.Add(_nonallocColliderBuffer[i]);
                        _nonallocColliderBuffer[i] = null;
                    }

                    var dir = point2 - point1;
                    var dist = dir.magnitude;
                    cnt = Physics.SphereCastNonAlloc(point1, radius, dir.normalized, _nonallocRaycastBuffer, dist, layerMask, query);
                    for (int i = 0; i < cnt; i++)
                    {
                        tmpSet.Add(_nonallocRaycastBuffer[i].collider);
                        _nonallocRaycastBuffer[i] = default(RaycastHit);
                    }
                }

                //done, now fill collection
                if (results is Collider[])
                {
                    var arr = results as Collider[];
                    int cnt = Mathf.Min(arr.Length, tmpSet.Count);
                    int i = -1;
                    var e = tmpSet.GetEnumerator();
                    while (e.MoveNext() && ++i < cnt)
                    {
                        arr[i] = e.Current;
                    }
                    return cnt;
                }
                else
                {
                    if (results is List<Collider>)
                    {
                        var lst = results as List<Collider>;
                        var num = tmpSet.Count + lst.Count;
                        if (lst.Capacity < num) lst.Capacity = num;
                    }

                    var e = tmpSet.GetEnumerator();
                    while (e.MoveNext())
                    {
                        results.Add(e.Current);
                    }
                    return tmpSet.Count;
                }
            }
        }
Ejemplo n.º 28
0
        public static T[] GetAllFromSource <T>(object obj, bool includeChildren = false) where T : class
        {
            if (obj == null)
            {
                return(ArrayUtil.Empty <T>());
            }

            using (var set = TempCollection.GetSet <T>())
            {
                if (obj is T)
                {
                    set.Add(obj as T);
                }
                if (obj is IComponent)
                {
                    var c = (obj as IComponent).component;
                    if (c is T)
                    {
                        set.Add(c as T);
                    }
                }

                var go = GameObjectUtil.GetGameObjectFromSource(obj);
                if (go is T)
                {
                    set.Add(go as T);
                }

                //if (go != null && ComponentUtil.IsAcceptableComponentType(typeof(T))) go.GetComponentsAlt<T>(set);
                if (go != null)
                {
                    var tp = typeof(T);
                    if (typeof(SPEntity).IsAssignableFrom(tp))
                    {
                        var entity = SPEntity.Pool.GetFromSource(tp, go) as T;
                        if (entity != null)
                        {
                            set.Add(entity);
                        }
                    }
                    else if (typeof(UnityEngine.GameObject).IsAssignableFrom(tp))
                    {
                        if (includeChildren)
                        {
                            using (var lst = TempCollection.GetList <UnityEngine.Transform>())
                            {
                                go.GetComponentsInChildren <UnityEngine.Transform>(lst);

                                var e = lst.GetEnumerator();
                                while (e.MoveNext())
                                {
                                    set.Add(e.Current.gameObject as T);
                                }
                            }
                        }
                    }
                    if (ComponentUtil.IsAcceptableComponentType(tp))
                    {
                        if (includeChildren)
                        {
                            go.GetChildComponents <T>(set, true);
                        }
                        else
                        {
                            go.GetComponents <T>(set);
                        }
                    }
                }

                return(set.Count > 0 ? set.ToArray() : ArrayUtil.Empty <T>());
            }
        }
        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);
                }
            }
        }