document.write('
Data hosted with ♥ by Pastebin.com - Download Raw - See Original
  1.     public bool SeeGameObject(GameObject go)
  2.     {
  3.  
  4.         // if object has a renderer and visible by any camera and is in this camera frustum
  5.         if(go.renderer != null && go.renderer.isVisible && GeometryUtility.TestPlanesAABB(GeometryUtility.CalculateFrustumPlanes(_camera), go.renderer.bounds))
  6.         {
  7.             RaycastHit hitInfo;
  8.  
  9.             // by default we use the rough renderer bounds
  10.             Vector3 center = go.renderer.bounds.center;
  11.             Vector3 extents = go.renderer.bounds.extents;
  12.             float coefreduc = 0.8f;
  13.  
  14.             Vector3[] gobounds; // points to check for linecast from camera
  15.  
  16.             MeshFilter meshfilter = go.GetComponent<MeshFilter>();
  17.             if(meshfilter != null) // Almost every interesting game object that is render has a mesh
  18.             {
  19.                 center = go.transform.position;
  20.                 extents = meshfilter.mesh.bounds.extents;
  21.                 extents.Scale(go.transform.lossyScale);
  22.  
  23.                 gobounds = new Vector3[33]{ // We can add more or remove some, it increase precision for not too much time or memory cost
  24. Vector3.zero,
  25. go.transform.TransformDirection(new Vector3(extents.x,extents.y,extents.z)*0.9f),
  26. go.transform.TransformDirection(new Vector3(extents.x,extents.y,-extents.z)*0.9f),
  27. go.transform.TransformDirection(new Vector3(extents.x,-extents.y,extents.z)*0.9f),
  28. go.transform.TransformDirection(new Vector3(extents.x,-extents.y,-extents.z)*0.9f),
  29. go.transform.TransformDirection(new Vector3(-extents.x,extents.y,extents.z)*0.9f),
  30. go.transform.TransformDirection(new Vector3(-extents.x,extents.y,-extents.z)*0.9f),
  31. go.transform.TransformDirection(new Vector3(-extents.x,-extents.y,extents.z)*0.9f),
  32. go.transform.TransformDirection(new Vector3(-extents.x,-extents.y,-extents.z)*0.9f),
  33. go.transform.TransformDirection(new Vector3(extents.x,extents.y,extents.z)*0.5f),
  34. go.transform.TransformDirection(new Vector3(extents.x,extents.y,-extents.z)*0.5f),
  35. go.transform.TransformDirection(new Vector3(extents.x,-extents.y,extents.z)*0.5f),
  36. go.transform.TransformDirection(new Vector3(extents.x,-extents.y,-extents.z)*0.5f),
  37. go.transform.TransformDirection(new Vector3(-extents.x,extents.y,extents.z)*0.5f),
  38. go.transform.TransformDirection(new Vector3(-extents.x,extents.y,-extents.z)*0.5f),
  39. go.transform.TransformDirection(new Vector3(-extents.x,-extents.y,extents.z)*0.5f),
  40. go.transform.TransformDirection(new Vector3(-extents.x,-extents.y,-extents.z)*0.5f),
  41. go.transform.TransformDirection(new Vector3(extents.x,extents.y,extents.z)*0.75f),
  42. go.transform.TransformDirection(new Vector3(extents.x,extents.y,-extents.z)*0.75f),
  43. go.transform.TransformDirection(new Vector3(extents.x,-extents.y,extents.z)*0.75f),
  44. go.transform.TransformDirection(new Vector3(extents.x,-extents.y,-extents.z)*0.75f),
  45. go.transform.TransformDirection(new Vector3(-extents.x,extents.y,extents.z)*0.75f),
  46. go.transform.TransformDirection(new Vector3(-extents.x,extents.y,-extents.z)*0.75f),
  47. go.transform.TransformDirection(new Vector3(-extents.x,-extents.y,extents.z)*0.75f),
  48. go.transform.TransformDirection(new Vector3(-extents.x,-extents.y,-extents.z)*0.75f),
  49. go.transform.TransformDirection(new Vector3(extents.x,extents.y,extents.z)*0.25f),
  50. go.transform.TransformDirection(new Vector3(extents.x,extents.y,-extents.z)*0.25f),
  51. go.transform.TransformDirection(new Vector3(extents.x,-extents.y,extents.z)*0.25f),
  52. go.transform.TransformDirection(new Vector3(extents.x,-extents.y,-extents.z)*0.25f),
  53. go.transform.TransformDirection(new Vector3(-extents.x,extents.y,extents.z)*0.25f),
  54. go.transform.TransformDirection(new Vector3(-extents.x,extents.y,-extents.z)*0.25f),
  55. go.transform.TransformDirection(new Vector3(-extents.x,-extents.y,extents.z)*0.25f),
  56. go.transform.TransformDirection(new Vector3(-extents.x,-extents.y,-extents.z)*0.25f)
  57.                 };
  58.             }
  59.             else // Only if gameobject has no mesh (= almost never) (Very approximately checking points using the renderer bounds and not the mesh bounds)
  60.             {
  61.                 gobounds  = new Vector3[9]{
  62.                     Vector3.zero,
  63.                     new Vector3(extents.x,extents.y,extents.z)*coefreduc,
  64.                     new Vector3(extents.x,extents.y,-extents.z)*coefreduc,
  65.                     new Vector3(extents.x,-extents.y,extents.z)*coefreduc,
  66.                     new Vector3(extents.x,-extents.y,-extents.z)*coefreduc,
  67.                     new Vector3(-extents.x,extents.y,extents.z)*coefreduc,
  68.                     new Vector3(-extents.x,extents.y,-extents.z)*coefreduc,
  69.                     new Vector3(-extents.x,-extents.y,extents.z)*coefreduc,
  70.                     new Vector3(-extents.x,-extents.y,-extents.z)*coefreduc
  71.                 };
  72.             }
  73.  
  74.             foreach(Vector3 v in gobounds)
  75.             {
  76.                 // test if it can see gameobject
  77.                 if(GeometryUtility.TestPlanesAABB(GeometryUtility.CalculateFrustumPlanes(_camera), new Bounds(v+center, Vector3.zero)) // if point in viewing frustrum
  78.                    && (!Physics.Linecast(transform.position, v+center, out hitInfo) || hitInfo.collider.gameObject == go )) // if nothing between viewing position and point
  79.                 {
  80.                     if(graphicalDebug)
  81.                     {
  82.                         Debug.DrawLine(transform.position,  v+center,Color.red, 0.01f, false);
  83.                     }
  84.                     return true;
  85.                 }
  86.             }
  87.            
  88.         }
  89.        
  90.         return false;
  91.  
  92.     }
');