Unity动态改Shader状态透明


本文提供全流程,中文翻译。

Chinar 坚持将简单的生活方式,带给世人!

(拥有更好的阅读体验 —— 高分辨率用户请根据需求调整网页缩放比例)


Chinar —— 心分享、心创新!

助力快速完成 Shader 的动态修改

为新手节省宝贵的时间,避免采坑!

Chinar 教程效果:



全文高清图片,点击即可放大观看 (很多人竟然不知道)


1

Change Matirials Shader —— 改变材质着色状态

一个简单的小例子,没什么可说的

可以很简便的完成一个物体材质 Shader 的动态更改

  1. using UnityEngine;
  2. /// <summary>
  3. /// 枚举Shader4种状态类型
  4. /// </summary>
  5. public enum RenderingMode
  6. {
  7. Opaque,
  8. Cutout,
  9. Fade,
  10. Transparent,
  11. }
  12. /// <summary>
  13. /// 测试类:用于动态修改Shader
  14. /// </summary>
  15. public class Chinar : MonoBehaviour
  16. {
  17. public GameObject CubeGameObject; //需要改变Shader的物体
  18. public float Speed = 15f; //时间插值
  19. void Update()
  20. {
  21. transform.Rotate(Vector3.up, Speed * Time.deltaTime);
  22. }
  23. /// <summary>
  24. /// 绑定按钮:改变Shader状态
  25. /// </summary>
  26. public void ChangeShader()
  27. {
  28. //设置材质的颜色为半透明的颜色/材质有贴图,那么贴图也必须是半透明的才能看到效果
  29. CubeGameObject.GetComponent<MeshRenderer>().material.color = RandomColor();
  30. SetMaterialRenderingMode(CubeGameObject.GetComponent<MeshRenderer>().material, RenderingMode.Transparent);
  31. }
  32. /// <summary>
  33. /// 随机颜色
  34. /// </summary>
  35. /// <returns> Color </returns>
  36. private Color RandomColor()
  37. {
  38. float r = Random.Range(0f, 1f);
  39. float g = Random.Range(0f, 1f);
  40. float b = Random.Range(0f, 1f);
  41. float a = Random.Range(0f, 0.5f); //这里随机透明度
  42. Color color = new Color(r, g, b, a);
  43. return color;
  44. }
  45. /// <summary>
  46. /// 具体处理材质Shader函数
  47. /// </summary>
  48. /// <param name="material"></param>
  49. /// <param name="renderingMode"></param>
  50. public void SetMaterialRenderingMode(Material material, RenderingMode renderingMode)
  51. {
  52. switch (renderingMode)
  53. {
  54. case RenderingMode.Opaque:
  55. material.SetInt("_SrcBlend", (int) UnityEngine.Rendering.BlendMode.One);
  56. material.SetInt("_DstBlend", (int) UnityEngine.Rendering.BlendMode.Zero);
  57. material.SetInt("_ZWrite", 1);
  58. material.DisableKeyword("_ALPHATEST_ON");
  59. material.DisableKeyword("_ALPHABLEND_ON");
  60. material.DisableKeyword("_ALPHAPREMULTIPLY_ON");
  61. material.renderQueue = -1;
  62. break;
  63. case RenderingMode.Cutout:
  64. material.SetInt("_SrcBlend", (int) UnityEngine.Rendering.BlendMode.One);
  65. material.SetInt("_DstBlend", (int) UnityEngine.Rendering.BlendMode.Zero);
  66. material.SetInt("_ZWrite", 1);
  67. material.EnableKeyword("_ALPHATEST_ON");
  68. material.DisableKeyword("_ALPHABLEND_ON");
  69. material.DisableKeyword("_ALPHAPREMULTIPLY_ON");
  70. material.renderQueue = 2450;
  71. break;
  72. case RenderingMode.Fade:
  73. material.SetInt("_SrcBlend", (int) UnityEngine.Rendering.BlendMode.SrcAlpha);
  74. material.SetInt("_DstBlend", (int) UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha);
  75. material.SetInt("_ZWrite", 0);
  76. material.DisableKeyword("_ALPHATEST_ON");
  77. material.EnableKeyword("_ALPHABLEND_ON");
  78. material.DisableKeyword("_ALPHAPREMULTIPLY_ON");
  79. material.renderQueue = 3000;
  80. break;
  81. case RenderingMode.Transparent:
  82. material.SetInt("_SrcBlend", (int) UnityEngine.Rendering.BlendMode.One);
  83. material.SetInt("_DstBlend", (int) UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha);
  84. material.SetInt("_ZWrite", 0);
  85. material.DisableKeyword("_ALPHATEST_ON");
  86. material.DisableKeyword("_ALPHABLEND_ON");
  87. material.EnableKeyword("_ALPHAPREMULTIPLY_ON");
  88. material.renderQueue = 3000;
  89. break;
  90. }
  91. }
  92. }

2

Change Matirials Shader —— 改变材质着色状态

不明白的请下载Demo

简单易懂,拿了就用!



简单易懂游戏中动态修改Shader状态的例子、实现透明


支持

May Be —— 搞开发,总有一天要做的事!

拥有自己的服务器,无需再找攻略!

Chinar 提供一站式教程,闭眼式创建!

为新手节省宝贵时间,避免采坑!

先点击领取 —— 阿里全产品优惠券 (享受最低优惠)



1 —— 云服务器超全购买流程 (新手必备!)



2 —— 阿里ECS云服务器自定义配置 - 购买教程(新手必备!)



3—— Windows 服务器配置、运行、建站一条龙 !



4 —— Linux 服务器配置、运行、建站一条龙 !




" role="presentation">

Chinar


END

本博客为非营利性个人原创,除部分有明确署名的作品外,所刊登的所有作品的著作权均为本人所拥有,本人保留所有法定权利。违者必究


对于需要复制、转载、链接和传播博客文章或内容的,请及时和本博主进行联系,留言,Email: ichinar@icloud.com


对于经本博主明确授权和许可使用文章及内容的,使用时请注明文章或内容出处并注明网址

Unity 3D动态修改Shader状态,使物体透明等等的更多相关文章

  1. Unity 中动态修改碰撞框(位置,大小,方向)

    在Unity中,玩家处于不同的状态,要求的碰撞框的 位置/大小/方向 会有所改变,怎么动态的修改碰撞框呢? 下面是Capsure Collider(胶囊体)的修改: CapsuleCollider.d ...

  2. Unity 3D Intantiate过程中Transform 空物体和本体之间的关系

    想当年刚学Unity的时候,这个问题困扰了我好几天,因此来分享一下当初解决问题的思路. 我们通过Unity构建场景的过程中,经常发现一个现象,就是物体在拖进场景中后,我们会发现物体是反的,通过改变物体 ...

  3. Unity 3D 如何修改新建脚本中的 C# 默认创建的 Script 脚本格式

    首先在Unity的安装路径下找到 Unity5\Editor\Data\Resources\ScriptTemplates路径的(81-C# Script-NewBehaviourScript.cs. ...

  4. 关于Unity中如何代码动态修改天空盒

    在Unity中动态修改天空盒有两种方法: 一.为每个Texture建立天空盒材质球,需要更换时直接将对应材质球作为天空盒,缺点是建立的材质球太多 private void ChangeSkybox(M ...

  5. Unity 3D类结构简介

    趁着周末,再来一发.对于Unity3D,我也是刚开始学习,希望能够与大家多多交流.好了,废话不多说,下面继续. 本篇文章使用C#进行举例和说明.关于Unity 3D编辑器中的各种窗口,网上有很多资料了 ...

  6. [Unity Shader]光照模型对物体的假设

    什么是光照模型 光照模型就是模拟光在物体间的传递过程,以确保物体可见表面每一点的亮度和颜色. 当光照射到一个物体表面时,光可能被吸收.反射或折射.反射和折射的光使物体可见.如果入射光全部被吸收,物体将 ...

  7. Unity学习笔记(2): 如何使物体消失

    Unity使物体消失的三种方法 GameObject.Destroy(gameobjcet); //在下一帧破坏物体 gameObject.SetActive(false); //Unity2017新 ...

  8. Unity 3d 实现物体跟随摄像机视野运动

    https://blog.csdn.net/qq_31411825/article/details/61623857 Unity 3d 实现物体跟随摄像机视野运动Created by miccall ...

  9. Unity 3D使用GameObject创建一个简单的可移动物体

    于Unity 3D游戏的开发.游戏脚本需要3D模拟组合,该脚本将被写入阻力3D为了达到效果对象. 以下是一个小实例,使用Unity 3D实现一个可控制移动的小人.小人能够向前.向后.向左和向右移动. ...

随机推荐

  1. nop 4.1 Widget 探究- 视图组件

    1. 系统默认自带了一个NivoSlider 的Wdget. 在Nop.Web项目首页的HomePageTop里 这个写法是 ASP.NET Core MVC 中的新特性 视图组件,与局部视图相似,但 ...

  2. vue中alert toast confirm loading 公用

    import Vue from 'vue' import { ToastPlugin, AlertPlugin, ConfirmPlugin, LoadingPlugin } from 'vux' / ...

  3. py propterties reuqest.post

    import tracebackclass Properties(object): def __init__(self, fileName): self.fileName = fileName sel ...

  4. Use of undefined constant FTP_BINARY - assumed 'FTP_BINARY

    用Laravel中的filesystems里面的ftp上传文件时报错.在windows上开发,文件上传的时候碰到上面的问题,搜了些资料,发现是php7的ftp拓展默认未开启. 第一步:检查extens ...

  5. Docker安装websphere(四)

    在Docker容器里安装webshpere <!--前提:已经安装好了docker,能够正常使用.--> (1)docker安装websphere(需要账号和密码登录,不挂载数据卷) 获取 ...

  6. 解决WDCP3环境gbk网站编码程序乱码问题

    因为默认WDCP V3版本环境编码格式是UTF-8版本,如果我们程序采用的是GBK编码肯定都会有乱码问题. 我们到WDCP后台,"网站管理"-"PHP设置",看 ...

  7. mysql存储过程中使用游标

    用户变量一般以@开头,作用于全局范围 局部变量需用 declare 定义格式为 declare 变量名 数据类型 [default value]; mysql 数据类型有 int ,float,dat ...

  8. HashMap中hashCode()和equals()重要性

    Java中HashMap根据hashCode()和equals()方法来获取键值对的索引,同时也通过这两个方法由key值获取value值.如果没有这两个方法,那么当有两个相同的 hash值时,可能会被 ...

  9. DevExpress WinForms v18.2新版亮点(三)

    行业领先的.NET界面控件2018年第二次重大更新——DevExpress v18.2日前正式发布,本站将以连载的形式为大家介绍各版本新增内容.本文将介绍了DevExpress WinForms v1 ...

  10. springMvc 简单搭建

    1.pom.xml 依赖引入 2.配置web.xml 3.配置 springMvc.xml 4.配置 logback.xml 5.编写 controller 测试 1.pom.xml 依赖引入 < ...