unity屏幕受伤特效

cs 复制代码
//使用用途:同于屏幕掉血的后处理特效
//请结合和脚本:BloodScreen 挂载至摄像机使用本特效
//本特效设计之初未考虑兼容移动设备,请注意

//使用说明:
//掉血获取此脚本,将showBlood设置为true,如果您需要更深的效果可将Alpha控制调节更高,控制上程序限制不小于0.5
//如果让血消失将showBlood设置为false即可

using UnityEngine;
using System.Collections;

[ExecuteInEditMode]
[AddComponentMenu("Learn/BloodScreen")]
public class CameraFilterPack : MonoBehaviour
{
    public Shader SCShader;
    [Range(0, 1)]
    public float Alpha =0.5f;

    public bool showBlood = false;

    [Range(0, 1f)]
    public float LightReflect = 1f;

    private Material SCMaterial;
    public Texture2D Texture2;

    Material material
    {
        get
        {
            if (SCMaterial == null)
            {
                SCMaterial = new Material(SCShader);
                SCMaterial.hideFlags = HideFlags.HideAndDontSave;
            }
            return SCMaterial;
        }
    }


    // Start is called before the first frame update
    void Start()
    {
        Texture2 = Resources.Load("aab") as Texture2D;
        SCShader = Shader.Find("BloodScreen");
        if (!SystemInfo.supportsImageEffects)
        {
            enabled = false;
            return;
        }
    }

    void OnRenderImage(RenderTexture sourceTexture, RenderTexture destTexture)
    {
        if (SCShader != null)
        {
            if (!showBlood)
            {
                Alpha = 0;
            }
            else
            {
                if (Alpha < 0.5f)
                {
                    Alpha = 0.5f;
                }
                
            }
            material.SetFloat("_Alpha", Alpha);
            material.SetTexture("_BloodTex", Texture2);
            Graphics.Blit(sourceTexture, destTexture, material);
        }
        else
        {
            Graphics.Blit(sourceTexture, destTexture);
        }

       
    }

    void Update()
    {
        #if UNITY_EDITOR
        if (Application.isPlaying != true)
        {
            SCShader = Shader.Find("BloodScreen");
            Texture2 = Resources.Load("aab") as Texture2D;
        }
        #endif
    }

    void OnDisable()
    {
        if (SCMaterial)
        {
            DestroyImmediate(SCMaterial);
        }

    }
}

shader代码:

bash 复制代码
//使用用途:同于屏幕掉血的后处理特效
//请结合和脚本:CameraFilterPack 挂载至摄像机使用本特效
//本特效设计之初未考虑兼容移动设备,请注意

Shader "BloodScreen"
{
	Properties
	{
		_MainTex ("Texture", 2D) = "white" {}
		_BloodTex ("Blood Texture", 2D) = "white" {}
		_Alpha("Alpha",Range(0.0,1.0))=1
	}
	SubShader
	{
		Pass
		{
			Cull Off ZWrite Off ZTest Always
			CGPROGRAM
			#pragma vertex vert
			#pragma fragment frag
			#include "UnityCG.cginc"

			

			struct appdata
			{
				float4 vertex : POSITION;
				float2 uv : TEXCOORD0;
			};

			struct v2f
			{
				float4 uv : TEXCOORD0;
				float4 vertex : SV_POSITION;
			};

			sampler2D _MainTex;
			float4 _MainTex_ST;
			sampler2D _BloodTex;
			float4 _BloodTex_ST;
			fixed _Alpha;
			
			v2f vert (appdata v)
			{
				v2f o;
				o.vertex = UnityObjectToClipPos(v.vertex);
				o.uv.xy = TRANSFORM_TEX(v.uv, _MainTex);
				o.uv.zw = TRANSFORM_TEX(v.uv, _BloodTex);
				return o;
			}
			
			fixed4 frag (v2f i) : SV_Target
			{
				fixed4 base = tex2D(_MainTex, i.uv.xy);
				fixed4 blood=tex2D(_BloodTex,i.uv.zw);
				blood*=_Alpha;
				fixed4 col=base*blood+base*(1-_Alpha);
			
				return col;
			}
			ENDCG
		}
	}
}

贴图:(源自网络)ps自己画也行

相关推荐
派葛穆12 小时前
Unity-UI 输入框功能
ui·unity·游戏引擎
玖玥拾12 小时前
Unity3D RPG 入门项目(一)开场动画/人物移动/摄像机跟随场景切换
unity·游戏引擎
2401_8949155313 小时前
GEO 搜索优化完整源码从零部署:环境配置、集群搭建全流程
开发语言·python·tcp/ip·算法·unity
2501_9364156914 小时前
可变参数&综合练习&斗地主游戏
java·windows·游戏
WarPigs15 小时前
PC端加载安卓AB包资源显示紫色的问题
unity
笨鸟先飞的橘猫17 小时前
只会脚本语言的游戏后端自我提升之路——c++学习(开篇)
学习·游戏
scott.cgi18 小时前
Unity使用AndroidX获取,导航栏与虚拟键盘的高度
unity·androidx·keyboard·导航栏高度·虚拟键盘高度·判断键盘关闭·获取虚拟键盘高度
丁小未19 小时前
Unity车机地图Tile流式渲染系统高性能架构方案
unity·架构·ecs·dots·车机系统·车机系统架构图
笨鸟先飞的橘猫19 小时前
游戏后端分布式学习——消息队列在游戏的用法
分布式·学习·游戏
网站优化(SEO)专家21 小时前
Pokicon免费游戏入口网站流量稳定增长的核心密码
游戏·游戏网站·网站流量·游戏宣传