using System; using System.Collections; using System.Collections.Generic; using System.Linq; using UnityEngine; using UnityEngine.Rendering; public class AddShadow : MonoBehaviour { public Camera SceneCam; public Light PointLight; private Camera shadowCam; public Shader PostShader; private List<Light> lights; // Start is called before the first frame update void Start() { lights = FindObjectsOfType<Light>().ToList(); shadowCam = GetComponent<Camera>(); } private AmbientMode cacheAmbientMode; private Color cacheAmbientSkyColor; private float cacheAmbientIntensity; private Material cacheSkybox; void OnPreRender() { //Debug.Log("PRE " + (Camera.current == shadowCam)); //lights.ForEach(l => l.enabled = false); PointLight.intensity = 1; cacheAmbientMode = RenderSettings.ambientMode; cacheSkybox = RenderSettings.skybox; cacheAmbientSkyColor = RenderSettings.ambientSkyColor; cacheAmbientIntensity = RenderSettings.ambientIntensity; RenderSettings.ambientMode = AmbientMode.Flat; RenderSettings.skybox = null; RenderSettings.ambientSkyColor = new Color(0, 0, 0, 1); RenderSettings.ambientIntensity = 0; } void OnPostRender() { //Debug.Log("POST " + (Camera.current == shadowCam)); PointLight.intensity = 1; //lights.ForEach(l => l.enabled = true); RenderSettings.ambientMode = cacheAmbientMode; RenderSettings.skybox = cacheSkybox; RenderSettings.ambientSkyColor = cacheAmbientSkyColor; RenderSettings.ambientIntensity = cacheAmbientIntensity; } // Update is called once per frame void Update() { shadowCam.CopyFrom(SceneCam); shadowCam.clearFlags = CameraClearFlags.Depth; shadowCam.SetReplacementShader(PostShader, ""); shadowCam.cullingMask = ~LayerMask.GetMask("NoShadow"); } }