Example #1
0
        /// <summary>
        /// Discover all Colliders within zone
        /// </summary>
        /// <param name="trs"></param>
        /// <param name="layerMask">Default: Ignore "PlayerAvater" layers</param>
        /// <returns></returns>
        public override Collider[] OverlapZone(Matrix4x4 trs, int layerMask = ~8)
        {
            // TODO: Add scaling
            if (!ScaleWithAnchor)
            {
                trs = Matrix4x4.TRS(trs.GetPosition(), trs.GetRotation(), Vector3.one);
            }

            var position = trs.MultiplyPoint(Centre);
            var rotation = trs.GetRotation();
            var scale    = ScaleWithAnchor ? trs.GetScale() : Vector3.one;

            var inRange = Physics.OverlapSphere(position, PrimeRadius, layerMask);

            var results = new List <Collider>();

            foreach (var collider in inRange)
            {
                if (collider == null)
                {
                    continue;
                }
                if (!CanAffectTags.Contains(collider.gameObject.tag))
                {
                    continue;
                }

                var worldOffset = collider.transform.position - position;

                //var localOffset = origin.transform.InverseTransformVector(worldOffset);
                var localOffset = Quaternion.Inverse(rotation) * worldOffset;

                // From https://stackoverflow.com/questions/17770555/how-to-check-if-a-point-is-inside-an-ellipsoid
                // (x/a)^2 + (y/b)^2 + (z/c)^2 <= 1

                var scaledOffset = Vector3.Scale(localOffset, Ratios);


                if (scaledOffset.magnitude > 1)
                {
                    continue;
                }

                // Add to list
                results.Add(collider);
            }

            return(results.ToArray());
        }
Example #2
0
        /// <summary>
        /// Discover all Colliders within zone
        /// </summary>
        /// <param name="trs"></param>
        /// <param name="layerMask">Default: Ignore "PlayerAvater" layers</param>
        /// <returns></returns>
        public override Collider[] OverlapZone(Matrix4x4 trs, int layerMask = ~8)
        {
            if (!OffsetsKnown)
            {
                FindOffsets();
            }

            // TODO:  Implement Scaling
            var rotation = trs.GetRotation();
            var scale    = ScaleWithAnchor ? trs.GetScale() : Vector3.one;

            var derivedOrigin = trs.MultiplyPoint(OriginDelta);

            var range = Physics.OverlapSphere(derivedOrigin, SphereRadius, layerMask);

            var results = new List <Collider>();

            foreach (var collider in range)
            {
                if (collider == null)
                {
                    continue;
                }
                if (!CanAffectTags.Contains(collider.gameObject.tag))
                {
                    continue;
                }

                // Check collider is within angle and min range
                var direction = (collider.transform.position - derivedOrigin).normalized;
                var dot       = Vector3.Dot(direction, trs.MultiplyVector(Vector3.forward));

                if (dot < ConeDotMinimum || direction.magnitude < OriginDelta.z)
                {
                    continue;
                }

                // Add to list
                results.Add(collider);
            }

            return(results.ToArray());
        }
Example #3
0
        //public GameObject DebuggingPrefab;

        /// <summary>
        /// Discover all Colliders within zone
        /// </summary>
        /// <param name="origin"></param>
        /// <param name="layerMask">Default: Ignore "PlayerAvater" layers</param>
        /// <returns></returns>
        public override Collider[] OverlapZone(Matrix4x4 trs, int layerMask = ~8)
        {
            var position = trs.MultiplyPoint(Bounds.center);
            var rotation = trs.GetRotation();
            var scale    = trs.GetScale();

            var extents = Vector3.Scale(Bounds.extents, scale);


#if DEBUG
            var prefab = Instantiate(Resources.Load <GameObject>("CuboidZonePrefab"), position, rotation);
            if (prefab != null)
            {
                // Render Zone
                prefab.transform.localScale = extents;

                Destroy(prefab, 0.8f);
            }
#endif


            return(Physics.OverlapBox(position, extents / 2, rotation, layerMask).Where(m => CanAffectTags.Contains(m.tag)).ToArray());
        }