Unityで近づくと見えるシェーダー
こんにちは。Kishiです。今回はUnityでマリオギャラクシーのどこかのステージにあったような、近づくと見えるシェーダーを作ってみました。影もちゃんとついています。
非常に簡単です。Surface Shaderでも色々できるんですね。
まずはshader
</p>
<p>Shader "Custom/hole_shader_complete" {<br />
Properties{<br />
_MainColor("Color", Color) = (1,1,1)<br />
_MainTex("Texture", 2D) = "white" {}<br />
_BumpMap("Bumpmap", 2D) = "bump" {}<br />
_PlayerPos("Player Position", Vector) = (0.0, 0.0, 0.0, 1.0)<br />
}<br />
SubShader{<br />
Tags{ "RenderType" = "Opaque" }<br />
CGPROGRAM<br />
#pragma surface surf Lambert</p>
<p> struct Input {<br />
float2 uv_MainTex;<br />
float2 uv_BumpMap;<br />
float4 color : COLOR;<br />
float3 worldPos;<br />
};<br />
float4 _MainColor;<br />
sampler2D _MainTex;<br />
sampler2D _BumpMap;<br />
float4 _PlayerPos;</p>
<p> void surf(Input IN, inout SurfaceOutput o) {<br />
float4 c = tex2D(_MainTex, IN.uv_MainTex) * _MainColor;<br />
float dist = distance(IN.worldPos, _PlayerPos);</p>
<p> if (dist < 5.0) {<br />
o.Albedo = c.rgb;<br />
o.Alpha = c.a;<br />
o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap));<br />
}<br />
else {<br />
clip(-1);<br />
}</p>
<p> }<br />
ENDCG<br />
}<br />
Fallback "Diffuse"<br />
}<br />
次は消したいものにつけるC#コード
<br />
using UnityEngine;<br />
using System.Collections;</p>
<p>public class HoleOther : MonoBehaviour {<br />
[SerializeField]<br />
GameObject player_;</p>
<p> // Use this for initialization<br />
void Start () {<br />
GetComponent<Renderer>().material.SetVector("_PlayerPos", player_.transform.position);<br />
}</p>
<p> // Update is called once per frame<br />
void Update () {<br />
GetComponent<Renderer>().material.SetVector("_PlayerPos", player_.transform.position);</p>
<p> }<br />
}<br />
以上です。
Posted on: 2016年2月29日, by : TRSasasusu