using UnityEngine; using System.Collections; [ExecuteInEditMode] public class Shadow : MonoBehaviour { public Camera m_ShadowCamera; private RenderTexture m_RT; public Material m_Mat; void Start() { GetComponent().enabled = true; //创建一个纹理,用来捕获照相机的看到的(该纹理既为我们需要的影子的源纹理) m_RT = new RenderTexture(512, 512, 0, RenderTextureFormat.ARGB32); m_RT.anisoLevel = 8; m_ShadowCamera.targetTexture = m_RT; //将上面的纹理传入材质球中,用来将它处理为影子 m_Mat.SetTexture("_MainTex", m_RT); } void LateUpdate() { //实时将生成影子需要的纹理的照相机的矩阵传入材质球,这两个矩阵在下面的着色器代码中使用 m_Mat.SetTexture("_MainTex", m_RT); m_Mat.SetMatrix("_WorldToCameraMatrix", m_ShadowCamera.worldToCameraMatrix); m_Mat.SetMatrix("_ProjectionMatrix", m_ShadowCamera.projectionMatrix); } void OnDrawGizmos() { if (!Application.isEditor) return; m_Mat.SetTexture("_MainTex", m_RT); //实时将生成影子需要的纹理的照相机的矩阵传入材质球,这两个矩阵在下面的着色器代码中使用 m_Mat.SetMatrix("_WorldToCameraMatrix", m_ShadowCamera.worldToCameraMatrix); m_Mat.SetMatrix("_ProjectionMatrix", m_ShadowCamera.projectionMatrix); } public void OpenShadow() { if (m_ShadowCamera.enabled) { m_ShadowCamera.enabled = false; GetComponent().enabled = false; } else { m_ShadowCamera.enabled = true; GetComponent().enabled = true; } } }