Unity ASE案例解析—ForceShield(光盾被击打时效果)

效果图

 

目录

一、Shader部分

1、从整体上,光盾效果只针对自发光(Emission)部分

2、Albedo和Normal对接

3、自发光(Emission)部分

(1)制作时间动画—Animation Speed

 (2)制作外色值光波效果(类似海浪)—Shield Wave Effect

(3)制作外图案纹理光波效果(类似(2))—Shield Main Pattern

(4)制作冲击效果—Impact Effect

(5)光盾边缘光效果—Shield RIM

(6)混合所有的光盾效果到Emission(自发光)—Shield Mix for Emission

4、Opacity —不透明度(透明渲染类型)部分

4、顶点偏移量(Local Vertex Offset)部分

外形抖动变形效果,类似果冻—Shield Distortion

二、代码部分

主要是碰撞时产生效果赋值

 


一、Shader部分

1、从整体上,光盾效果只针对自发光(Emission)部分

我们只需要对自发光部分着重改写。 

2、Albedo和Normal对接

只做Color相乘连接到Albedo,normal没做操作,如果需要可自行改写。

3、自发光(Emission)部分

(1)制作时间动画—Animation Speed

Time Parameters

“时间参数”节点以秒为单位输出Unity内部经过的时间,该时间以不同的常数进行缩放。

Output PortDescriptionType
Output返回Unity给定的原始时间向量。Float4
t/20Returns the time value scaled by a factor of 0.05 (20x slower).Float
tReturns the unscaled time value.Float
t*2Returns the time value scaled by a factor of 2.Float
t*3Returns the time value scaled by a factor of 3.Float

 (2)制作外色值光波效果(类似海浪)—Shield Wave Effect

控制贴图的offset Y轴偏移量,制作成动画效果,在通过纹理产生波纹效果。

Texture Coordinates

“纹理坐标”节点(快捷键:U键)使用网格UV并根据纹理平铺和偏移参数对其进行操作,以定义如何将纹理映射到3d资产上。如果Tex端口连接到纹理对象,或者如果在节点属性面板中引用了Tex端口,则它们将通过材质检查器中的该纹理字段进行转换。否则,将使用节点的参数或输入来转换坐标。

http://wiki.amplify.pt/index.php?title=Unity_Products:Amplify_Shader_Editor/Texture_Coordinates 

Input PortDescriptionType
Tex该端口接受一个纹理对象,该对象允许使用其纹理UV参数。覆盖节点耕作和偏移量,而改用物料检查器。Sampler2D
Tilling参数Tilling的动态版本。仅当Reference设置为None时可用,否则将被锁定以指示其使用了材质检查器中的Texture属性的填充。Float2
Offset参数Offset的动态版本。仅当Reference设置为None时可用,否则将被锁定以指示其使用了材质检查器中的Texture属性的Offset。Float2
Output PortDescriptionType
UV(WT)在vector2的情况下,返回分别包含U和V坐标的vector2,vector3或vector4,vector3的UVW坐标,vector4的UVWTFloat2(34)
U返回包含U坐标的floatFloat
V返回包含V坐标的floatFloat
W返回包含W坐标的浮点数。仅在“ 坐标大小”设置为“浮动3”时可用.Float
T返回包含T坐标的浮点数。仅在“ 坐标大小”设置为“浮动4”时可用

(3)制作外图案纹理光波效果(类似(2))—Shield Main Pattern

Shield Pattern Size:控制光盾-Shield Pattern数量密度。

Shield Pattern Color:控制光盾-Shield Pattern色值。

(4)制作冲击效果—Impact Effect

 Hit Size:撞击范围大小。

Hit Color:撞击后的颜色。

Hit Position:撞击的位置。

Hit Time:撞击消失时间。

Shield Pattern Color:撞击后要改变的目标颜色。对应(3)中Shield Pattern Color:控制光盾-Shield Pattern色值。

Vertex Position 

“顶点位置”节点输出对象空间中的顶点位置。此数据直接从网格中提取,并包含相对于对象原点的顶点位置,这意味着位置值不会更改游戏对象具有的任何变换值。通常用于在“ 局部顶点偏移”输出中使用或创建绑定到对象并保持完全相同的效果,即使您的游戏对象更改了位置,旋转或大小也是如此。
根据使用此节点的位置(顶点或片段/表面函数),它将返回直接值(在顶点函数上)或在顶点之间插入值(在片段/表面函数上)。

注意:不要与“ 世界位置( World Position)”节点混淆。

http://wiki.amplify.pt/index.php?title=Unity_Products:Amplify_Shader_Editor/Vertex_Position

Output PortDescriptionType
XYZ(W)Returns the vertex position in object space  返回对象空间中的顶点位置Float3(4)
XReturns only the X component of the vertex positionFloat
YReturns only the Y component of the vertex positionFloat
ZReturns only the Z component of the vertex positionFloat
WReturns only the W component of the vertex position (By default set to 1). Only visible if Size is set to XYZW.Float

Distance

Distance节点输出两个值或向量AB之间的欧式距离,可以将其视为以下运算SqrtDot(B-A,B-A))
如果将不同的数据类型连接到每个端口,则将始终对大多数通道的端口类型执行强制转换。

http://wiki.amplify.pt/index.php?title=Unity_Products:Amplify_Shader_Editor/Distance

Compare (A < B) Node

The Compare (A < B) 节点比较其AB上设置的值,如果A小于B,则输出True;如果A大于或等于B,则输出False

注意:无论 True and False输入端口可以有不同的数据类型,但投将与渠道的量最多的类型进行。所选类型还将定义输出类型,并定义在比较操作中将使用的AB通道数量。

Input PortDescriptionType
AFirst value of the comparison operation.Float [1]
BSecond value of the comparison operation.Float [1]
TrueValue to be outputted if comparison is successful.Float [1]
FalseValue to be outputted if comparison fails.Float [1]

http://wiki.amplify.pt/index.php?title=Unity_Products:Amplify_Shader_Editor/Compare_(ALessB)

(5)光盾边缘光效果—Shield RIM

RimLight边缘光主要思路:法线和视角向量的点积越小,证明两向量夹角越大,说明在边缘处,如果夹角小,则说明是正对相机,所以没有边缘发光。

Fresnel Node

菲涅耳节点输出菲涅耳效果的结果。它定义了光到达具有不同折射率的两种材料之间的界面时的行为,反射和折射的量。
该节点在与该反射部分特定的交易,并计算其由下面的表达式定义的菲涅耳反射系数ReflectionCoefficient = Bias + Scale x ( 1 + N.I )^Power.
方程的每个成员都可以修改,但I变量除外,该I变量定义了从摄像机到对象的入射向量,并由该节点在内部将其计算为反向的“世界视图方向”向量。

Input PortDescriptionType
Normal要使用的法线向量。如果未连接,则将使用Surface World法线。Float 3
Bias定义菲涅耳方程式的Bias变量。Float
Scale定义菲涅耳方程式的Scale变量。Float
Power定义菲涅耳方程式的幂变量。Float

http://wiki.amplify.pt/index.php?title=Unity_Products:Amplify_Shader_Editor/Fresnel

(6)混合所有的光盾效果到Emission(自发光)—Shield Mix for Emission

Mix of Pattern, Wave, Rim , Impact and adding intersection highlight。

图案,波浪,轮辋,冲击和混合相交高光的混合。

  1. 对应(5),光盾边缘光效果。
  2. 对应(3),制作外图案纹理光波效果。
  3. 对应(2),制作外色值光波效果(类似海浪)。
  4. 对应(4),制作冲击效果(Impact Effect)。
  5. 对应(3)中Shield Pattern Color:控制光盾-Shield Pattern色值。
  6. 对应(3)中Shield Pattern Power:控制光盾-Shield Pattern数量密度。

最后把生成的Local var—Emission连接到输出自发光中。

4、Opacity —不透明度(透明渲染类型)部分

需要先配置渲染类型:

然后,给定一个常量控制透明度。

Opacity”输入需要将其“渲染类型”设置为“透明”的着色器,使用从0到1的值范围(从完全透明到完全不透明)来设置整个曲面的透明度。分别; 接受完整的RGB输入。

4、顶点偏移量(Local Vertex Offset)部分

  • 外形抖动变形效果,类似果冻—Shield Distortion

噪声-Noise Generator Node

“噪声生成器”节点使用Type指定的方法根据UV处指定的值在[-1 1]范围内创建浮动噪声值。

 注意:输入数据必须在整个几何图形上变化,因为相等的值会产生相同的噪声。一种简单的方法是将“ 纹理坐标”节点连接到其输入。

http://wiki.amplify.pt/index.php?title=Unity_Products:Amplify_Shader_Editor/Noise_Generator 

Node ParameterDescriptionDefault Value
UV用于产生噪声的值。相同的输入值始终会产生相同的噪声值。仅在未连接相应的输入端口时可见。0,0
Scale用于缩放通过UV端口给定的输入的值。仅在未连接相应的输入端口时可见。1
TypeMethod used to generate the noise value
  • Simplex 2D: 使用Simplex 方法从Vector 2创建噪声值。
  • Simplex 3D:  使用Simplex 方法从Vector3创建噪声值。
  • Gradient: 使用“Gradient”方法从Vector 2创建噪声值。.
Simplex 2D
0-1 Range如果打开,则输出值为[0 1]范围;如果关闭,则为[-1 1]范围。True

 最后,连接到 Local Vertex Offset

  • Local Vertex Offset—局部顶点偏移(相对顶点输出):局部顶点偏移输入可用于通过顶点操纵来更改曲面的形状,其中XYZ坐标将定义每个顶点如何从其相对位置偏移。

二、代码部分

  • 主要是碰撞时产生效果赋值

  foreach (ContactPoint contact in collision.contacts)
            {
                mat.SetVector("_HitPosition", transform.InverseTransformPoint(contact.point));
                hitTime = 500;
				mat.SetFloat("_HitTime", hitTime);
            }

具体代码如下:

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

namespace TFHC_ForceShield_Shader_Sample
{
    public class ForceShieldImpactDetection : MonoBehaviour
    {
        private float hitTime;
        private Material mat;

        void Start()
        {
            mat = GetComponent<Renderer>().material;// Store material reference
        }

        void Update()
        {
			// Animate the _hitTime shader property for impact effect
            if (hitTime > 0)
            {
                hitTime -= Time.deltaTime * 1000;
                if (hitTime < 0)
                {
                    hitTime = 0;
                }
                mat.SetFloat("_HitTime", hitTime);
            }
        }

        void OnCollisionEnter(Collision collision)
        {
            // On colission set shader vector property _HitPosition with the impact point and
            // set _hittime shader property to start the impact effect
           //在colission上设置着色器矢量属性_HitPosition,其影响点为
           //设置_hittime着色器属性以启动效果
            foreach (ContactPoint contact in collision.contacts)
            {
                mat.SetVector("_HitPosition", transform.InverseTransformPoint(contact.point));
                hitTime = 500;
				mat.SetFloat("_HitTime", hitTime);
            }
        }
    }
}

https://img-blog.csdnimg.cn/20200109144058304.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwMTIwOTQ2,size_16,color_FFFFFF,t_70 

 

  • 3
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值