2016-04-07 1 views
1

J'ai des objets dans mon jeu que je veux être invisible quand ils sont frappés par la lumièreUnity faire l'objet fondu lorsque touché par la lumière

L'effet que je suis à la recherche est quelque chose comme la lentille de la vérité de Zelda Ocarina of temps

Je l'ai travail en faisant Raycasts du lightsource dans le sens de mes objets et il est coins

Mais maintenant, je veux voir si je peux le faire fonctionner comme la lentille de la vérité (si la lumière frappe une partie de l'objet, il ne fait qu'éclipser cette partie

Shader "Custom/Matte Shadow" { 

Properties{ 
    _Color("Main Color", Color) = (1,1,1,1) 
    _MainTex("Base (RGB) Trans (A)", 2D) = "white" {} 
_Cutoff("Alpha cutoff", Range(0,1)) = 0.5 
} 

    SubShader{ 
    Tags{ "Queue" = "AlphaTest" "RenderType" = "TransparentCutout" } 
    LOD 200 
    Blend Zero SrcColor 
    Offset 0, -1 

    CGPROGRAM 

#pragma surface surf ShadowOnly alphatest:_Cutoff fullforwardshadows 

    fixed4 _Color; 

    struct Input { 
     float2 uv_MainTex; 
    }; 

    inline fixed4 LightingShadowOnly(SurfaceOutput s, fixed3 lightDir, fixed atten) { 
     fixed4 c; 

     c.rgb = s.Albedo*atten; 
     c.a = s.Alpha; 
     return c; 
    } 

    void surf(Input IN, inout SurfaceOutput o) { 
     fixed4 c = _Color; 
     o.Albedo = c.rgb; 
     o.Alpha = 0.0f; 
    } 
ENDCG 
} 
Fallback "Transparent/Cutout/VertexLit" 
} 

actuellement j'ai ce shader.

il rend l'objet transparent mais lorsqu'il est allumé, il reçoit des ombres. Le problème est que c'est encore visible, j'ai besoin qu'il soit invisible sous la LUMIÈRE et VISIBLE dans les OMBRES.

enter image description here

+0

Si par « Fondus » vous l'entendez devenir semi-transparent au fil du temps, je ne pense pas qu'il existe une solution sans toucher les shaders. –

Répondre

0

Si vos objets sont assez complexes, vous pouvez modifier le canal alpha par vertex en fonction de la quantité de lumière frappant. Quelqu'un a utilisé une approche similaire here pour le brouillard de guerre. Non en C#, mais pour vous donner une idée:

function RefreshFog() 
{ 
    while(true) 
    { 
     var mesh : Mesh = GetComponent(MeshFilter).mesh; 
     var vertices = mesh.vertices; 
     var colors = mesh.colors; 

     for(i=0;i<colors.length;i++) 
     { 
      //if the alpha of the mesh isnt 1, add 0.25 alpha on each time 
      //this should cause less of a flicker than a full reset to 1 alpha causes 
      //giving the fog a gradual regrowth feel 
      if(colors[i].a <= 1) 
      { 
       //getting the current colours alpha in a var 
       var f : float = colors[i].a; 
       //incrementing the alpha by 1/4 
       f += 0.1; 
       //f shouldnt go above 1, but incase this sets the alpha correctly 
       if(f > 1) 
       { 
        f = 1; 
       } 
       colors[i].a = f; 

      } 

     } 
     mesh.colors = colors; 

     yield WaitForSeconds(1); 
    } 
} 
+0

http://docs.unity3d.com/ScriptReference/WaitForSeconds.html –