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