当前位置: 首页 > news >正文

Unity Shader:常用的C#与shader交互的方法

  俗话说久病成医,虽然不是专业技术美术,但代码写久了自然会积累一些常用的shader交互方法。零零散散的,总结如下:

1,改变UGUI的材质球属性

  有时候我们需要改变ui的一些属性,从而实现想要的效果。通常UGUI上有如下属性,而我们想要改变,就需要获取到Material这个属性:

  这里拿Image来举例, 简单的调用示例如下(关联测试):

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;/// <summary>
/// 测试UI闪白效果
/// </summary>
public class TestUIShan : MonoBehaviour
{public Image image;public Material material;private bool isShan = false;// Start is called before the first frame updatevoid Start(){material = image.material;}// Update is called once per framevoid Update(){if (Input.GetKeyDown(KeyCode.A)){isShan = !isShan;           material.SetFloat("_Switch", isShan ? 1 : 0);           }}
}

  我们可以通过代码看出,我们可以直接获取到面板上的Material属性,然后通过SetFloat之类的Set方法,来改变UGUI的材质球属性。

2,改变物体的材质球属性

  这里多了一步,不是直接改变Material,而是先new一个MaterialPropertyBlock然后再将其赋值给Renderer属性。实现示例代码如下:

 /// <summary>/// 改变子物体颜色/// </summary>public void ChangeColor(Transform _tran, bool _isHas){var _render = _tran.GetComponent<MeshRenderer>();if (_render != null){var _pro = new MaterialPropertyBlock();_pro.SetFloat("_IsEnable", _isHas ? 0 : 1);_render.SetPropertyBlock(_pro);}var _render1 = _tran.GetComponent<SkinnedMeshRenderer>();if (_render1 != null){var _pro = new MaterialPropertyBlock();_pro.SetFloat("_IsEnable", _isHas ? 0 : 1);_render1.SetPropertyBlock(_pro);}if (_tran.childCount > 0) foreach (Transform idx in _tran) ChangeColor(idx, _isHas);}

  这里是通过SetFloat来控制_IsEnable这个属性的开关,同理我们可以调用别的set方法来改变对应的属性。

3,替换shader

  这个就更简单了,只需要得到Material的shader属性并替换即可,示例代码如下:

/// <summary>/// 替换shader/// </summary>public void ChangeShader(Transform _tran, Shader _s){if (_tran.name.Contains("diban") || _tran.name.Contains("qiang")) return;//0511佳琪定var _render = _tran.GetComponentInChildren<MeshRenderer>();if (_render != null){_render.material.shader = _s;}var _render1 = _tran.GetComponentInChildren<SkinnedMeshRenderer>();if (_render1 != null){_render1.material.shader = _s;}if (_tran.childCount > 0) foreach (Transform idx in _tran) ChangeShader(idx, _s);}

  关键函数为  _render1.material.shader = _s; 直接赋值替换即可。

4,批量获取父节点下,所有具有某一属性的物体

  其实通过2/3函数,我们可以看出用递归去获取父物体下所有具有renderer属性物体的方法,实现起来实在太繁琐了,那么有没有更简单的方法呢?

  答案是有的,使用_tran.GetComponentsInChildren即可,示例代码如下:

var _ms = transform.GetComponentsInChildren<SkinnedMeshRenderer>();

5,改变全局shader属性

  比如我们有很多使用了某一shader的物体,其中包括AI、场景等等,如果要频繁改变这些材质球的某一属性,不可能遍历去寻找的。

  好在引擎为我们提供好了方法,示例函数如下:

 Shader.SetGlobalFloat("_YydInterval", _getTime);

  同理我们可以用set来改变更多的属性,比如Shader.SetGlobalTexture来改变全局的贴图等等。

http://www.lryc.cn/news/112419.html

相关文章:

  • luajit 使用 clang编译的坑
  • [SWPUCTF 2021 新生赛]Do_you_know_http
  • web前端之CSS
  • HarmonyOS元服务开发实践:桌面卡片字典
  • xLua学习
  • ​Web3到底是个啥?
  • pycharm、idea、golang等JetBrains其他IDE修改行分隔符(换行符)
  • ThinkPHP函数深度解析
  • 【java】【maven】【高级】MAVEN聚合继承属性等
  • LeetCode150道面试经典题-合并两个有序数组(简单)
  • 记录 运维三剑客一件部署的的docker-compose,yml文件
  • Xposed框架开发
  • 2.13 Android ebpf非网络相关帮助函数API汇总(十二 本章完)
  • 关于游戏的笔记
  • vue diff 前后缀+最长递增子序列算法
  • 【Python】Locust持续优化:InfluxDB与Grafana实现数据持久化与可视化分析
  • 数组模拟循环链表
  • 第三章 图论 No.5最小生成树之虚拟源点,完全图与次小生成树
  • RESTful API的讲解以及用PHP实现RESTful API
  • Spring中@Component和@Bean的区别
  • 【问题解决】mysql 数据库字符串分割之后多行输出方法
  • flutter开发实战-时间显示刚刚几分钟前几小时前
  • 导出LLaMA等LLM模型为onnx
  • 回顾 OWASP 机器学习十大风险
  • ENSP软件的基本使用命令(第三十一课)
  • 五、FreeRTOS数据类型和编程规范
  • 码出高效_第二章 | 面向对象_上
  • 大学生课设实训|基于springboot的在线拍卖系统
  • 论文阅读 - Social bot detection in the age of ChatGPT: Challenges and opportunities
  • FPGA优质开源项目 - UDP RGMII千兆以太网