溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Unity3D Shader如何實(shí)現(xiàn)掃描顯示效果

發(fā)布時(shí)間:2020-08-03 13:46:28 來(lái)源:億速云 閱讀:420 作者:小豬 欄目:編程語(yǔ)言

小編這次要給大家分享的是Unity3D Shader如何實(shí)現(xiàn)掃描顯示效果,文章內(nèi)容豐富,感興趣的小伙伴可以來(lái)了解一下,希望大家閱讀完這篇文章之后能夠有所收獲。

通過Shader實(shí)現(xiàn),從左向右的掃描顯示,可自定義掃描顏色、寬度、速度。

效果圖如下

Unity3D Shader如何實(shí)現(xiàn)掃描顯示效果

編輯器界面如下

Unity3D Shader如何實(shí)現(xiàn)掃描顯示效果

Shader源碼如下

Shader "XM/ScanEffect"
{
 Properties
 {
 _MainTex("Main Tex", 2D) = "white"{}
 _lineColor("Line Color", Color) = (0,0,0,0)
 _lineWidth("Line width", Range(0, 1.0)) = 0.1
 _rangeX("Range X", Range(0,1.0)) = 1.0
 }

 SubShader
 {
 Tags {
 "Queue" = "Transparent"
 }

 ZWrite Off
 Blend SrcAlpha OneMinusSrcAlpha
 Cull back

 Pass
 {
 CGPROGRAM

 #pragma vertex vert
 #pragma fragment frag

 #include "Lighting.cginc"

 sampler2D _MainTex;
 float4 _MainTex_ST;
 float4 _lineColor;
 float _lineWidth;
 float _rangeX;

 struct a2v
 {
 float4 vertex : POSITION;
 float4 texcoord : TEXCOORD0;
 };

 struct v2f
 {
 float4 pos : SV_POSITION;
 float2 uv : TEXCOORD0;
 };

 v2f vert(a2v v)
 {
 v2f o;
 o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
 o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
 return o;
 }

 fixed4 frag(v2f i) : SV_TARGET
 {
 fixed4 col = tex2D(_MainTex, i.uv);

 if(i.uv.x > _rangeX)
 {
 clip(-1);
 }
 else if (i.uv.x > _rangeX - _lineWidth)
 {
 float offsetX = i.uv.x - _rangeX +_lineWidth;
 fixed xAlpha = offsetX / _lineWidth;
 col = col * (1 - xAlpha) + _lineColor * xAlpha;
 }


 return col;
 }

 ENDCG
 }
 }

 FallBack "Diffuse"
}

代碼調(diào)用如下

using UnityEngine;
using System.Collections;
public class ScanEffect : MonoBehaviour
{
 //默認(rèn)掃描線的寬
 [Range(0,1)]
 public float _defaultLineW = 0.2f;
 //掃描的速度
 [Range(0, 1)]
 public float _showSpeed = 0.02f;

 private MeshRenderer _render;

 private void Awake()
 {
 _render = GetComponent<MeshRenderer>();
 SetX(0);
 SetLineWidth(0);
 }

 public void SetLineWidth(float val)
 {
 _render.material.SetFloat("_lineWidth", val);
 }
 public void SetX(float val)
 {
 _render.material.SetFloat("_rangeX", val);
 }

 public void Show()
 {
 StopCoroutine("Showing");
 StartCoroutine("Showing");
 }
 public void Hide()
 {
 StopCoroutine("Showing");

 SetX(0);
 SetLineWidth(0);
 }

 private IEnumerator Showing()
 {
 float deltaX = 0;
 float deltaWidth = _defaultLineW;

 SetX(deltaX);
 SetLineWidth(deltaWidth);

 while (true)
 {
 if (deltaX != 1)
 {
 deltaX = Mathf.Clamp01(deltaX + _showSpeed);
 SetX(deltaX);
 }
 else
 {
 if (deltaWidth != 0)
 {
 deltaWidth = Mathf.Clamp01(deltaWidth - _showSpeed);
 SetLineWidth(deltaWidth);
 }
 else
 {
 break;
 }
 }
 yield return new WaitForEndOfFrame();
 }
 }


 public void OnGUI()
 {
 if (GUILayout.Button("Show"))
 {
 Show();
 }
 if (GUILayout.Button("Hide"))
 {
 Hide();
 }
 }
}

看完這篇關(guān)于Unity3D Shader如何實(shí)現(xiàn)掃描顯示效果的文章,如果覺得文章內(nèi)容寫得不錯(cuò)的話,可以把它分享出去給更多人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI