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

这篇具有很好参考价值的文章主要介绍了Unity Shader:常用的C#与shader交互的方法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

1,改变UGUI的材质球属性

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

Unity Shader:常用的C#与shader交互的方法,U3D,shader,unity,c#,游戏引擎,shader

  这里拿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 update
    void Start()
    {
        material = image.material;
    }

    // Update is called once per frame
    void 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来改变全局的贴图等等。文章来源地址https://www.toymoban.com/news/detail-632803.html

到了这里,关于Unity Shader:常用的C#与shader交互的方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • Unity骚操作:更改u3d导出apk时候所使用的 gradle、GradleTemplates、VisualStudioGradleTemplates、minifyEnabled是否开启混淆等

    测试unity版本:5.6.4 gradle文件夹:里面的是一些unity用自身打包apk时候用到的一些工具 GradleTemplates文件夹:    libTemplate.gradle  mainTemplate.gradle  settingsTemplate.gradle 附上让Unity自身打APK的时候 使用上镜像并且设置上 build:gradle通用工具让 需要生成AS工程的时候 可以让AS识别

    2024年02月14日
    浏览(55)
  • U3D面试汇总!!!

    ① 微软开发的一种 OOP 编程语言。专门用于.NET应用而开发。 ② 面向对象的 三大特征 (封装,继承,多态)。除了三大特征以外,C#还添加了 事件和委托 ,增强了编程的灵活性。 ③ 简单,安全 。C#不再使用指针,而且不允许直接读取内存等不安全操作。提供了相比C/C++,

    2023年04月08日
    浏览(61)
  • U3D热更新技术

    @作者 : SYFStrive @博客首页 : HomePage 📌: 个人社区(欢迎大佬们加入) 👉: 社区链接🔗 🤷‍♀️: 创作不易转发需经作者同意😈 💃: 程序员每天坚持锻炼💪 👉 U3D热更新技术 (🔥) 🕐:开发者将测试好的代码,发布到应用商店的审核平台,平台方会进行稳定性及性

    2024年02月02日
    浏览(56)
  • U3D通过按钮点击实现场景切换

    1.新建UI,选择button选项,新建button;   3.新建一个空对象,挂载一个scenechange c#脚本; 4.编写脚本,1头文件using UnityEngine.SceneMangement                    2public void change() {                     scenemanager.loadscene (1)  }//括号中的数字为第2步中场景后面的数字          

    2024年02月07日
    浏览(47)
  • Unity | Shader基础知识(第十集:shader常用外部资产单词速成)

    目录 一、外部资产简介 二、常用的外部资产单词 三、常用的外部资产单词和引入内部 四、图片资产外部调整的具体讲解 1.Tiling,中文:铺地砖 2.Offset,中文:偏移 五、作者的话 一、外部资产简介 在第六集中,我们加入过外部颜色资源。 Unity | Shader基础知识(第六集:语法

    2024年04月13日
    浏览(48)
  • Unity | Shader基础知识(第九集:shader常用单词基础知识速成)

    目录 一、顶点(Vertex)和法线(Normal) 二、UV信息 三、 基础数据种类 1 基础数据种类 2 基础数据数组 3 基础数据数组的赋值 4 对数据数组的调用 四、 基础矩阵 1 基础矩阵种类  2 对矩阵数组的调用 2.1对一个数据的调用  2.2对多个数据的调用  2.3对数据的赋值 五、基础纹理种

    2024年02月01日
    浏览(73)
  • unity URP 利用particle system制作简单的shader交互

    首先这里制作了一个简单交互,使用shader grapgh,根据计算距离和变化数值的差实现交互后的扩散,同时计算消散遮罩让它逐渐谈去。 将他赋予材质物体,根据脚本传入位置和逐渐变化的大小后,呈现这样的效果。 但是,shader graph这样的工具,在做这种效果非常快的同时,也

    2024年02月07日
    浏览(44)
  • 【U3D引擎】没有切换中文选项&切换中文模式?

    第一步,查看是否有勾选简体中文模块 第二步,拉到底部,勾选简体中文,点击继续 第三步,勾选已阅读同意后点击安装 第四步,等待下载安装完成 过程中会自动安装VS软件 如有下载失败可重新下载 注:如果重复提示错误也没有没有关系,直接略过就好, 第五步,随便打

    2024年02月06日
    浏览(73)
  • AVProVideo☀️一、一款U3D视频播放插件介绍

    🎊 商务合作:https://skode.cn/file/businesscard/wechat.jpg 🎥 本文由 星河造梦坊公司官方 原创! 🏅 如果你有技术问题或项目开发,都可以加上方的联系方式,和我聊一聊你的故事🧡 前段时间看到有人问: 橙哥,AVProVideo支持8K全景视频嘛? 看来,好多人对这款插件的支持的功能

    2024年02月07日
    浏览(51)
  • Unity中C#如何访问并修改Shader材质

    我们写好Shader后,很多效果是需要结合脚本来控制显示的。我们在这篇文章中,使用C#脚本来访问修改材质中的属性,来体验一下脚本怎么控制Shader材质在游戏中互动时变化 我们 OnGUI 这个生命周期函数中,进行操作 void OnGUI() { } 使用GUI.Button(position,text);可以绘制一个按钮 pu

    2024年02月04日
    浏览(45)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包