Unityで近づくと見えるシェーダー

こんにちは。Kishiです。今回はUnityでマリオギャラクシーのどこかのステージにあったような、近づくと見えるシェーダーを作ってみました。影もちゃんとついています。

非常に簡単です。Surface Shaderでも色々できるんですね。

まずはshader

</p>
<p>Shader &quot;Custom/hole_shader_complete&quot; {<br />
	Properties{<br />
		_MainColor(&quot;Color&quot;, Color) = (1,1,1)<br />
		_MainTex(&quot;Texture&quot;, 2D) = &quot;white&quot; {}<br />
		_BumpMap(&quot;Bumpmap&quot;, 2D) = &quot;bump&quot; {}<br />
		_PlayerPos(&quot;Player Position&quot;, Vector) = (0.0, 0.0, 0.0, 1.0)<br />
	}<br />
	SubShader{<br />
		Tags{ &quot;RenderType&quot; = &quot;Opaque&quot; }<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 &lt; 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 &quot;Diffuse&quot;<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&lt;Renderer&gt;().material.SetVector(&quot;_PlayerPos&quot;, player_.transform.position);<br />
	}</p>
<p>	// Update is called once per frame<br />
	void Update () {<br />
		GetComponent&lt;Renderer&gt;().material.SetVector(&quot;_PlayerPos&quot;, player_.transform.position);</p>
<p>	}<br />
}<br />

以上です。

Posted on