效果图
目录
(2)制作外色值光波效果(类似海浪)—Shield Wave Effect
(3)制作外图案纹理光波效果(类似(2))—Shield Main Pattern
(6)混合所有的光盾效果到Emission(自发光)—Shield Mix for Emission
4、顶点偏移量(Local Vertex Offset)部分
外形抖动变形效果,类似果冻—Shield Distortion
一、Shader部分
1、从整体上,光盾效果只针对自发光(Emission)部分
我们只需要对自发光部分着重改写。
2、Albedo和Normal对接
只做Color相乘连接到Albedo,normal没做操作,如果需要可自行改写。
3、自发光(Emission)部分
(1)制作时间动画—Animation Speed
Time Parameters
“时间参数”节点以秒为单位输出Unity内部经过的时间,该时间以不同的常数进行缩放。
Output Port Description Type Output 返回Unity给定的原始时间向量。 Float4 t/20 Returns the time value scaled by a factor of 0.05 (20x slower). Float t Returns the unscaled time value. Float t*2 Returns the time value scaled by a factor of 2. Float t*3 Returns 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 Port Description Type Tex 该端口接受一个纹理对象,该对象允许使用其纹理UV参数。覆盖节点耕作和偏移量,而改用物料检查器。 Sampler2D Tilling 参数Tilling的动态版本。仅当Reference设置为None时可用,否则将被锁定以指示其使用了材质检查器中的Texture属性的填充。 Float2 Offset 参数Offset的动态版本。仅当Reference设置为None时可用,否则将被锁定以指示其使用了材质检查器中的Texture属性的Offset。 Float2
Output Port Description Type UV(WT) 在vector2的情况下,返回分别包含U和V坐标的vector2,vector3或vector4,vector3的UVW坐标,vector4的UVWT Float2(34) U 返回包含U坐标的float Float V 返回包含V坐标的float Float 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 Port Description Type XYZ(W) Returns the vertex position in object space 返回对象空间中的顶点位置 Float3(4) X Returns only the X component of the vertex position Float Y Returns only the Y component of the vertex position Float Z Returns only the Z component of the vertex position Float W Returns only the W component of the vertex position (By default set to 1). Only visible if Size is set to XYZW. Float
Distance
Distance节点输出两个值或向量A和B之间的欧式距离,可以将其视为以下运算Sqrt(Dot(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) 节点比较其A和B上设置的值,如果A小于B,则输出True;如果A大于或等于B,则输出False。
注意:无论 True and False输入端口可以有不同的数据类型,但投将与渠道的量最多的类型进行。所选类型还将定义输出类型,并定义在比较操作中将使用的A和B通道数量。
Input Port Description Type A First value of the comparison operation. Float [1] B Second value of the comparison operation. Float [1] True Value to be outputted if comparison is successful. Float [1] False Value 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 Port Description Type 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。
图案,波浪,轮辋,冲击和混合相交高光的混合。
- 对应(5),光盾边缘光效果。
- 对应(3),制作外图案纹理光波效果。
- 对应(2),制作外色值光波效果(类似海浪)。
- 对应(4),制作冲击效果(Impact Effect)。
- 对应(3)中Shield Pattern Color:控制光盾-Shield Pattern色值。
- 对应(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 Parameter Description Default Value UV 用于产生噪声的值。相同的输入值始终会产生相同的噪声值。仅在未连接相应的输入端口时可见。 0,0 Scale 用于缩放通过UV端口给定的输入的值。仅在未连接相应的输入端口时可见。 1 Type Method 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);
}
}
}
}