1. 程式人生 > >Unity攻擊敵人時產生泛白效果

Unity攻擊敵人時產生泛白效果

Shader的程式碼如下,主要是將透明度為1的畫素點輸出為白色,其中_BeAttack表示角色被攻擊的泛白狀態

// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'

Shader "Custom/BeAttackTest" {
Properties{
_MainTex("texture", 2D) = "black"{}
_Color("add color", Color) = (1,1,1,1)
//_BeAttack("BeAttack",Int)=0
}

SubShader{
Tags{ "QUEUE" = "Transparent" "IGNOREPROJECTOR" = "true" "RenderType" = "Transparent" }
ZWrite Off
Blend SrcAlpha OneMinusSrcAlpha
LOD 100
Cull Off//設定雙面渲染,避免角色縮放翻轉時無渲染情況

Pass{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"

sampler2D _MainTex;
fixed4 _MainTex_ST;
fixed4 _Color;
int _BeAttack;//對外引數表示是否被攻擊了

struct vIn {
half4 vertex:POSITION;
float2 texcoord:TEXCOORD0;
fixed4 color : COLOR;
};

struct vOut {
half4 pos:SV_POSITION;
float2 uv:TEXCOORD0;
fixed4 color : COLOR;
};

vOut vert(vIn v) {
vOut o;
o.pos = UnityObjectToClipPos(v.vertex);
o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
o.color = v.color;
return o;
}

fixed4 frag(vOut i) :COLOR{
fixed4 tex = tex2D(_MainTex, i.uv).rgba;
/*
if (tex.a == 1)return fixed4(1, 1, 1, 1);
else return fixed4(0, 0, 0, 0);
*/
if (_BeAttack==1) {//是否被攻擊
if (tex.a == 1)return fixed4(1, 1, 1, 1);//對透明度為1的畫素輸出為白色
else return fixed4(0, 0, 0, 0);
}
else {
return tex;
}

}
ENDCG
}
}
}

 

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

角色被攻擊的程式碼如下,通過設定時間引數控制泛白的持續時間:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Enemy01Die : MonoBehaviour,IDie {

SpriteRenderer spriteRenderer;

public float whiteCoolTime;//泛白效果的持續時間長度
float whiteCoolTimer;

private void Awake()
{
spriteRenderer = GetComponent<SpriteRenderer>();
}

void Update()
{
//被攻擊狀態冷卻,設定被攻擊引數為0
if (whiteCoolTimer <= 0)
spriteRenderer.material.SetInt("_BeAttack", 0);
else
whiteCoolTimer -= Time.deltaTime;
}

public void Die()
{
Destroy(gameObject);
}

public void BeAttack()
{

//被攻擊的時候設定shader的被攻擊引數為1
spriteRenderer.material.SetInt("_BeAttack", 1);
whiteCoolTimer = whiteCoolTime;
}
}

public interface IDie
{
void Die();
void BeAttack();
}