using System.Collections.Generic; using UnityEngine; [ExecuteInEditMode] public class FogVolumeData : MonoBehaviour { [SerializeField] bool _ForceNoRenderer; public bool ForceNoRenderer { get { return _ForceNoRenderer; } set { if (_ForceNoRenderer != value) { _ForceNoRenderer = value; ToggleFogVolumeRenderers(); } } } [SerializeField] Camera _GameCamera; public Camera GameCamera { get { return _GameCamera; } set { if (_GameCamera != value) { _GameCamera = value; RefreshCamera(); } } } public void setDownsample(int val) { if (_GameCamera.GetComponent()) _GameCamera.GetComponent()._Downsample = val; } void RefreshCamera() { //refresh all fog folumes assigned camera //print("Refresh"); FindFogVolumes(); foreach (FogVolume _FogVolumes in SceneFogVolumes) { _FogVolumes.AssignCamera(); } ToggleFogVolumeRenderers(); } [SerializeField] List FoundCameras; void OnEnable() { Initialize(); } void Initialize() { if (FoundCameras == null) FoundCameras = new List(); FindCamera(); RefreshCamera(); if (FoundCameras.Count == 0) Debug.Log("Definetly, no camera available for Fog Volume"); } [SerializeField] FogVolume[] SceneFogVolumes; public void FindFogVolumes() { SceneFogVolumes = (FogVolume[])FindObjectsOfType(typeof(FogVolume)); } void Update() { if (GameCamera == null) { Debug.Log("No Camera available for Fog Volume. Trying to find another one"); Initialize(); } #if UNITY_EDITOR for (int i = 0; i < SceneFogVolumes.Length; i++) { FogVolume SlotFogVolume = SceneFogVolumes[i]; if(SlotFogVolume==null) { //reset and rebuild SceneFogVolumes = null; FindFogVolumes(); } } if (SceneFogVolumes.Length == 0) DestroyImmediate(gameObject); #endif } void ToggleFogVolumeRenderers() { if (FoundCameras != null) for (int i = 0; i < FoundCameras.Count; i++) { if (FoundCameras[i] != _GameCamera) { if (FoundCameras[i].GetComponent()) FoundCameras[i].GetComponent().enabled = false; } else if (FoundCameras[i].GetComponent() && !_ForceNoRenderer) { FoundCameras[i].GetComponent().enabled = true; } else { var FVRenderer = FoundCameras[i].GetComponent(); if (FVRenderer == null) { if (ForceNoRenderer) { continue; } FVRenderer = FoundCameras[i].gameObject.AddComponent(); } if(ForceNoRenderer) { FVRenderer.enabled = false; } } } } public void FindCamera() { //We will try to assign the typical MainCamera first. This search will be performed only when the field is null //This is just an initial attempt on assigning any camera available when the field 'Camera' is null. //We will be able to select any other camera later if (FoundCameras != null && FoundCameras.Count > 0) FoundCameras.Clear(); //Find all cameras in scene and store Camera[] CamerasFound = (Camera[])FindObjectsOfType(typeof(Camera)); for (int i = 0; i < CamerasFound.Length; i++) if ( !CamerasFound[i].name.Contains("FogVolumeCamera") && !CamerasFound[i].name.Contains("Shadow Camera") && CamerasFound[i].gameObject.hideFlags == HideFlags.None)//not you! FoundCameras.Add(CamerasFound[i]); if (GameCamera == null) GameCamera = Camera.main; //No MainCamera? Try to find any! if (GameCamera == null) { foreach (Camera FoundCamera in FoundCameras) { // Many effects may use hidden cameras, so let's filter a little bit until we get something valid if (FoundCamera.isActiveAndEnabled) if (FoundCamera.gameObject.activeInHierarchy) if (FoundCamera.gameObject.hideFlags == HideFlags.None) { GameCamera = FoundCamera; break; } } } if (GameCamera != null) { // Debug.Log("Fog Volume has been assigned with camera: " + GameCamera); //if (FindObjectOfType()) // FindObjectOfType().SceneCamera = GameCamera; //NOTE: This makes sure we have a depth texture which will be either free (deferred, etc) or internally generated through a replacement shader //Now, objects must be able to do shadow casting. If you’re using surface shaders, add the "addshadow" directive //only “opaque” objects (that which have their materials and shaders setup to use render queue <= 2500) are rendered into the depth texture. //GameCamera.depthTextureMode = DepthTextureMode.Depth; } } public Camera GetFogVolumeCamera { get { return GameCamera; } } void OnDisable() { FoundCameras.Clear(); SceneFogVolumes = null; } }