这一节我们要实现下面的效果

unity 物体自发光 unity外发光带光晕_unity 物体自发光

(图一)


unity 物体自发光 unity外发光带光晕_Unity Shader_02

(图二)


首先针对图一我们创建一个材质,并把颜色改成红色的,然后我们就得到了一个很普通的红色小球。

unity 物体自发光 unity外发光带光晕_unity 物体自发光_03

我们只需要在鼠标进入的时候把材质的Shader换成带边缘光的Shader就行了。

我们新建一个c#文件取名为ShowSelected.cs.然后把这个脚本文件赋值给小球。

我们来看一下ShowSelected.cs中的代码,几乎每一句都有注释:

using UnityEngine;
using System.Collections;

public class ShowSelected : MonoBehaviour {
	
	public Shader selectedShader;
	public Color outterColor;

	
	private Color myColor ;
	private Shader myShader;
	private bool Selected = false;
	
	// Use this for initialization
	void Start () {
		//保存原来的颜色值和shader,以便鼠标移出时恢复
		myColor = GetComponent<Renderer>().material.color;
		myShader = GetComponent<Renderer>().material.shader;
		//鼠标移入时要使用的shader
		selectedShader = Shader.Find("Custom/Rim Lighting2");
		if(!selectedShader)
		{
			enabled = false;
			return;
		}
	}
	//鼠标进入
	 void OnMouseEnter() {
		//替换Shader
		GetComponent<Renderer>().material.shader = selectedShader;
		//设置边缘光颜色值
		GetComponent<Renderer>().material.SetColor("_RimColor",outterColor);
		//设置纹理颜色值
		GetComponent<Renderer>().material.SetColor("_MainColor",myColor);
    }
	//鼠标移出
	void OnMouseExit(){
		//恢复颜色值
		GetComponent<Renderer>().material.color = myColor;
		//恢复shader
		GetComponent<Renderer>().material.shader = myShader;
	}
}




我们来看一下带边缘光的Shader的代码:

Shader "Custom/Rim Lighting2" {
		 //属性域
		Properties {
			//纹理颜色
			 _MainColor ("Main Color", Color) = (1,1,1,1)
			  //主纹理属性
			  _MainTex ("Texture", 2D) = "white" {}
			  //法线贴图纹理属性
			  _BumpMap ("Bumpmap", 2D) = "bump" {}
			  //边缘光颜色值
			  _RimColor ("Rim Color", Color) = (1,1,1,1)
			  //边缘光强度值
			  _RimPower ("Rim Power", Range(0.5,8.0)) = 3.0
	    }
		SubShader {
			  //标明渲染类型是不透明的物体
			  Tags { "RenderType" = "Opaque" }
			  //标明CG程序的开始
			  CGPROGRAM
			  //声明表面着色器函数
			  #pragma surface surf Lambert
			  //定义着色器函数输入的参数Input
			  struct Input {
			  	  //主纹理坐标值
			      float2 uv_MainTex;
			      //法线贴图坐标值
			      float2 uv_BumpMap;
			      //视图方向
			      float3 viewDir;
			  };
			  //声明对属性的引用
			  float4 _MainColor;
			  sampler2D _MainTex;
			  sampler2D _BumpMap;
			  float4 _RimColor;
			  float _RimPower;
			  //表面着色器函数
			  void surf (Input IN, inout SurfaceOutput o) {
			  	  fixed4 tex = tex2D(_MainTex, IN.uv_MainTex);
			  	  
			  	  //赋值颜色信息
				  o.Albedo = tex.rgb * _MainColor.rgb;
			      //赋值法线信息
			      o.Normal = UnpackNormal (tex2D (_BumpMap, IN.uv_BumpMap));
			      half rim = 1.0 - saturate(dot (normalize(IN.viewDir), o.Normal));
			      //赋值自发光颜色信息
			      o.Emission = _RimColor.rgb * pow (rim, _RimPower);
			  }
			  //标明CG程序的结束
			  ENDCG
		} 
	    Fallback "Diffuse"
}



这样就可以实现图一中的效果了


我们来看看图二的效果是怎么实现的

同样我们新建一个C#文件,取名为ShowSelectedBump.cs,我们来看一下这个CS文件中的代码,同样每一句都有注释

using UnityEngine;
using System.Collections;

public class ShowSelectedBump : MonoBehaviour {

	public Shader selectedShader;
	public Color outterColor;

	
	private Color myColor ;
	private Shader myShader;
	private SkinnedMeshRenderer sRenderer;
	private bool Selected = false;

	// Use this for initialization
	void Start () {
		sRenderer = GetComponentInChildren<SkinnedMeshRenderer>();
		//保存原来的颜色值和shader,以便鼠标移出时恢复
		myColor = sRenderer.material.color;
		myShader = sRenderer.material.shader;
		//鼠标移入时要使用的shader
		selectedShader = Shader.Find("Custom/RimLightSpecBump");
		if(!selectedShader)
		{
			enabled = false;
			return;
		}
	}

	//鼠标进入
	void OnMouseEnter() {
		//替换Shader
		sRenderer.material.shader = selectedShader;
		//设置边缘光颜色值
		sRenderer.material.SetColor("_RimColor",outterColor);
		//设置纹理颜色值
		sRenderer.material.SetColor("_MainColor",myColor);
    }
	//鼠标移出
	void OnMouseExit(){
		//恢复颜色值
		sRenderer.material.color = myColor;
		//恢复shader
		sRenderer.material.shader = myShader;
	}
	
}

我们看到处理动画模型的ShowSelectedBump.cs和ShowSelected.cs唯一不同的是这一句代码

sRenderer = GetComponentInChildren<SkinnedMeshRenderer>();



只是获取模型的渲染组件不同而已,我们的shader文件用的是同一个。

这样就可以很方便的实现图二的效果了。