【实现100个unity特效】shader实现3D物品闪光和描边效果

这篇具有很好参考价值的文章主要介绍了【实现100个unity特效】shader实现3D物品闪光和描边效果。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

最终效果

【实现100个unity特效】shader实现3D物品闪光和描边效果,# 实现100个unity特效,# unity实现一些FPS功能,unity,3d,游戏引擎,游戏

shader代码

Shader "SurvivalTemplatePro/Interactable"
{
	Properties
	{
		_ASEOutlineColor( "Outline Color", Color ) = (0.8962264,0.7633126,0.2832412,0)
		_ASEOutlineWidth( "Outline Width", Float ) = 0.01
		_Cutoff( "Mask Clip Value", Float ) = 0.5
		_Color("Base Color", Color) = (1,1,1,0)
		_MainTex("Base Color Map", 2D) = "white" {}
		_MaskMap("Mask Map", 2D) = "white" {}
		[Normal]_BumpMap("Normal Map", 2D) = "bump" {}
		_LineMap("Line Map", 2D) = "white" {}
		[HDR]_LineColor("Line Color", Color) = (1.991077,1.306363,0.3513666,1)
		_LineAlpha("Line Alpha", Range( 0 , 1)) = 1
		_LineSize("Line Size", Range( 0.1 , 2)) = 1
		_LineSpeed("Line Speed", Range( 0.1 , 2)) = 1
		[HideInInspector] _texcoord( "", 2D ) = "white" {}
		[HideInInspector] __dirty( "", Int ) = 1
	}

	SubShader
	{
		Tags{ }
		Cull Front
		CGPROGRAM
		#pragma target 3.0
		#pragma surface outlineSurf Outline  keepalpha noshadow noambient novertexlights nolightmap nodynlightmap nodirlightmap nometa noforwardadd vertex:outlineVertexDataFunc 
		
		
		
		
		struct Input {
			half filler;
		};
		float4 _ASEOutlineColor;
		float _ASEOutlineWidth;
		void outlineVertexDataFunc( inout appdata_full v, out Input o )
		{
			UNITY_INITIALIZE_OUTPUT( Input, o );
			v.vertex.xyz += ( v.normal * _ASEOutlineWidth );
		}
		inline half4 LightingOutline( SurfaceOutput s, half3 lightDir, half atten ) { return half4 ( 0,0,0, s.Alpha); }
		void outlineSurf( Input i, inout SurfaceOutput o )
		{
			o.Emission = _ASEOutlineColor.rgb;
			o.Alpha = 1;
		}
		ENDCG
		

		Tags{ "RenderType" = "TransparentCutout"  "Queue" = "Geometry+0" "IsEmissive" = "true"  }
		Cull Back
		CGPROGRAM
		#include "UnityShaderVariables.cginc"
		#pragma target 3.0
		#pragma surface surf Standard keepalpha addshadow fullforwardshadows exclude_path:deferred 
		struct Input
		{
			float2 uv_texcoord;
			float3 worldPos;
		};

		uniform sampler2D _BumpMap;
		uniform float4 _BumpMap_ST;
		uniform float4 _Color;
		uniform sampler2D _MainTex;
		uniform float4 _MainTex_ST;
		uniform float _LineAlpha;
		uniform sampler2D _LineMap;
		uniform float _LineSpeed;
		uniform float _LineSize;
		uniform float4 _LineColor;
		uniform sampler2D _MaskMap;
		uniform float4 _MaskMap_ST;
		uniform float _Cutoff = 0.5;

		void surf( Input i , inout SurfaceOutputStandard o )
		{
			float2 uv_BumpMap = i.uv_texcoord * _BumpMap_ST.xy + _BumpMap_ST.zw;
			float3 tex2DNode2 = UnpackNormal( tex2D( _BumpMap, uv_BumpMap ) );
			float3 NormalMap266 = tex2DNode2;
			o.Normal = NormalMap266;
			float2 uv_MainTex = i.uv_texcoord * _MainTex_ST.xy + _MainTex_ST.zw;
			float4 tex2DNode1 = tex2D( _MainTex, uv_MainTex );
			o.Albedo = ( _Color * tex2DNode1 ).rgb;
			float2 temp_cast_1 = (_LineSpeed).xx;
			float3 ase_vertex3Pos = mul( unity_WorldToObject, float4( i.worldPos , 1 ) );
			float2 temp_cast_2 = (( ase_vertex3Pos.x * _LineSize )).xx;
			float2 panner243 = ( _Time.y * temp_cast_1 + temp_cast_2);
			float4 temp_output_119_0 = ( tex2D( _LineMap, panner243 ) * _LineColor );
			float3 desaturateInitialColor282 = float3( (tex2DNode2).xy ,  0.0 );
			float desaturateDot282 = dot( desaturateInitialColor282, float3( 0.299, 0.587, 0.114 ));
			float3 desaturateVar282 = lerp( desaturateInitialColor282, desaturateDot282.xxx, 1.0 );
			float4 lerpResult248 = lerp( float4( 0,0,0,0 ) , ( float4( 0,0,0,0 ) * temp_output_119_0 ) , float4( saturate( desaturateVar282 ) , 0.0 ));
			float2 uv_MaskMap = i.uv_texcoord * _MaskMap_ST.xy + _MaskMap_ST.zw;
			float4 tex2DNode3 = tex2D( _MaskMap, uv_MaskMap );
			float4 lerpResult278 = lerp( float4( 0,0,0,0 ) , ( lerpResult248 + ( temp_output_119_0 * float4( 0.245283,0.245283,0.245283,0 ) ) ) , tex2DNode3.g);
			float4 Line32 = ( _LineAlpha * lerpResult278 );
			o.Emission = Line32.rgb;
			o.Metallic = tex2DNode3.r;
			o.Smoothness = tex2DNode3.a;
			o.Occlusion = tex2DNode3.g;
			o.Alpha = 1;
			clip( tex2DNode1.a - _Cutoff );
		}

		ENDCG
	}
	Fallback "Diffuse"
}

线状映射图片
【实现100个unity特效】shader实现3D物品闪光和描边效果,# 实现100个unity特效,# unity实现一些FPS功能,unity,3d,游戏引擎,游戏
配置,按该shader新增材质
【实现100个unity特效】shader实现3D物品闪光和描边效果,# 实现100个unity特效,# unity实现一些FPS功能,unity,3d,游戏引擎,游戏
Outline Width控制描边
Line Speed控制闪光速度
当然,还可以修改对应的颜色

代码控制物品描边显示隐藏

using UnityEngine;

//拾取脚本
public class PickUpController : MonoBehaviour
{
    public float maxDistance = 3f; // 最大检测距离
    public LayerMask layerMask; // 检测层级

    public GameObject uiText; // 显示物品名称的 UI 文本组件

    Transform lastHitInfo;
    void Start()
    {
        uiText.SetActive(false); // 初始状态下 UI 文本组件不可见
    }

    void Update()
    {
        // 从相机屏幕中心向前发射一条射线
        Ray ray = Camera.main.ViewportPointToRay(new Vector3(0.5f, 0.5f, 0f));

        RaycastHit hitInfo;
        if (Physics.Raycast(ray, out hitInfo, maxDistance, layerMask))
        {
            lastHitInfo = hitInfo.transform;
            uiText.SetActive(true);

            //设置物品描边
            SetOutline(lastHitInfo, 0.01f);

            //hitInfo.transform.CompareTag("PickUpItem") 需要的话可以再加标签判断
            if (Input.GetKeyDown(KeyCode.E))
            {
                PickUpItem(lastHitInfo);
            }
        }
        else
        {
            uiText.SetActive(false);
            if (lastHitInfo != null) SetOutline(lastHitInfo, 0f);
        }

    }

    // 拾取物体逻辑
    void PickUpItem(Transform item)
    {
        //。。。
    }

    //设置物品描边
    void SetOutline(Transform obj, float width)
    {
        Renderer renderer = obj.GetComponent<Renderer>();
        if (renderer != null)
        {
            Material material = renderer.material;
            material.SetFloat("_ASEOutlineWidth", width);
        }

        foreach (Transform child in obj)
        {
            SetOutline(child, width);
        }
    }
}

效果演示
【实现100个unity特效】shader实现3D物品闪光和描边效果,# 实现100个unity特效,# unity实现一些FPS功能,unity,3d,游戏引擎,游戏

完结

赠人玫瑰,手有余香!如果文章内容对你有所帮助,请不要吝啬你的点赞评论和关注,以便我第一时间收到反馈,你的每一次支持都是我不断创作的最大动力。当然如果你发现了文章中存在错误或者有更好的解决方法,也欢迎评论私信告诉我哦!

好了,我是向宇,https://xiangyu.blog.csdn.net

一位在小公司默默奋斗的开发者,出于兴趣爱好,最近开始自学unity,闲暇之余,边学习边记录分享,站在巨人的肩膀上,通过学习前辈们的经验总是会给我很多帮助和启发!php是工作,unity是生活!如果你遇到任何问题,也欢迎你评论私信找我, 虽然有些问题我也不一定会,但是我会查阅各方资料,争取给出最好的建议,希望可以帮助更多想学编程的人,共勉~

【实现100个unity特效】shader实现3D物品闪光和描边效果,# 实现100个unity特效,# unity实现一些FPS功能,unity,3d,游戏引擎,游戏文章来源地址https://www.toymoban.com/news/detail-823719.html

到了这里,关于【实现100个unity特效】shader实现3D物品闪光和描边效果的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 【unity实战】使用shader和shader Graph实现2d图片描边效果(附源码)

    最近在学习shader Graph相关内容,其实关于实现2d图片描边效果,网上可以看到很多教程,但是我发现大多数都是基于比较老旧的2018unity版本,可是我们实际开发使用可能是比较新的2021及以上版本,差别还是有的,实际在升级或者使用过程中,会遇到诸多问题,而且也很少有人

    2024年02月16日
    浏览(55)
  • 实现窗户特效的Unity Shader解析

            本文将详细介绍一种使用Unity Shader实现窗户特效的方法。通过分析代码,我们将解释每个关键部分的作用,以及如何将其组合在一起以实现逼真的窗户效果。希望本文能为Shader编程初学者和Unity开发者提供一些有用的指导。   引言:         在游戏和虚拟现实

    2024年02月12日
    浏览(50)
  • Unity 2D外描边Shader

    今天,我们来实现一个2D外描边的效果。外描边:即在边缘透明像素周围加上一层描边,不占用原来的像素。 思路:我们可以在片元着色器实现此效果,当一个像素本身不是透明的(alpha0),那么让它返回自身的颜色;当一个像素本身是透明的,并且它上下左右4个像素的al

    2024年02月04日
    浏览(48)
  • 【unity插件】Shader实现UGUI的特效——UIEffect为 Unity UI 提供视觉效果组件

    一般的shader无法直接使用在UI上,需要在shader中定义特定的面板参数,今天就来推荐github上大佬做的一套开源的一系列UGUI,Shader实现的特效——UIEffect 为 Unity UI 提供视觉效果组件。 https://github.com/Ankh4396/UIEffect 让我们用效果来装饰你的UI!您可以根据需要从脚本和检查器中控

    2024年02月04日
    浏览(46)
  • Unity极坐标Shader特效,以及使用Instanced Property实现相同材质不同参数

    先看看效果 Unity极坐标Shader特效 有时候我们需要在场景中摆放一些热点,用户点击之后出现互动,当然实现这个功能的方法有很多,作为一名程序员,当然是要用最简单的实现。用shader程序化实现它。 啥是极坐标 极坐标,又称极座标系。它是一种表示平面直角坐标系中点的

    2024年02月09日
    浏览(42)
  • Unity3D实现背包系统、物品的拖拽、拾取物品功能

    要在Unity中实现背包系统,你可以创建一个脚本来管理库存和物品。 首先,在Unity中创建一个名为“InventoryManager”的C#脚本。在这个脚本中,你可以创建一个将存储在背包中的物品列表。

    2024年02月16日
    浏览(45)
  • unity数列帧播放特效Shader怎么能放有光晕的特效能光晕清晰点

    怎么能放有光晕的特效能光晕清晰点 Shader \\\"Series/CRLuo_Teaching_Tex_Amin_G\\\" {     Properties     {         [NoScaleOffset]         _MainTex (\\\"Texture\\\", 2D) = \\\"white\\\" {}         _X_Sum(\\\"across\\\",float) = 3         _Y_Sum(\\\"vertical\\\",float) = 3         _ShowID(\\\"ID\\\",float) = 0          [Toggle(_AutoPlay_Key)] _Auto

    2024年01月16日
    浏览(58)
  • [Unity]给场景中的3D字体TextMesh增加描边方案一

    取你的文本对象,简单地添加以下脚本:

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

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

    2024年04月29日
    浏览(44)
  • 【Unity100个实用小技巧】如何修改UI上材质的Shader

    ☀️博客主页:CSDN博客主页 💨本文由 萌萌的小木屋 原创,首发于 CSDN 💢 🔥学习专栏推荐:面试汇总 ❗️游戏框架专栏推荐:游戏实用框架专栏 ⛅️点赞 👍 收藏 ⭐留言 📝,如有错误请指正 📆 未来很长,值得我们全力奔赴更美好的生活✨ ------------------❤️分割线❤

    2024年02月14日
    浏览(50)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包