【Unity3D小功能】Unity3D中实现超炫按钮悬停效果

推荐阅读

  • CSDN主页
  • GitHub开源地址
  • Unity3D插件分享
  • QQ群:398291828
  • 小红书
  • 小破站

大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦。

一、前言

先来看一下效果图:
在这里插入图片描述
感觉这种效果超炫酷,就根据大佬的文章复现了一下。

并且详细补充了一下相机、Post、材质球和Shader的处理过程,接下俩就看一下如何实现吧。

二、正文

2-1、实现思路

将鼠标光标的位置传递给Shader中,根据当前像素到像素的距离去处理像素点的颜色值。

这个动作需要拆分分为背景 + 边框两部分使用 2 个 Pass 处理。

Background Pass 背景

fixed4 frag (v2f i) : SV_Target
{fixed4 col = tex2D(_MainTex, i.uv);float dis = distance(_MousePos.xy, i.vertex.xy);float4 addColor = _Color;addColor.a = saturate(smoothstep(_ColorRadius, 0, dis) - _ColorOffset * sign(col.a-0.1));addColor.a =  addColor.a * col.a * _ColorPow;return addColor;
}

Border Pass 边框

fixed4 frag (v2f i) : SV_Target
{fixed4 col = tex2D(_BorderTex, i.uvBorder);float dis = distance(_MousePos.xy, i.vertexBorder.xy);col = col + sign(col.a) * smoothstep(_ColorRadius, 0, dis) * _Color * _BorderPow;return col;
}

2-2、Shader编写

在Unity中,右键新建一个Shader→Standard Surface Shader
在这里插入图片描述

Shader的代码如下:

Shader "Custom/HoverBtn"
{Properties{_MainTex ("MainTex", 2D) = "white" {}_MousePos ("MousePos", Vector) = (0,0,0,0)_ColorRedius ("ColorRedius", float) = 40[HDR]_Color ("Color", Color) = (0,0,0,1)_ColorOffset ("ColorOffset", Range(0, 1)) = 0_ColorPow ("ColorPow", Range(0, 1)) = 0.5_BorderTex ("BorderTex", 2D) = "white" {}_BorderColorMul ("BorderColorPow", float) = 2}SubShader{Tags { "RenderType"="Transparent" "Queue"="Transparent"}Blend SrcAlpha OneMinusSrcAlpha// MainTexPass{CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"struct appdata{float4 vertex : POSITION;float2 uv : TEXCOORD0;};struct v2f{float2 uv : TEXCOORD0;float4 vertex : SV_POSITION;};sampler2D _MainTex;float4 _MainTex_ST;v2f vert (appdata v){v2f o;o.vertex = UnityObjectToClipPos(v.vertex);o.uv = TRANSFORM_TEX(v.uv, _MainTex);return o;}fixed4 frag (v2f i) : SV_Target{fixed4 col = tex2D(_MainTex, i.uv);return col;}ENDCG}// MainColorPass{CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"struct appdata{float4 vertex : POSITION;// 原图形状maskfloat4 vert : POSITION;float2 uv : TEXCOORD0;};struct v2f{float4 vertex : SV_POSITION;float2 uv : TEXCOORD0;float4 vert : TEXCOORD1;};fixed4 _MousePos;float4 _Color;float _ColorRedius;float _ColorOffset;float _ColorPow;sampler2D _MainTex;float4 _MainTex_ST;v2f vert (appdata v){v2f o;o.vertex = UnityObjectToClipPos(v.vertex);o.vert = UnityObjectToClipPos(v.vert);o.uv = TRANSFORM_TEX(v.uv, _MainTex);return o;}fixed4 frag (v2f i) : SV_Target{fixed4 col = tex2D(_MainTex, i.uv);float dis = distance(_MousePos.xy, i.vertex.xy);float4 addColor = _Color;addColor.a = saturate(smoothstep(_ColorRedius, 0, dis) - _ColorOffset * sign(col.a-0.1));addColor.a =  addColor.a * col.a * _ColorPow;return addColor;}ENDCG}// Border ColorPass{CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"struct appdata{float4 vertexBorder : POSITION;float2 uvBorder : TEXCOORD0;};struct v2f{float2 uvBorder : TEXCOORD0;float4 vertexBorder : SV_POSITION;};sampler2D _BorderTex;float4 _BorderTex_ST;fixed4 _MousePos;float _ColorRedius;fixed4 _Color;float _BorderColorMul;v2f vert (appdata v){v2f o;o.vertexBorder = UnityObjectToClipPos(v.vertexBorder);o.uvBorder = TRANSFORM_TEX(v.uvBorder, _BorderTex);return o;}fixed4 frag (v2f i) : SV_Target{fixed4 col = tex2D(_BorderTex, i.uvBorder);float dis = distance(_MousePos.xy, i.vertexBorder.xy);col = col + sign(col.a) * smoothstep(_ColorRedius, 0, dis) * _Color * _BorderColorMul;return col;}ENDCG}}
}

2-3、控制代码编写

新建个脚本,挂载在按钮上,响应鼠标的悬浮和点击事件:

using System;
using System.Collections;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;public class HoverBtn : MonoBehaviour, IPointerDownHandler, IPointerUpHandler
{[SerializeField, ColorUsage(true, true)]private Color color = Color.white;[SerializeField]private int radius = 100;private float scaleFactor;private Material material;private Canvas canvas;Coroutine coroutine_hide;Coroutine coroutine_show;void Start(){canvas = GetComponentInParent<Canvas>();scaleFactor = canvas.scaleFactor;var image = GetComponent<Image>();material = new(image.material);image.material = material;material.SetColor("_Color", color);material.SetFloat("_ColorRadius", radius);material.SetFloat("_ScaleFactor", scaleFactor);}private void Update(){material.SetVector("_MousePos", Input.mousePosition);if (scaleFactor != canvas.scaleFactor){scaleFactor = canvas.scaleFactor;material.SetFloat("_ScaleFactor", scaleFactor);}}void IPointerDownHandler.OnPointerDown(PointerEventData eventData){if (null != coroutine_show){StopCoroutine(coroutine_show);}if (null != coroutine_hide){StopCoroutine(coroutine_hide);}coroutine_show = StartCoroutine(ChangeInnerColorStateAsync(0.3f, true));}private IEnumerator ChangeInnerColorStateAsync(float duration, bool show){#region Easestatic float inCubic(float t) => t * t * t;static float outCubic(float t) => inCubic(t - 1f) + 1f;#endregionfloat time = 0;float start = material.GetFloat("_ColorOffset");float end = show ? 0 : 0.98f;    // 当 _ColorOffset = 0 显示内部颜色Func<float, float> ease = show ? outCubic : inCubic;while (time < duration){time += Time.deltaTime;var p = ease(time / duration);material.SetFloat("_ColorOffset", Mathf.Lerp(start, end, p));yield return null;}}void IPointerUpHandler.OnPointerUp(PointerEventData eventData){if (null != coroutine_hide){StopCoroutine(coroutine_hide);}coroutine_hide = StartCoroutine(HideInnerColorAsync());}private IEnumerator HideInnerColorAsync(){//等待ShowInnerColorAsync结束if (null != coroutine_show){yield return coroutine_show;}coroutine_hide = StartCoroutine(ChangeInnerColorStateAsync(0.1f, false));}
}

2-4、材质球、材质、相机设置、UI设置、Post设置

(1)新建个材质球,使用HoverBtn这个Shader:
在这里插入图片描述
参数设置如下:
在这里插入图片描述
主要注意ColorRedius和Color两个参数。

(2)材质
右键另存为到本地,一个是背景一个是边框
在这里插入图片描述
在这里插入图片描述
(3)UI搭建

一个GridLayoutGroup父节点:
在这里插入图片描述
按钮设置:
在这里插入图片描述
可以修改按钮的颜色:
在这里插入图片描述

(4)Canvas渲染模式
在这里插入图片描述
(5)相机设置
在这里插入图片描述
相机增加Post Volume和Post Layer组件:
在这里插入图片描述
Post插件需要导入,设置Layer层,不做赘述。

整体搭建如下:
在这里插入图片描述

2-5、运行结果

在这里插入图片描述

三、参考链接

1、UI动效 01
2、UGUI 实现超赞 Win10 日历悬停效果

四、后记

总结一下就是:
(1)编写Shader
(2)编写C#脚本响应鼠标事件,传递鼠标位置
(3)其他效果设置
(4)运行起来

如果觉得本篇文章有用别忘了点个关注,关注不迷路,持续分享更多Unity干货文章。


你的点赞就是对博主的支持,有问题记得留言:

博主主页有联系方式。

博主还有跟多宝藏文章等待你的发掘哦:

专栏方向简介
Unity3D开发小游戏小游戏开发教程分享一些使用Unity3D引擎开发的小游戏,分享一些制作小游戏的教程。
Unity3D从入门到进阶入门从自学Unity中获取灵感,总结从零开始学习Unity的路线,有C#和Unity的知识。
Unity3D之UGUIUGUIUnity的UI系统UGUI全解析,从UGUI的基础控件开始讲起,然后将UGUI的原理,UGUI的使用全面教学。
Unity3D之读取数据文件读取使用Unity3D读取txt文档、json文档、xml文档、csv文档、Excel文档。
Unity3D之数据集合数据集合数组集合:数组、List、字典、堆栈、链表等数据集合知识分享。
Unity3D之VR/AR(虚拟仿真)开发虚拟仿真总结博主工作常见的虚拟仿真需求进行案例讲解。
Unity3D之插件插件主要分享在Unity开发中用到的一些插件使用方法,插件介绍等
Unity3D之日常开发日常记录主要是博主日常开发中用到的,用到的方法技巧,开发思路,代码分享等
Unity3D之日常BUG日常记录记录在使用Unity3D编辑器开发项目过程中,遇到的BUG和坑,让后来人可以有些参考。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/13688.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

优化深度神经网络

训练集、开发集(验证集)、测试集 偏差与方差 正则化 L2正则 Dropout 随机丢弃部分神经元输入&#xff0c;经常用于计算机视觉的神经网络内&#xff0c;因为通常没有足够的训练数据&#xff0c;很容易出现过拟合的问题 数据增强 训练集规一化 可以使其图像更均匀&#xff0c;…

从java角度对比nodejs、fastapi,同步和异步区别

我之前一直用java语言编程&#xff0c;最近一年用python fastapi和nodejs nestjs开发了一些项目&#xff0c;站在java程序员的角度谈谈异步编程和同步编程的区别&#xff0c;主要在两方面 处理请求&#xff0c;java常用的tomcat是多线程处理请求并执行代码&#xff0c;同步阻塞…

《图解设计模式》笔记(五)一致性

十一、Composite模式&#xff1a;容器与内容的一致性 像文件夹与文件一样&#xff0c;文件夹中可以放子文件夹与文件&#xff0c;再比如容器中可以放更小的容器和具体内容。 Composite模式&#xff1a;使容器与内容具有一致性&#xff0c;创造出递归结构。 Composite&#x…

爬虫学习笔记之Robots协议相关整理

定义 Robots协议也称作爬虫协议、机器人协议&#xff0c;全名为网络爬虫排除标准&#xff0c;用来告诉爬虫和搜索引擎哪些页面可以爬取、哪些不可以。它通常是一个叫做robots.txt的文本文件&#xff0c;一般放在网站的根目录下。 robots.txt文件的样例 对有所爬虫均生效&#…

电脑可以自己换显卡吗?怎么操作

电脑是否可以自己换显卡主要取决于电脑的类型&#xff08;台式机或笔记本&#xff09;以及电脑的硬件配置。以下是对这一问题的详细解答及操作步骤&#xff1a; 一、判断电脑是否支持更换显卡 台式机&#xff1a;大多数台式电脑都支持更换显卡。只要主板上有PCIe插槽&#xff…

【玩转 Postman 接口测试与开发2_014】第11章:测试现成的 API 接口(下)——自动化接口测试脚本实战演练 + 测试集合共享

《API Testing and Development with Postman》最新第二版封面 文章目录 3 接口自动化测试实战3.1 测试环境的改造3.2 对列表查询接口的测试3.3 对查询单个实例的测试3.4 对新增接口的测试3.5 对修改接口的测试3.6 对删除接口的测试 4 测试集合的共享操作4.1 分享 Postman 集合…

华为支付-免密支付接入免密代扣说明

免密代扣包括支付并签约以及签约代扣场景。 开发者接入免密支付前需先申请开通签约代扣产品&#xff08;即申请配置免密代扣模板及协议模板ID&#xff09;。 华为支付以模板维度管理每一个代扣扣费服务&#xff0c;主要组成要素如下&#xff1a; 接入免密支付需注意&#x…

Redis - 全局ID生成器 RedisIdWorker

文章目录 Redis - 全局ID生成器 RedisIdWorker一、引言二、实现原理三、代码实现代码说明 四、使用示例示例说明 五、总结 Redis - 全局ID生成器 RedisIdWorker 一、引言 在分布式系统中&#xff0c;生成全局唯一ID是一个常见的需求。传统的自增ID生成方式在分布式环境下容易出…

YOLOv11实时目标检测 | 摄像头视频图片文件检测

在上篇文章中YOLO11环境部署 || 从检测到训练https://blog.csdn.net/2301_79442295/article/details/145414103#comments_36164492&#xff0c;我们详细探讨了YOLO11的部署以及推理训练&#xff0c;但是评论区的观众老爷就说了&#xff1a;“博主博主&#xff0c;你这个只能推理…

用Python获取股票数据并实现未来收盘价的预测

获取数据 先用下面这段代码获取上证指数的历史数据&#xff0c;得到的csv文件数据&#xff0c;为后面训练模型用的 import akshare as ak import pandas as pd# 获取上证指数历史数据 df ak.stock_zh_index_daily(symbol"sh000001")# 将数据保存到本地CSV文件 df.…

RK3576——USB3.2 OTG无法识别到USB设备

问题&#xff1a;使用硬盘接入到OTG接口无热插拔信息&#xff0c;接入DP显示屏无法正常识别到显示设备&#xff0c;但是能通过RKDdevTool工具烧录系统。 问题分析&#xff1a;由于热插拔功能实现是靠HUSB311芯片完成的&#xff0c;因此需要先确保HUSB311芯片驱动正常工作。 1. …

RabbitMQ深度探索:前置知识

消息中间件&#xff1a; 消息中间件基于队列模式实现异步 / 同步传输数据作用&#xff1a;可以实现支撑高并发、异步解耦、流量削峰、降低耦合 传统的 HTTP 请求存在的缺点&#xff1a; HTTP 请求基于响应的模型&#xff0c;在高并发的情况下&#xff0c;客户端发送大量的请求…

maven如何不把依赖的jar打包到同一个jar?

spring boot项目打jar包部署&#xff1a; 经过以下步骤&#xff0c; 最终会形成maven依赖的多个jar&#xff08;包括lib下添加的&#xff09;、 我们编写的程序代码打成一个jar&#xff0c;将程序jar与 依赖jar分开&#xff0c;便于管理&#xff1a; success&#xff1a; 最终…

网络工程师 (21)网络的性能

一、速率&#xff08;数据率或比特率&#xff09; 定义&#xff1a;数据在数字信道上传送的速率&#xff0c;通常以比特每秒&#xff08;bps&#xff09;为单位。常见的速率单位还有千比特每秒&#xff08;kbit/s&#xff09;、兆比特每秒&#xff08;Mbit/s&#xff09;和吉比…

UE5 蓝图学习计划 - Day 14:搭建基础游戏场景

在上一节中&#xff0c;我们 确定了游戏类型&#xff0c;并完成了 项目搭建、角色蓝图的基础设置&#xff08;移动&#xff09;。今天&#xff0c;我们将进一步完善 游戏场景&#xff0c;搭建 地形、墙壁、机关、触发器 等基础元素&#xff0c;并添加角色跳跃功能&#xff0c;为…

计算机毕业设计hadoop+spark+hive民宿推荐系统 酒店推荐系统 民宿价格预测 酒店价预测 机器学习 深度学习 Python爬虫 HDFS集群

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

金蝶云星空k3cloud webapi报“java.lang.Class cannot be cast to java.lang.String”的错误

最近在对接金蝶云星空k3cloud webapi时&#xff0c;报一个莫名其妙的转换异常&#xff0c;具体如下&#xff1a; 同步部门异常! ERP接口登录异常&#xff1a;java.lang.Class cannot be cast to java.lang.String at com.jkwms.k3cloudSyn.service.basics.DeptK3CloudService.…

html的字符实体和颜色表示

在HTML中&#xff0c;颜色可以通过以下几种方式表示&#xff0c;以下是具体的示例&#xff1a; 1. 十六进制颜色代码 十六进制颜色代码以#开头&#xff0c;后面跟随6个字符&#xff0c;每两个字符分别表示红色、绿色和蓝色的强度。例如&#xff1a; • #FF0000&#xff1a;纯红…

老游戏回顾:G2

一个老的RPG游戏。 剧情有独到之处。 ------- 遥远的过去&#xff0c;古拉纳斯将希望之光给予人们&#xff0c;人类令希望之光不断扩大&#xff0c;将繁荣握在手中。 但是&#xff0c;暗之恶魔巴鲁玛将光从人类身上夺走。古拉纳斯为了守护人类与其展开了一场激战&#xff0c…

E4982A,keysight是德科技台式LCR表

是德科技keysightE4982A台式LCR表 是德KEYSIGHT的精密型LCR表E4982A&#xff0c;针对SMD电感器、EMI滤波器等无源元器件的制造测试展现出卓越性能&#xff0c;特别适用于1 MHz至3 GHz高频率范围内的阻抗测试。此外&#xff0c;E4982A还广泛应用于研发领域&#xff0c;凭借其强…