| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081 | using System.Collections;using System.Collections.Generic;using UnityEngine;public class BFX_BloodDecalLayers : MonoBehaviour{    public LayerMask DecalLayers = 1;    public DecalLayersProperty DecalRenderingMode = DecalLayersProperty.DrawToSelectedLayers;    public DepthMode LayerDepthResoulution = DepthMode.FullScreen;    DepthTextureMode defaultMode;    RenderTexture rt;    Camera depthCamera;    void OnEnable()    {        var currentCam = GetComponent<Camera>();        defaultMode = currentCam.depthTextureMode;        if (currentCam.renderingPath == RenderingPath.Forward)        {            currentCam.depthTextureMode |= DepthTextureMode.Depth;        }        var go = new GameObject("DecalLayersCamera");        go.transform.parent = currentCam.transform;        go.transform.localPosition = Vector3.zero;        go.transform.localRotation = Quaternion.identity;        depthCamera = go.AddComponent<Camera>();        depthCamera.CopyFrom(currentCam);        depthCamera.renderingPath = RenderingPath.Forward;        depthCamera.depth = currentCam.depth - 1;        depthCamera.cullingMask = DecalLayers;        CreateDepthTexture();        depthCamera.targetTexture = rt;        Shader.SetGlobalTexture("_LayerDecalDepthTexture", rt);        Shader.EnableKeyword("USE_CUSTOM_DECAL_LAYERS");        if (DecalRenderingMode == DecalLayersProperty.IgnoreSelectedLayers) Shader.EnableKeyword("USE_CUSTOM_DECAL_LAYERS_IGNORE_MODE");    }    void OnDisable()    {        GetComponent<Camera>().depthTextureMode = defaultMode;        RenderTexture.ReleaseTemporary(rt);        Shader.DisableKeyword("USE_CUSTOM_DECAL_LAYERS");        if (DecalRenderingMode == DecalLayersProperty.IgnoreSelectedLayers) Shader.DisableKeyword("USE_CUSTOM_DECAL_LAYERS_IGNORE_MODE");    }    void CreateDepthTexture()    {        switch (LayerDepthResoulution)        {            case DepthMode.FullScreen:                rt = RenderTexture.GetTemporary(Screen.width, Screen.height, 24, RenderTextureFormat.Depth);                break;            case DepthMode.HalfScreen:                rt = RenderTexture.GetTemporary((int)(Screen.width * 0.5f), (int)(Screen.height * 0.5f), 24, RenderTextureFormat.Depth);                break;            case DepthMode.QuarterScreen:                rt = RenderTexture.GetTemporary((int)(Screen.width * 0.25f), (int)(Screen.height * 0.25f), 24, RenderTextureFormat.Depth);                break;            default:                break;        };    }    public enum DecalLayersProperty    {        DrawToSelectedLayers,        IgnoreSelectedLayers    }    public enum DepthMode    {        FullScreen,        HalfScreen,        QuarterScreen    }}
 |