Unity制作护盾——3、蜂窝晶体护盾

这篇具有很好参考价值的文章主要介绍了Unity制作护盾——3、蜂窝晶体护盾。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Unity制作晶格护盾

大家好,我是阿赵。
继续来做护盾,这一期做一个蜂窝晶体护盾的效果。

一、效果展示

  这个晶体护盾的特点是,整个护盾是由很多五边形和六边形的晶体构成,每一块晶体的颜色都在不停的变化,然后每一块晶体都可以单独的浮动。
Unity制作护盾——3、蜂窝晶体护盾,Unity引擎Shader效果,unity,护盾,shader,蜂窝,游戏引擎

根据设置的偏移值不一样,晶体可以往外扩散
Unity制作护盾——3、蜂窝晶体护盾,Unity引擎Shader效果,unity,护盾,shader,蜂窝,游戏引擎

也可以往内聚合
Unity制作护盾——3、蜂窝晶体护盾,Unity引擎Shader效果,unity,护盾,shader,蜂窝,游戏引擎

当鼠标点击模拟攻击护盾的时候,被攻击的护盾会浮起来做一个波浪往四周扩散。
Unity制作护盾——3、蜂窝晶体护盾,Unity引擎Shader效果,unity,护盾,shader,蜂窝,游戏引擎

二、原理分析

要做这个效果,需要美术资源和shader相结合。

1、美术资源准备

1.制作球体

这里要先准备一个由五边形和六边形组成的球体
Unity制作护盾——3、蜂窝晶体护盾,Unity引擎Shader效果,unity,护盾,shader,蜂窝,游戏引擎

怎样制作这个球体呢?可以参考一下这个步骤:
(1)创建一个GeoSphere
(2)塌陷为EditablePoly
(3)选择所有顶点
(4)给所有顶点做一个倒角
Unity制作护盾——3、蜂窝晶体护盾,Unity引擎Shader效果,unity,护盾,shader,蜂窝,游戏引擎

2.分离多边形面

接下来我们要把这些五边形和六边形的面分离,具体做法是选择所有的顶点,然后break一下。
Unity制作护盾——3、蜂窝晶体护盾,Unity引擎Shader效果,unity,护盾,shader,蜂窝,游戏引擎
Unity制作护盾——3、蜂窝晶体护盾,Unity引擎Shader效果,unity,护盾,shader,蜂窝,游戏引擎

现在所有的面都是独立的了。

3.展UV

这个效果的一个重点,就是展UV。我们先把刚才所有的面正常的展开,不要重叠。
Unity制作护盾——3、蜂窝晶体护盾,Unity引擎Shader效果,unity,护盾,shader,蜂窝,游戏引擎

然后选中所有的面,使用Tools/Relex工具,类型选中Relex By Centers,点击Start Relex按钮
Unity制作护盾——3、蜂窝晶体护盾,Unity引擎Shader效果,unity,护盾,shader,蜂窝,游戏引擎
Unity制作护盾——3、蜂窝晶体护盾,Unity引擎Shader效果,unity,护盾,shader,蜂窝,游戏引擎

结束后,所有的面都按照中心点缩放成一个点了。
Unity制作护盾——3、蜂窝晶体护盾,Unity引擎Shader效果,unity,护盾,shader,蜂窝,游戏引擎

2、制作晶体颜色闪烁

  这里其实很简单,就是用一张噪声图做UV动画而已。那么为什么看起来是每一个晶体的颜色都是整体变化,而看不出来是噪声图渐变呢?这是因为上面把所有面的UV都缩成一个点了,所以每个面在采样的时候,只会采样到噪声图的一个像素,看起来就是每个面的颜色都是独立的。
Unity制作护盾——3、蜂窝晶体护盾,Unity引擎Shader效果,unity,护盾,shader,蜂窝,游戏引擎
Unity制作护盾——3、蜂窝晶体护盾,Unity引擎Shader效果,unity,护盾,shader,蜂窝,游戏引擎

3、制作晶体扩散

  还是刚才那张噪声图,然后在顶点着色器程序进行采样,得到了每个晶体不同深浅的颜色,然后根据这个不同深浅,沿着法线方向做偏移而已。
  不过这里有一个问题,tex2D采样只能用在片段着色器程序,如果我们想在顶点着色器程序采样,要用tex2Dlod方法。

4、制作点击扩散

  点击扩散,其实就是上一篇文章里面的冲击波护盾的做法了。只不过冲击波护盾改变的是颜色,我们这里改变的是形状,所以需要在顶点着色器程序里面写。同意通过数组传入最多10个顶点信息和扩散大小。

三、代码

C#代码和冲击波护盾的时候一样。下面提供一下Shader的写法文章来源地址https://www.toymoban.com/news/detail-640215.html

Shader "azhao/GridShield"
{
    Properties
    {
		_NoiseTex("NoiseTex", 2D) = "white" {}
		_dir("dir", Vector) = (0,0,0,0)
		_speed("speed", Range(0 , 2)) = 1
		_offsetVal("offsetVal", Range(-1 , 1)) = 1
		[HDR]_baseColor("baseColor", Color) = (1,1,1,0)
		_alphaMul("alphaMul", Range(0 , 1)) = 0

		_diffuse("diffuse", Range(0 , 1)) = 0
		_gradient("gradient", 2D) = "white" {}
		_minOffset("minOffset",float) = 0.1
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 100
		Blend SrcAlpha OneMinusSrcAlpha, SrcAlpha OneMinusSrcAlpha
        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            #include "UnityCG.cginc"

            struct appdata
            {
                float4 vertex : POSITION;

				float2 uv :TEXCOORD0;
				float3 normal: NORMAL;

            };

            struct v2f
            {
				float4 vertex : SV_POSITION;
                float2 uv : TEXCOORD0;
				float3 vertex_world:TEXCOORD1;
				float3 normal_world:TEXCOORD2;
                
            };

			uniform sampler2D _NoiseTex;
			SamplerState sampler_NoiseTex;
			uniform float2 _dir;
			uniform float _speed;
			uniform float _offsetVal;
			uniform sampler2D _gradient;
			SamplerState sampler_gradient;

			uniform float _diffuse;
			uniform float4 _baseColor;
			uniform float _alphaMul;
			float3 _hitCenter[10];
			float _hitSize[10];
			float _minOffset;
            v2f vert (appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
				float3 worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;
				o.normal_world = UnityObjectToWorldNormal(v.normal);
				float4 tex2DNode2 = tex2Dlod(_NoiseTex, float4((v.uv + (_dir * frac((_Time.y * _speed)))), 0, 0.0));
				float3 vertexValue = float3(0, 0, 0);
				for (int i = 0; i < 10; i++)
				{
					float2 appendResult = (float2(((distance(_hitCenter[i], worldPos) - _hitSize[i]) / _diffuse), 0.0));
					float clampResult = clamp((tex2Dlod(_gradient, float4(appendResult, 0, 0.0)).r + (max(_hitSize[i], 0.0) * -1.0)), 0.0, 1.0);
					clampResult = max(clampResult, _minOffset);
					vertexValue += (o.normal_world * tex2DNode2.r * _offsetVal * (clampResult * 0.5));
				}

				o.uv = v.uv;
				v.vertex.xyz += vertexValue;
				o.vertex = UnityObjectToClipPos(v.vertex);
				o.vertex_world = mul(unity_ObjectToWorld, v.vertex).xyz;
                return o;
            }

            half4 frag (v2f i) : SV_Target
            {
				float4 tex2DNode2 = tex2D(_NoiseTex, (i.uv + (_dir * frac((_Time.y * _speed)))));
				half4 finalColor = (float4((_baseColor * tex2DNode2).rgb , max((max(tex2DNode2.r , 0.1) * _alphaMul) , 0.0)));

				return finalColor;
            }
            ENDCG
        }
    }
}

到了这里,关于Unity制作护盾——3、蜂窝晶体护盾的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Unity用Shader实现边缘光效果

    《自学记录》 1、先创建一个Cube,再创建两个材质球Cube、Unilt 2、再创建一个shader代码UniltShader【Project右键Create-Shader-NewSurfaceShader】把里面原来的代码删除,写入下面的代码 3、把shader UniltShader拖给材质球Unilt 4、把Cube的Mesh Renderer中Materials的Size改为2,然后把材质球Cube、Unilt分

    2024年02月08日
    浏览(46)
  • 学习100个Unity Shader (14) ---透明效果

    由”Queue“ 标签决定,索引号越小越早被渲染: 名称 队列索引号 Background 1000 Geometry 2000 AlphaTest 2450 Transparent 3000 Overlay 4000 某一片元的透明度小于某个阈值,即被舍弃,反之,按非透明物体处理,进行正常的深度测试和深度写入【不需要关闭深度写入】。 UnityObjectToClipPos 将顶

    2024年04月29日
    浏览(45)
  • Unity中Shader实现UI流光效果

    在很多游戏的 UI 中,都有实现 一道光扫过 UI 的效果 Unity中Shader的时间_Time 注意: 因为,这是UGUI的Shader,记着修改渲染顺序为 透明层级 和 混合模式 Tags {“Queue” = “TransParent”} Blend SrcAlpha OneMinusSrcAlpha 代码: 效果: Unity3D Shader系列之UI流光效果 Unity流光shader,无需图片

    2024年02月05日
    浏览(53)
  • Unity Shader入门精要 第八章——透明效果

    目录 前言 一、渲染顺序的重要性 二、Unity Shader的渲染顺序 三、透明度测试 1、什么是透明度测试 2、实践 四、透明度混合 1、什么是透明度混合 2、实践  五、开启深度写入的半透明效果 1、实现方法  2、实践 六、ShaderLab的混合命令 1、混合等式和参数 2、混合操作  3、常见

    2024年02月04日
    浏览(45)
  • 【unity shader】水体渲染基础-水下透视效果

    接下来是水体渲染基础的最后一篇,通过水面看到水下的物体,并呈现深度效果。 我们直接搭一个小场景。 增加水面,赋予uv变形的水面材质,并增加透明度的设置。 水体会吸收光线,所以真实的水体并不是完全透明的。此外,水体对不同频率的光吸收率不同,蓝光被吸收

    2024年03月14日
    浏览(56)
  • 【unity shader案例】如何实现一个玻璃效果

      原理:玻璃最大的特点当然就是半透明了,如何在游戏中实现这样的效果呢?我这里总体的思路就是先截取整个场景作为一张纹理,然后把玻璃区域的纹理贴到这个玻璃模型上。 下面看具体实现代码 实现效果如下    更进一步,还可以实现毛玻璃的效果,思路就是用一张

    2024年02月16日
    浏览(54)
  • Unity中Shader抓取屏幕并实现扭曲效果(优化)

    对上一篇中实现的shader进行优化 1、定义结构体用于传入顶点坐标系 struct appdata { float4 vertex : POSITION; //从应用程序阶段的输入,多加一个uv,用于对扭曲纹理的采样 float2 uv : TEXCOORD; }; 2、因为UnityObjectToClipPos是从本地空间转换到裁剪空间,但是没有进行透视除法,所以需要对其

    2024年02月03日
    浏览(51)
  • Unity Shader学习记录(11) ——透明效果的实现方式

    1 透明效果的两种方法 透明是游戏中经常要使用的一种效果。在实时渲染中要实现透明效果,通常会在渲染模型时控制它的透明通道(Alpha Channel)。当开启透明混合后,当一个物体被渲染到屏幕上时,每个片元除了颜色值和深度值之外,它还有另一个属性一一透明度。 当透明度

    2024年02月07日
    浏览(45)
  • unity shader 入门 全透明与半透明效果实现

    片元函数的fixed4类型的返回值的第4位即为阿尔法值,0代表完全不显示(透明),1代表完全显示。中间的数值代表半透明。但只修改这个值是不能直接修改透明度的,因为还要对队列等进行修改。 本文介绍透明度测试与透明度混合,前者只能制作全透明效果,后者可制作半透明

    2024年02月14日
    浏览(49)
  • Unity Shader UVLightReveal (紫外线显示,验钞效果)

    大家应该都有见过验钞机验100块钱的经历吧,而且在很多光感游戏中也会出现这种效果,当指定颜色的光线照射到对应的物体上物体就会呈现出隐藏的效果,在我理解的游戏中很多密室类型的游戏会有这种需求,况且我们把这种效果加在某些类型的游戏中作为一个彩蛋也是不

    2024年02月03日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包