[unity][通过代码]修改材质的RenderingMode

目的

在项目中,我们经常会通过修改材质球属性,为了达到一些炫酷,甚至不炫酷的效果,这里面有几个注意事项,下面会一一说明,当然这种切属性的方式比较简单,我们通常直接使用setfolat,setcolor等函数就可以直接修改,因为修改的时候,材质球会实例化一次,所以在运行中的修改不会修改正常的材质球资源,

注意

  1. meshrender.materal的时候,你的材质球就回实例化一份,不会影响你的资源,
  2. 如果你想在运行的状态下,修改你的材质球资源,就选择共享材质,就可以修改了
  3. 一般不使用修改材质球shader的方法,一般使用的方式是直接使用两个材质球互相切换,
  4. 有一些特殊的环境下是必须通过属性修改的,那么我们怎么去使用呢,就强行改shader就可以了,那也是这篇博客主要介绍的东西.

修改RenderingMode

在这里插入图片描述
要修改这个地方,我们应该怎么做处理呢,我们首先下载官方的shader包,
在这里插入图片描述
打开这个资源包,我们找一个脚本文件叫做StandardShaderGUI.cs
在这里插入图片描述
打开之后可以看到官方对这个操作的代码
在这里插入图片描述在这里插入图片描述
但是他这里面没有对,我们把这个代码使用在项目中,发现了一个很重要的问题:

我们可以修改他的渲染模式,但是我们无法得到他当前是什么渲染模式,我们把inspector打开debug模式
在这里插入图片描述在这里插入图片描述
发现他主要是通过这个float值来判断当前是否改变的,所以我们去get这个值,但是发现如果是通过代码修改的渲染模式,无法修改这个值,所以我们只要加入这个_mode的赋值代码,就可以得到了

下面来看一下具体代码

封装代码

    using System;

    using UnityEngine;


    namespace xxl.才哥牛逼
    {
        public class FuckStandardShader
        {
            public Material m_mat;

            public enum BlendMode
            {
                Opaque = 0,
                Cutout = 1,
                Fade = 2,   // Old school alpha-blending mode, fresnel does not affect amount of transparency
                Transparent = 3 // Physically plausible transparency mode, implemented as alpha pre-multiply
            }

            public static BlendMode GetRenderingMode(Material material)
            {
                return (BlendMode)Enum.ToObject(typeof(BlendMode), material.GetFloat("_Mode"));
            }

            public static void SetupMaterialWithBlendMode(Material material, BlendMode blendMode)
            {
                switch (blendMode)
                {
                    case BlendMode.Opaque:
                        material.SetOverrideTag("RenderType", "");
                        material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.One);
                        material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.Zero);
                        material.SetInt("_ZWrite", 1);
                        material.DisableKeyword("_ALPHATEST_ON");
                        material.DisableKeyword("_ALPHABLEND_ON");
                        material.DisableKeyword("_ALPHAPREMULTIPLY_ON");
                        material.renderQueue = -1;
                        material.SetFloat("_Mode", 0);
                        break;
                    case BlendMode.Cutout:
                        material.SetOverrideTag("RenderType", "TransparentCutout");
                        material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.One);
                        material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.Zero);
                        material.SetInt("_ZWrite", 1);
                        material.EnableKeyword("_ALPHATEST_ON");
                        material.DisableKeyword("_ALPHABLEND_ON");
                        material.DisableKeyword("_ALPHAPREMULTIPLY_ON");
                        material.renderQueue = (int)UnityEngine.Rendering.RenderQueue.AlphaTest;
                        material.SetFloat("_Mode", 1);
                        break;
                    case BlendMode.Fade:
                        material.SetOverrideTag("RenderType", "Transparent");
                        material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.SrcAlpha);
                        material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha);
                        material.SetInt("_ZWrite", 0);
                        material.DisableKeyword("_ALPHATEST_ON");
                        material.EnableKeyword("_ALPHABLEND_ON");
                        material.DisableKeyword("_ALPHAPREMULTIPLY_ON");
                        material.renderQueue = (int)UnityEngine.Rendering.RenderQueue.Transparent;
                        material.SetFloat("_Mode", 2);
                        break;
                    case BlendMode.Transparent:
                        material.SetOverrideTag("RenderType", "Transparent");
                        material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.One);
                        material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha);
                        material.SetInt("_ZWrite", 0);
                        material.DisableKeyword("_ALPHATEST_ON");
                        material.DisableKeyword("_ALPHABLEND_ON");
                        material.EnableKeyword("_ALPHAPREMULTIPLY_ON");
                        material.renderQueue = (int)UnityEngine.Rendering.RenderQueue.Transparent;
                        material.SetFloat("_Mode", 3);
                        break;
                }
            }
        }
    }

demo使用

    using System;
    using System.Collections;
    using System.Collections.Generic;

    using UnityEngine;

    public class SetRenderingMode : MonoBehaviour
    {
        private void OnMouseDown()
        {
            xxl.才哥牛逼.FuckStandardShader.BlendMode v_bm = (xxl.才哥牛逼.FuckStandardShader.BlendMode)UnityEngine.Random.Range(0, 4);

            Debug.LogError(v_bm);

            xxl.才哥牛逼.FuckStandardShader.SetupMaterialWithBlendMode(GetComponent<MeshRenderer>().material, v_bm);
        }
    }
  • 5
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
is CDLXX 471 is CDLXXI 472 is CDLXXII 473 is CDLXXIII 474 is CDLXXIV 475 is CDLXXV 476 is CDLXXVI 477 is CDLXXVII 478 is CDLXXVIII 479 is CDLXXIX 480 is CDLXXX 481 is CDLXXXI 482 is CDL在Unity中,可以通过代码永久替换模型材质。下面是一个简单的示例代码: ```cXXXII 483 is CDLXXXIII 484 is CDLXXXIV 485 is CDLXXXV 486 is CDLXXXsharp using UnityEngine; using System.Collections; public class MaterialChanger : MonoBehaviour { // 新的材质 public Material newVI 487 is CDLXXXVII 488 is CDLXXXVIII 489 is CDLXXXIX 490 is CDXC 491 is CDXCI 492 is CDXCII 493 is CDXCIII 494 is CDXCIV 495 is CDXMaterial; void Start () { // 获取所有Renderer组件 Renderer[] renderers = GetComponentsInChildren<Renderer>(); // 遍CV 496 is CDXCVI 497 is CDXCVII 498 is CDXCVIII 499 is CDXCIX 500 is D 501 is DI 502 is DII 503 is DIII 504 is DIV 505 is DV 506 is D历每一个Renderer foreach(Renderer renderer in renderers) { // 获取原始材质 Material[] materials = rendererVI 507 is DVII 508 is DVIII 509 is DIX 510 is DX 511 is DXI 512 is DXII 513 is DXIII 514 is DXIV 515 is DXV 516 is DXVI 517 is DXVII 518.materials; // 遍历每一个材质 for (int i = 0; i < materials.Length; i++) { is DXVIII 519 is DXIX 520 is DXX 521 is DXXI 522 is DXXII 523 is DXXIII 524 is DXXIV 525 is DXXV 526 is DXXVI 527 is DXXVII // 替换为新的材质 materials[i] = newMaterial; } // 赋值回Renderer 528 is DXXVIII 529 is DXXIX 530 is DXXX 531 is DXXXI 532 is DXXXII renderer.materials = materials; } } } ``` 上面的代码添加到场景中的一个GameObject上,并将新材质赋值给 `newMaterial` 变量。然后运行游戏即可看到模型的材质被永久替换了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

谢斯

你的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值