topical media & game development

talk show tell print

lib-unity-tutorial-platform-start-Assets-Scripts-Camera-FadeoutLineOfSight.js / js



  /* Fades out any objects between the player and this transform.
     The renderers shader is first changed to be an Alpha/Diffuse, then alpha is faded out to fadedOutAlpha.
     Only objects 
     
     In order to catch all occluders, 5 rays are casted. occlusionRadius is the distance between them.
  */
  var layerMask : LayerMask = 2;
  var target : Transform;
  var fadeSpeed = 1.0;
  var occlusionRadius = .3;
  var fadedOutAlpha = 0.3;
  
  private var fadedOutObjects = Array ();
  
  class FadeoutLOSInfo
  {
          var renderer : Renderer;
          var originalMaterials : Material[];
          var alphaMaterials : Material[];
          var needFadeOut = true;
  }
  
  function FindLosInfo (r : Renderer) : FadeoutLOSInfo
  {
          for (var fade : FadeoutLOSInfo in fadedOutObjects)
          {
                  if (r == fade.renderer)
                          return fade;
          }
          return null;
  }
  
  function LateUpdate () {
          var from = transform.position;
          var to = target.position;
          var castDistance = Vector3.Distance(to, from);
          
          // Mark all objects as not needing fade out
          for (var fade : FadeoutLOSInfo in fadedOutObjects)
          {
                  fade.needFadeOut = false;
          }
          
          var offsets = [Vector3(0, 0, 0), Vector3(0, occlusionRadius, 0), Vector3(0, -occlusionRadius, 0), Vector3(occlusionRadius, 0, 0), Vector3(-occlusionRadius, 0, 0)];
          
          // We cast 5 rays to really make sure even occluders that are partly occluding the player are faded out
          for (var offset in offsets)
          {
                  var relativeOffset = transform.TransformDirection(offset);
                  // Find all blocking objects which we want to hide
                  var hits : RaycastHit[] = Physics.RaycastAll(from + relativeOffset, to - from, castDistance, layerMask.value);
                  for (var hit : RaycastHit in hits)
                  {
                          // Make sure we have a renderer
                          var hitRenderer : Renderer = hit.collider.renderer;                
                          if (hitRenderer == null || !hitRenderer.enabled)
                                  continue;
                          
                          var info = FindLosInfo(hitRenderer);
          
                          // We are not fading this renderer already, so insert into faded objects map
                          if (info == null)
                          {
                                  info = new FadeoutLOSInfo ();
                                  info.originalMaterials = hitRenderer.sharedMaterials;
                                  info.alphaMaterials = new Material[info.originalMaterials.length];
                                  info.renderer = hitRenderer;
                                  for (var i=0;i<info.originalMaterials.length;i++)
                                  {
                                          var newMaterial = new Material (Shader.Find("Alpha/Diffuse"));
                                          newMaterial.mainTexture = info.originalMaterials[i].mainTexture;        
                                          newMaterial.color = info.originalMaterials[i].color;
                                          newMaterial.color.a = 1.0;
                                          info.alphaMaterials[i] = newMaterial;
                                  }
                                  
                                  hitRenderer.sharedMaterials = info.alphaMaterials;
                                  fadedOutObjects.Add(info);
                          }
                          // Just mark the renderer as needing fade out
                          else
                          {
                                  info.needFadeOut = true;
                          }
                  }
          }
                  
          // Now go over all renderers and do the actual fading!
          var fadeDelta = fadeSpeed * Time.deltaTime;
          for (i=0;i<fadedOutObjects.Count;i++)
          {
                  var fade = fadedOutObjects[i];
                  // Fade out up to minimum alpha value
                  if (fade.needFadeOut)
                  {
                          for (var alphaMaterial : Material in fade.alphaMaterials)
                          {
                                  var alpha = alphaMaterial.color.a;
                                  alpha -= fadeDelta;
                                  alpha = Mathf.Max(alpha, fadedOutAlpha);
                                  alphaMaterial.color.a = alpha;
                          }
                  }
                  // Fade back in
                  else
                  {
                          var totallyFadedIn = 0;
                          for (var alphaMaterial : Material in fade.alphaMaterials)
                          {
                                  alpha = alphaMaterial.color.a;
                                  alpha += fadeDelta;
                                  alpha = Mathf.Min(alpha, 1.0);
                                  alphaMaterial.color.a = alpha;
                                  if (alpha >= 0.99)
                                          totallyFadedIn++;
                          }
                          
                          // All alpha materials are faded back to 100%
                          // Thus we can switch back to the original materials
                          if (totallyFadedIn == fade.alphaMaterials.length)
                          {
                                  if (fade.renderer)
                                          fade.renderer.sharedMaterials = fade.originalMaterials;
                                          
                                  for (var newMaterial in fade.alphaMaterials)
                                          Destroy(newMaterial);
                                  
                                  fadedOutObjects.RemoveAt(i);
                                  i--;
                          }
                  }
          }
  }
  
  @script AddComponentMenu ("Third Person Camera/Fadeout Line of Sight")


(C) Æliens 04/09/2009

You may not copy or print any of this material without explicit permission of the author or the publisher. In case of other copyright issues, contact the author.