protected override bool TestVisibility(VisualAspect aspect) { //if not in cylinder, can not see it float aspRad = aspect.Radius; if (aspRad > MathUtil.EPSILON) { if (!Cone.ContainsSphere(this.transform.position, this.transform.position + this.Direction * _range, _startRadius, _endRadius, aspect.transform.position, aspRad)) { return(false); } } else { if (!Cone.ContainsPoint(this.transform.position, this.transform.position + this.Direction * _range, _startRadius, _endRadius, aspect.transform.position)) { return(false); } } if (this.RequiresLineOfSight) { var v = aspect.transform.position - this.transform.position; using (var lst = com.spacepuppy.Collections.TempCollection.GetList <RaycastHit>()) { int cnt = PhysicsUtil.RaycastAll(this.transform.position, v, lst, v.magnitude, this.LineOfSightMask); for (int i = 0; i < cnt; i++) { //we ignore ourself var r = lst[i].collider.FindRoot(); if (r != aspect.entityRoot && r != this.entityRoot) { return(false); } } } } return(true); }