void Start() { InjectReflectiveMaterialProperty scriptInjectReflectiveMaterialProperty = this.gameObject.AddComponent <InjectReflectiveMaterialProperty>(); reflectionPlaneGround = new GameObject("ReflectionPlaneGroundLevel"); reflectionPlaneGround.layer = LayerMask.NameToLayer("Water"); MeshFilter meshFilter = (MeshFilter)reflectionPlaneGround.AddComponent(typeof(MeshFilter)); meshFilter.mesh = CreateMesh(100000.0f, 100000.0f); // create quad with normal facing into negative y-direction (so it is not visible but it will trigger OnWillRenderObject() in MirrorReflection.cs) - should be big enough to be "visible" even when looking parallel to the x/z-plane MeshRenderer renderer = reflectionPlaneGround.AddComponent(typeof(MeshRenderer)) as MeshRenderer; renderer.material = new Material(ShaderInvisible); // switch to this material for reflection plane height debugging //renderer.material.shader = Shader.Find("Standard"); //Texture2D tex = new Texture2D(1, 1); //tex.SetPixel(0, 0, Color.green); //tex.Apply(); //renderer.material.mainTexture = tex; //renderer.material.color = Color.green; renderer.shadowCastingMode = ShadowCastingMode.Off; renderer.enabled = true; // if this is set to false OnWillRenderObject() in MirrorReflection.cs will not work (workaround would be to change OnWillRenderObject() to Update() mirrorRefl = reflectionPlaneGround.AddComponent <MirrorReflection>(); mirrorRefl.m_TextureWidth = floorReflectionTextureWidth; mirrorRefl.m_TextureHeight = floorReflectionTextureHeight; reflectionPlaneGround.transform.SetParent(this.transform); reflectionPlaneLowerLevel = new GameObject("ReflectionPlaneLowerLevel"); reflectionPlaneLowerLevel.layer = LayerMask.NameToLayer("Water"); MeshFilter meshFilterSeaLevel = (MeshFilter)reflectionPlaneLowerLevel.AddComponent(typeof(MeshFilter)); meshFilterSeaLevel.mesh = CreateMesh(1000000.0f, 1000000.0f); // create quad facing into negative y-direction (so it is not visible but it will trigger OnWillRenderObject() in MirrorReflection.cs) - should be big enough to be "visible" even when looking parallel to the x/z-plane MeshRenderer rendererSeaLevel = reflectionPlaneLowerLevel.AddComponent(typeof(MeshRenderer)) as MeshRenderer; rendererSeaLevel.material = new Material(ShaderInvisible); // switch to this material for reflection plane height debugging //rendererSeaLevel.material.shader = Shader.Find("Standard"); //Texture2D texSeaLevel = new Texture2D(1, 1); //texSeaLevel.SetPixel(0, 0, Color.green); //texSeaLevel.Apply(); //rendererSeaLevel.material.mainTexture = texSeaLevel; //rendererSeaLevel.material.color = Color.green; rendererSeaLevel.shadowCastingMode = ShadowCastingMode.Off; rendererSeaLevel.enabled = true; // if this is set to false OnWillRenderObject() in MirrorReflection.cs will not work (workaround would be to change OnWillRenderObject() to Update() mirrorReflSeaLevel = reflectionPlaneLowerLevel.AddComponent <MirrorReflection>(); mirrorReflSeaLevel.m_TextureWidth = lowerLevelReflectionTextureWidth; mirrorReflSeaLevel.m_TextureHeight = lowerLevelReflectionTextureHeight; reflectionPlaneLowerLevel.transform.SetParent(this.transform); LayerMask layerIndexWorldTerrain = LayerMask.NameToLayer("WorldTerrain"); if (layerIndexWorldTerrain != -1) { mirrorRefl.m_ReflectLayers.value = (1 << LayerMask.NameToLayer("Default")) + (1 << LayerMask.NameToLayer("WorldTerrain")); mirrorReflSeaLevel.m_ReflectLayers = (1 << LayerMask.NameToLayer("Default")) + (1 << LayerMask.NameToLayer("WorldTerrain")); //mirrorRefl.layerCullDistances[LayerMask.NameToLayer("Default")] = 15000; //mirrorRefl.layerCullDistances[LayerMask.NameToLayer("WorldTerrain")] = 200000; //mirrorReflSeaLevel.layerCullDistances[LayerMask.NameToLayer("Default")] = 0; //mirrorReflSeaLevel.layerCullDistances[LayerMask.NameToLayer("WorldTerrain")] = 200000; } else { mirrorRefl.m_ReflectLayers.value = 1 << LayerMask.NameToLayer("Default"); mirrorReflSeaLevel.m_ReflectLayers = 1 << LayerMask.NameToLayer("Default"); //mirrorRefl.layerCullDistances[LayerMask.NameToLayer("Default")] = 15000; //mirrorReflSeaLevel.layerCullDistances[LayerMask.NameToLayer("Default")] = 0; } useDeferredReflections = (GameManager.Instance.MainCamera.renderingPath == RenderingPath.DeferredShading); if (useDeferredReflections) { componentDeferredPlanarReflections = GameManager.Instance.MainCameraObject.AddComponent <RealtimeReflections.DeferredPlanarReflections>(); } if (!GameManager.Instance.IsPlayerInside) { playerEnvironment = PlayerEnvironment.Outdoors; UpdateBackgroundSettingsOutdoor(); } else if (GameManager.Instance.IsPlayerInsideBuilding) { playerEnvironment = PlayerEnvironment.Building; UpdateBackgroundSettingsIndoor(); } else { playerEnvironment = PlayerEnvironment.DungeonOrCastle; UpdateBackgroundSettingsIndoor(); } }
void Awake() { reflectionPlaneBottom = new GameObject("ReflectionPlaneBottom"); reflectionPlaneBottom.layer = LayerMask.NameToLayer("Water"); MeshFilter meshFilter = (MeshFilter)reflectionPlaneBottom.AddComponent(typeof(MeshFilter)); meshFilter.mesh = CreateMesh(100000.0f, 100000.0f); // create quad with normal facing into negative y-direction (so it is not visible but it will trigger OnWillRenderObject() in MirrorReflection.cs) - should be big enough to be "visible" even when looking parallel to the x/z-plane MeshRenderer renderer = reflectionPlaneBottom.AddComponent(typeof(MeshRenderer)) as MeshRenderer; renderer.material.shader = Shader.Find("Standard"); Texture2D tex = new Texture2D(1, 1); tex.SetPixel(0, 0, Color.green); tex.Apply(); renderer.material.mainTexture = tex; renderer.material.color = Color.green; renderer.shadowCastingMode = ShadowCastingMode.Off; renderer.enabled = true; // if this is set to false OnWillRenderObject() in MirrorReflection.cs will not work (workaround would be to change OnWillRenderObject() to Update() mirrorRefl = reflectionPlaneBottom.AddComponent <MirrorReflection>(); mirrorRefl.m_TextureWidth = floorReflectionTextureWidth; mirrorRefl.m_TextureHeight = floorReflectionTextureHeight; reflectionPlaneBottom.transform.SetParent(this.transform); InjectReflectiveMaterialProperty scriptInjectReflectiveMaterialProperty = reflectionPlaneBottom.AddComponent <InjectReflectiveMaterialProperty>(); // the inject script is parented to this plane so that the OnWillRenderObject() method of the inject script will work - this is important since update() function resulted in slightly delayed update which could be seen when ground level height changed reflectionPlaneSeaLevel = new GameObject("ReflectionPlaneSeaLevel"); reflectionPlaneSeaLevel.layer = LayerMask.NameToLayer("Water"); MeshFilter meshFilterSeaLevel = (MeshFilter)reflectionPlaneSeaLevel.AddComponent(typeof(MeshFilter)); meshFilterSeaLevel.mesh = CreateMesh(1000000.0f, 1000000.0f); // create quad facing into negative y-direction (so it is not visible but it will trigger OnWillRenderObject() in MirrorReflection.cs) - should be big enough to be "visible" even when looking parallel to the x/z-plane MeshRenderer rendererSeaLevel = reflectionPlaneSeaLevel.AddComponent(typeof(MeshRenderer)) as MeshRenderer; rendererSeaLevel.material.shader = Shader.Find("Standard"); Texture2D texSeaLevel = new Texture2D(1, 1); texSeaLevel.SetPixel(0, 0, Color.green); texSeaLevel.Apply(); rendererSeaLevel.material.mainTexture = texSeaLevel; rendererSeaLevel.material.color = Color.green; rendererSeaLevel.shadowCastingMode = ShadowCastingMode.Off; rendererSeaLevel.enabled = true; // if this is set to false OnWillRenderObject() in MirrorReflection.cs will not work (workaround would be to change OnWillRenderObject() to Update() mirrorReflSeaLevel = reflectionPlaneSeaLevel.AddComponent <MirrorReflection>(); mirrorReflSeaLevel.m_TextureWidth = lowerLevelReflectionTextureWidth; mirrorReflSeaLevel.m_TextureHeight = lowerLevelReflectionTextureHeight; reflectionPlaneSeaLevel.transform.SetParent(this.transform); LayerMask layerIndexWorldTerrain = LayerMask.NameToLayer("WorldTerrain"); if (layerIndexWorldTerrain != -1) { mirrorRefl.m_ReflectLayers.value = (1 << LayerMask.NameToLayer("Default")) + (1 << LayerMask.NameToLayer("WorldTerrain")); mirrorReflSeaLevel.m_ReflectLayers = (1 << LayerMask.NameToLayer("Default")) + (1 << LayerMask.NameToLayer("WorldTerrain")); //mirrorRefl.layerCullDistances[LayerMask.NameToLayer("Default")] = 15000; //mirrorRefl.layerCullDistances[LayerMask.NameToLayer("WorldTerrain")] = 200000; //mirrorReflSeaLevel.layerCullDistances[LayerMask.NameToLayer("Default")] = 0; //mirrorReflSeaLevel.layerCullDistances[LayerMask.NameToLayer("WorldTerrain")] = 200000; } else { mirrorRefl.m_ReflectLayers.value = 1 << LayerMask.NameToLayer("Default"); mirrorReflSeaLevel.m_ReflectLayers = 1 << LayerMask.NameToLayer("Default"); //mirrorRefl.layerCullDistances[LayerMask.NameToLayer("Default")] = 15000; //mirrorReflSeaLevel.layerCullDistances[LayerMask.NameToLayer("Default")] = 0; } useDeferredReflections = (GameManager.Instance.MainCamera.renderingPath == RenderingPath.DeferredShading); if (useDeferredReflections) { componentDeferredPlanarReflections = GameManager.Instance.MainCameraObject.AddComponent <RealtimeReflections.DeferredPlanarReflections>(); } playerInside = GameManager.Instance.IsPlayerInside; if (playerInside == true) { updateBackgroundSettingsIndoor(); } else { updateBackgroundSettingsOutdoor(); } PlayerEnterExit.OnTransitionInterior += OnTransitionToInterior; PlayerEnterExit.OnTransitionExterior += OnTransitionToExterior; PlayerEnterExit.OnTransitionDungeonInterior += OnTransitionToInterior; PlayerEnterExit.OnTransitionDungeonExterior += OnTransitionToExterior; }