[unityshader]制作能量护盾以及简单互动
效果圖
因?yàn)閏sdn有圖片大小限定,所以適當(dāng)減去了點(diǎn)。
圖中效果為:能量護(hù)盾的收縮,以及與外界collider的碰撞交互效果。
準(zhǔn)備模型(BLENDER)
使用Blender制作一個(gè)棱角球。
點(diǎn)開插件面板添加一個(gè)tissue插件
添加后,點(diǎn)擊插件面板這個(gè)按鈕
就能得到這樣的網(wǎng)格了
重置uv
網(wǎng)格由五邊面和六邊面構(gòu)成,調(diào)整uv布局
選中所有的無(wú)邊面,調(diào)整所有的五邊面uv布局為左下角,再ctrl+i反選,調(diào)整六邊面在右上角(uv面板中g(shù)移動(dòng),s縮放等操作依然適用)
然后導(dǎo)出uv布局圖
制作表面貼圖(PS)
uv布局圖起始效果如下
使用色彩范圍選中黑色邊緣,在新建圖層中填充(可以使用快捷鍵ctrl+delete填充前景色)為白色。
再反選,新建圖層作為背景,填充為黑色。得到如下效果
雙擊白邊所在圖層,進(jìn)入圖層樣式編輯,選擇外發(fā)光調(diào)整至合適發(fā)光邊緣
導(dǎo)出貼圖放入U(xiǎn)nity
實(shí)現(xiàn)效果代碼
shader方面就是菲涅爾+頂點(diǎn)動(dòng)畫(使用了_SinTime達(dá)到波動(dòng)效果)+HDR顏色模式(在屬性名前面加上[HDR]即可)
關(guān)鍵是如何實(shí)現(xiàn)互動(dòng)。
給棱角球加上一個(gè)互動(dòng)腳本,當(dāng)碰撞發(fā)生時(shí)(碰撞發(fā)生條件是雙方都有collider,其中至少一方含有rigbody組件),傳入碰撞點(diǎn)的信息到shader中,在shader中比較當(dāng)前頂點(diǎn)距離碰撞點(diǎn)的距離,使用smoothstep把距離限制在0-1之間,還能根據(jù)參數(shù)調(diào)整遮罩邊緣,再把這個(gè)距離值乘上一層護(hù)盾顏色。
以下為互動(dòng)腳本:
以下為shader代碼:
Shader "Unlit/Shield" {Properties{_MainTex ("Texture", 2D) = "white" {}[HDR]_Color("顏色",Color)=(1,1,1,1)_Strength("波浪度",Range(0,1))=0_Distance("擴(kuò)散距離",Range(0,0.05))=0.01_FresnelPower("菲涅爾power",Range(0,10))=5_FresnelScale("菲涅爾比例",Range(0,1))=1_MaskRadius("遮罩半徑",Range(0,3))=0_MaskSmooth("羽化",Range(0,1))=0[HDR]_CollisionColor("碰撞顏色",Color)=(1,1,1,1)}SubShader{Tags { "RenderType"="transparent" "queue"="transparent"}LOD 100Pass{blend srccolor oneCGPROGRAM#pragma vertex vert#pragma fragment frag// make fog work#pragma multi_compile_fog#include "UnityCG.cginc"float _Strength;float _Distance;float _FresnelPower;float4 _Color;float _FresnelScale;float4 _InteractPoint;float _MaskSmooth;float4 _CollisionColor;float _Toggle;float _MaskRadius;struct appdata{float4 vertex : POSITION;float3 normal:NORMAL;float2 uv : TEXCOORD0;};struct v2f{float2 uv : TEXCOORD0;UNITY_FOG_COORDS(1)float4 objPos:TEXCOORD1;float3 worldNormal:TEXCOORD2;float4 vertex : SV_POSITION;};sampler2D _MainTex;float4 _MainTex_ST;v2f vert (appdata v){v2f o;v.vertex+=_Distance*float4((_Strength+_SinTime.w)*v.normal,0);o.objPos=v.vertex;o.vertex = UnityObjectToClipPos(v.vertex);o.uv = TRANSFORM_TEX(v.uv, _MainTex);o.worldNormal=normalize(UnityObjectToWorldNormal(v.normal));UNITY_TRANSFER_FOG(o,o.vertex);return o;}fixed4 frag (v2f i) : SV_Target{float4 worldPos=mul(unity_ObjectToWorld,i.objPos);float dt=smoothstep(_MaskRadius+_MaskSmooth,_MaskRadius-_MaskSmooth,distance(worldPos,_InteractPoint));float3 viewDir=normalize(WorldSpaceViewDir(i.objPos));float fresnel=_FresnelScale*pow(1-abs(dot(viewDir,i.worldNormal)),_FresnelPower);// sample the texturefixed4 col =tex2D(_MainTex, i.uv)*(fresnel*_Color+_CollisionColor*dt*_Toggle);// apply fogUNITY_APPLY_FOG(i.fogCoord, col);return col;}ENDCG}} }總結(jié)
以上是生活随笔為你收集整理的[unityshader]制作能量护盾以及简单互动的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 二、5移动端网页适配
- 下一篇: Chap1_基础理论+Chap2_数据准