日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

[unityshader]制作能量护盾以及简单互动

發(fā)布時(shí)間:2024/3/13 编程问答 53 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [unityshader]制作能量护盾以及简单互动 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

效果圖

因?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)腳本:

using UnityEngine;public class InteractSphere : MonoBehaviour {public Material material;private void OnCollisionEnter(Collision other){material.SetVector("_InteractPoint", other.contacts[0].point);material.SetFloat("_Toggle", 1);//使用toggle控制是否輸入頂點(diǎn)有效}private void OnCollisionExit(Collision other){material.SetFloat("_Toggle", 0);} }

以下為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)題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。