可信网站验证服务证书/百度排名点击
文章目录
- 前言
- 一、协程是什么
- 二、在Unity中使用协程
- 1、我们在 Start 中测试一下协程的执行顺序
- 2、我们实现一个点击按钮实现角色受击效果
- 三、协程中的动画过渡
- 1、首先,在协程内实现中毒并且消散的效果
- 2、在 OnGUI 内,给一个新按钮使用刚刚定义的协程
- 四、C#控制Shader变体开关 开启死亡消融效果变体
- 1、C# 怎么开启和关闭 Shader变体
- 2、在协程中开启死亡消融变体及实现效果
- 3、在OnGUI中,定义一个新按钮调用死亡协程
- 五、测试代码
- Shader:
- C#脚本:
前言
在上一篇文章实现了C#脚本简单修改Shader材质的效果后,我们使用按钮点击结合协程来实现一下游戏中角色常见的效果:受击、中毒、消融效果
我们继续使用上一篇的 Shader 和 C# 脚本来继续测试
- Unity中C#如何访问并修改Shader材质
一、协程是什么
Unity中的协程可以理解为 C# 中多线程的作用,在主线程运行的同时,把一些不确定时间的步骤并行操作,不影响主线程。但是协程 和 C#的多线程不一样。
协程模拟了多线程的作用,但是不是真正意义上的多线程
二、在Unity中使用协程
1、我们在 Start 中测试一下协程的执行顺序
- 我们定义一个协程在控制台 等待 2 秒 输出 2
IEnumerator Wait()
{
yield return new WaitForSeconds(2);
Debug.Log(2);
}
- 在 Start 按如下顺序输出
Debug.Log(1);
//这里使用协程输出一个 2
StartCoroutine(Wait());
Debug.Log(3);
- 我们运行一下看看输出的顺序
控制台先输出了1、3 间隔了两秒输出了 2
2、我们实现一个点击按钮实现角色受击效果
- 我们使用协程实现一个改变颜色后 间隔 0.15 秒恢复原本颜色的效果
IEnumerator WaitBehit()
{
skr.sharedMaterial.SetColor("_Color", Color.red);
yield return new WaitForSeconds(0.15f);
skr.sharedMaterial.SetColor("_Color",Color.white);
}
- 在 GUI 绘制时,给按钮点击后加上 角色受击后的协程
void OnGUI()
{
if (GUI.Button(new Rect(10, 10, 150, 50), “被击”))
{
StartCoroutine(WaitBehit());
}
}
我们来测试看一下效果:
三、协程中的动画过渡
主要实现一个角色中毒后中毒消散的效果
1、首先,在协程内实现中毒并且消散的效果
- 在协程内定义一个计数器,作为颜色过度的控制器
- 在协程内使用死循环,实现计数器的累加
- 在协程内使用 Color.Lerp(A,B,x);实现颜色过度效果
- 把该过度颜色赋值给我们的小狐狸
IEnumerator WaitMethysis(){float _time = 0;Color color;while (true){_time += Time.deltaTime;yield return new WaitForEndOfFrame();color = Color.Lerp(Color.green, Color.white,_time / 2);skr.sharedMaterial.SetColor("_Color",color );if (_time >= 2){yield break;}}}
2、在 OnGUI 内,给一个新按钮使用刚刚定义的协程
if (GUI.Button(new Rect(10,70,150,50),“中毒”))
{
StartCoroutine(WaitMethysis());
}
我们来测试一下看看效果:
在开启一个协程时,记着停止协程
//关闭指定协程
StopCoroutine(string);
//关闭所有协程
StopAllCoroutines();
四、C#控制Shader变体开关 开启死亡消融效果变体
1、C# 怎么开启和关闭 Shader变体
- 开启关键字
material.EnableKeyword(string);
- 关闭关键字
material.DisableKeyword(string);
- 这里的关键字不是Shader属性面板的属性名,是在Shader的Pass中的变体名
2、在协程中开启死亡消融变体及实现效果
- 先在协程中定义一个_time 计数器
- 开启死亡消融变体
- 使用 while 给计数器累加,作为消融的控制值
- 修改_Clip 属性值实现消融
IEnumerator WaitDead(float time){float _time = 0;while (true){_time += Time.deltaTime;yield return new WaitForEndOfFrame();skr.sharedMaterial.EnableKeyword("_DISSOLVEENABLE_ON");skr.sharedMaterial.SetFloat("_Clip",_time / time);if (_time >=time){skr.sharedMaterial.SetFloat("_Clip",0);skr.sharedMaterial.DisableKeyword("_DISSOLVEENABLE_ON");yield break;}}}
3、在OnGUI中,定义一个新按钮调用死亡协程
if (GUI.Button(new Rect(10,130,150,50),“死亡消融”))
{
StopAllCoroutines();
StartCoroutine(WaitDead(2));
}
我们来测试一下看看效果:
五、测试代码
Shader:
//角色消融效果
Shader "MyShader/P2_5_6"
{Properties{//使用这个标签,可以使外部暴露属性,有标题[Header(Base)][NoScaleOffset]_MainTex ("Texture", 2D) = "white" {}_Color("Color",Color) = (1,1,1,1)_Clip("Clip",Range(0,1)) = 0//使用这个标签可以 在两行暴露属性之间加 间隙[Space(10)][Header(Dissolve)][Toggle]_DissolveEnable("Dissolve Enable",int) = 0_DissolveTex("DissolveTex",2D) = "black"{}[NoScaleOffset]_RampTex("RampTex(RGB)",2D) = "black" {}}SubShader{Pass{CGPROGRAM#pragma vertex vert#pragma fragment frag//定义消融变体开关#pragma shader_feature _ _DISSOLVEENABLE_ON #include "UnityCG.cginc"sampler2D _MainTex;fixed4 _Color;float _Clip;sampler2D _DissolveTex; //这个四维向量,xyzw分别表示 Tilling 和 Offset 的 xy ,命名方式 在纹理名 后加 _STfloat4 _DissolveTex_ST;//因为 在使用渐变纹理时,只使用了 渐变纹理的 u 坐标,所以把 sampler2D 换位 samplersampler _RampTex;struct appdata{float4 vertex : POSITION;float4 uv : TEXCOORD0;};struct v2f{float4 uv : TEXCOORD0;float4 pos : SV_POSITION;};v2f vert (appdata v){v2f o;o.pos = UnityObjectToClipPos(v.vertex);//为了减少传入的值 ,所以就不创建新变量来存储,而是把 uv 改为 四维向量 来用//使用 o.uv 的 xy 来存放 原人物贴图//使用 o.uv 的 zw 来存放 噪波贴图缩放 和 偏移 后的值o.uv.xy = v.uv.xy;//o.uv.zw = v.uv * _DissolveTex_ST.xy + _DissolveTex_ST.zw;o.uv.zw = TRANSFORM_TEX(v.uv,_DissolveTex);return o;}fixed4 frag (v2f i) : SV_Target{fixed4 col = tex2D(_MainTex, i.uv.xy);col *= _Color;#if _DISSOLVEENABLE_ON//外部获取的 纹理 ,使用前都需要采样fixed4 dissolveTex = tex2D(_DissolveTex,i.uv.zw);//片段的取舍clip(dissolveTex.r - _Clip);//进行归一化fixed4 dissolveValue = saturate((dissolveTex.r - _Clip) / (_Clip + 0.1 - _Clip));fixed4 rampTex = tex1D(_RampTex,dissolveValue.r);col += rampTex;#endifreturn col;}ENDCG}}
}
C#脚本:
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;//C#如何访问并且修改材质属性
public class P2_5_6 : MonoBehaviour
{#region [成员变量]public GameObject Fox;private SkinnedMeshRenderer skr;#endregion#region [Start/Update]void Start(){skr = Fox.GetComponentInChildren<SkinnedMeshRenderer>();}void Update(){}#endregion#region [GUI]void OnGUI(){if (GUI.Button(new Rect(10, 10, 150, 50), "被击")){StopAllCoroutines();StartCoroutine(WaitBehit());}if (GUI.Button(new Rect(10,70,150,50),"中毒")){StopAllCoroutines();StartCoroutine(WaitMethysis(2));}if (GUI.Button(new Rect(10,130,150,50),"死亡消融")){StopAllCoroutines();StartCoroutine(WaitDead(2));}}#endregion#region [受击]IEnumerator WaitBehit(){skr.sharedMaterial.SetColor("_Color", Color.red);yield return new WaitForSeconds(0.15f);skr.sharedMaterial.SetColor("_Color",Color.white);}#endregion#region [中毒]IEnumerator WaitMethysis(float time){float _time = 0;Color color;while (true){_time += Time.deltaTime;yield return new WaitForEndOfFrame();color = Color.Lerp(Color.green, Color.white,_time / time);skr.sharedMaterial.SetColor("_Color",color );if (_time >= time){yield break;}}}#endregion#region [死亡消融]IEnumerator WaitDead(float time){float _time = 0;while (true){_time += Time.deltaTime;yield return new WaitForEndOfFrame();skr.sharedMaterial.EnableKeyword("_DISSOLVEENABLE_ON");skr.sharedMaterial.SetFloat("_Clip",_time / time);if (_time >=time){skr.sharedMaterial.SetFloat("_Clip",0);skr.sharedMaterial.DisableKeyword("_DISSOLVEENABLE_ON");yield break;}}}#endregion
}
相关文章:

Unity中C#使用协程控制Shader材质变化
文章目录 前言一、协程是什么二、在Unity中使用协程1、我们在 Start 中测试一下协程的执行顺序2、我们实现一个点击按钮实现角色受击效果 三、协程中的动画过渡1、首先,在协程内实现中毒并且消散的效果2、在 OnGUI 内,给一个新按钮使用刚刚定义的协程 四…...

WordPress禁止显示指定类别的文章
使用wordpress禁止输出指定类别的文章可以给get_posts()函数传个数组参数,如下: <div class"widget" id"diary1"> <h3>随机呈现</h3> <ul> <?php $argsarray( numberposts>16, category>-9,-12, …...

C#里面的泛型(T),泛型类,泛型方法,泛型接口等简单解释
https://blog.csdn.net/dap769815768/article/details/81946506 只是比较简单的解释,在实际使用中,如果遇到需要深入研究的场景,再翻阅相关资料深入研究下。 一、泛型T 这个T在实际使用中很常见,比如List<T>。其实我们还…...

C语言——指针(五)
📝前言: 上篇文章C语言——指针(四)更加深入的介绍了不同类型指针的特点,这篇文章主要想记录一下函数与指针的结合运用以及const和assert关于指针的用法: 1,函数与指针 2,const 3&am…...

文章解读与仿真程序复现思路——中国电机工程学报EI\CSCD\北大核心《考虑气电联合需求响应的气电综合能源配网系统协调优化运行》
这个标题涉及到一个涉及气体(天然气)和电力的综合能源配网系统,并且强调了考虑气电联合需求响应的协调优化运行。让我们逐步解读: 气电综合能源配网系统: 这指的是一个结合了气体(通常是天然气)…...

PostgreSQL 主键和唯一键的区别
主键和唯一键的区别 主键(Primary Key): 主键是用于唯一标识表中的每一条记录的键。主键必须是唯一的,不允许为空。一个表只能有一个主键。主键可以由一个或多个字段组成。主键的值在整个表中必须是唯一的,用于确保数据…...

删除表格中的所有绘图
Ctrl G 调出定位的对话框再点击定位条件 按Delete键,删除...

Linux卸载Nginx
1、停止Nginx软件 #/usr/local/nginx/sbin/nginx-sstop 或者kill进程 #ps -ef|grep nginx #kill -9 PID 2、查找根下所有名子包含nginx的文件 #sudofind/-namenginx* 3、执行命令删掉nignx安装的相关文件 # rm -rf /usr/local/sbin/nginx # rm -rf /usr/local/nginx # r…...

Qt之QGraphicsView —— 笔记1:绘制简单图元(附完整源码)
效果 相关类介绍 QGraphicsView类提供了一个小部件,用于显示QGraphicsScene的内容。QGraphicsView在可滚动视口中可视化。QGraphicsView将滚动其视口,以确保该点在视图中居中。 QGraphicsScene类 提供了一个用于管理大量二维图形项的场景。请注意,QGraphicsScene没有自己的视…...

SpringIoC原理
我是南城余!阿里云开发者平台专家博士证书获得者! 欢迎关注我的博客!一同成长! 一名从事运维开发的worker,记录分享学习。 专注于AI,运维开发,windows Linux 系统领域的分享! 本…...

如何对售后服务的全流程进行精细化的管理?
——“如何对售后服务的全流程进行精细化的管理?” ——“售后又是一个十分复杂的过程,仅靠手工或者电子表格记录这些内容,肯定是低效率、易出错的。最好的办法是借助合适的管理工具进行精细化的过程管理。” 假设你购买了一台新的家用电器…...

SAP UI5 walkthrough step2 Bootstrap
我的理解,这就是一个引导指令 1.我们右键打开命令行--执行 ui5 use OpenUI5 2.执行命令:ui5 add sap.ui.core sap.m themelib_sap_horizon 执行完之后,会更新 yaml 文件 3.修改index.html <!DOCTYPE html> <html> <head&…...

Gemini:定义下一代人工智能的里程碑
Google最近发布号称世界最强的大模型"Gemini",其强大多模态LLM,标志着AI技术的一个新时代。 Gemini作为"迄今为止最强大的AI模型"之一,其独特之处在于它融合了多种模式的处理能力,能够同时理解和生成文本、代…...

一些系统日常运维命令和语句
一、前言 记录一些日常系统运维的命令和语句 二、linux命令与语句 1、linux查看各目录使用磁盘情况 du -h /home home为目录 du -h /home 2.查看内存使用情况 free -h 3、查看进程和CPU使用情况 top top 三、数据库语句 1、统计mysql数据库表数量 SELECT COUNT(*) A…...

微信小程序uni.chooseImage()无效解决方案
Bug场景: 微信小程序在上传图片时可以通过 uni.chooseImage()方案进行上传,这里不再赘述具体参数。一直项目都可以正常使用,突然有一天发现无法使用该方法,于是查了一下,发现是用户隐私协议问题。故记录一下解决方案。…...

Rust深入浅出:编程的深邃大海中的奇妙冒险
第一章:前言 欢迎来到Rust的深邃大海,这里是一片充满挑战和奇妙冒险的领域。在这篇文章中,我们将深入浅出,探索Rust编程语言的深层次特性,并通过诙谐而深刻的方式,带你走进这个奇妙的编程世界。 第二章&a…...

go-zero开发入门-API网关开发示例
开发一个 API 网关,代理 https://blog.csdn.net/Aquester/article/details/134856271 中的 RPC 服务。 网关完整源代码 // file: main.go package mainimport ("flag""fmt""github.com/zeromicro/go-zero/core/conf""github.c…...

TCP一对一通信
package 二十一章; import java.io.*; import java.net.ServerSocket; import java.net.Socket; import java.util.Scanner;/*** Socket服务端**/ public class SocketServer {public static void main(String[] args) {ServerSocket ss null;Socket s null;try {// 创建监听…...

laravel DB::connection 报错 Database connection [{$name}] not configured
DB::connection(mysql2);//不是连接数据库名...

快捷支付是什么?快捷支付好申请吗?
快捷支付是指用户在购买商品时,不需要打开网上银行,只需提供银行卡号码、户名、手机号码等信息,银行验证手机号码的正确性,输入动态密码即可完成支付,无需打开网上银行。持卡人将银行卡绑定到第三方支付应用程序&#…...

如何在Spring Boot中集成RabbitMQ
如何在Spring Boot中集成RabbitMQ 在现代微服务架构中,消息队列(如RabbitMQ)扮演了关键的角色,它不仅能够提供高效的消息传递机制,还能解耦服务间的通信。本文将介绍如何在Spring Boot项目中集成RabbitMQ,…...

【Spring Boot 源码学习】ApplicationContextInitializer 详解
Spring Boot 源码学习系列 ApplicationContextInitializer 详解 引言往期内容主要内容1. 初识 ApplicationContextInitializer2. 加载 ApplicationContextInitializer3. ApplicationContextInitializer 的初始化 总结 引言 书接前文《初识 SpringApplication》,我们…...

软考2018下午第六题改编逻辑(状态模式)
在状态模式中,我们创建表示各种状态的对象和一个行为随着状态对象改变而改变的 context 对象 package org.example.状态模式.软考航空;/*** author lst* date 2023年12月07日 15:37*/ class FrequentFlyer {CState state;double flyMiles;public FrequentFlyer() {…...

基于深度学习的典型目标跟踪算法
目标跟踪是计算机视觉领域中一个重要的任务,它涉及在视频序列中持续地定位和追踪目标对象。以下是一些常见的深度学习目标跟踪算法: Siamese Network: Siamese网络是一种孪生网络结构,它通过将目标图像与周围环境进行对比,学习目…...

docker搭建nginx实现负载均衡
docker搭建nginx实现负载均衡 安装nginx 查询安装 [rootlocalhost ~]# docker search nginx [rootlocalhost ~]# docker pull nginx准备 创建一个空的nginx文件夹里面在创建一个nginx.conf文件和conf.d文件夹 运行映射之前创建的文件夹 端口:8075映射80 docker…...

Android蓝牙协议栈fluoride(二) - 软件框架
概述 fluoride 协议栈在整个软件框架中作为一个中间件的角色,向上对接APP,向下对接蓝牙芯片。fluoride采用C语言实现,与APP(Jave)通信采用JNI机制;与蓝牙芯片通信使用HCI硬件接口(HCI软件协议参考蓝牙核心规范&#x…...

IDEA中的Postman!
Postman是大家最常用的API调试工具,那么有没有一种方法可以不用手动写入接口到Postman,即可进行接口调试操作?今天给大家推荐一款IDEA插件:Apipost Helper,写完代码就可以调试接口并一键生成接口文档!而且还…...

el-tooltip (element-plus)修改长度
初始状态: 修改后: 就是添加 :teleported"false",问题解决!!! <el-tooltipeffect"dark"content"要求密码长度为9-30位,需包含大小写字母、数字两种或以上与特殊字…...

Verilog学习 | 用initial语句写出固定的波形
initial beginia 0;ib 1;clk 0;#10ia 1; #20ib 0;#20ia 0; endalways #5 clk ~clk; 或者 initial clk 0;initial beginia 0;#10ia 1; #40ia 0; endinitial beginib 1;#30 ib 0; endalways #5 clk ~clk;...

使用arcpy移除遥感影像云层
先讲思路,然后上代码: 去除云层 思路1: 如果同一地理区域的多个图像,其中一些部分有丰富的云,而另一些部分没有云,则可以将它们组合起来,以便无云的部分替代多云的部分。这种方法很简单&…...