关闭

Unity 设置材质属性事件

标签: unity编辑器
2382人阅读 评论(1) 收藏 举报
分类:

材质着色器属性

在过场动画时,可能需要动态修改材质属性的事件,Unity 的材质Material通过SetColorSetVector等接口来更改设置其属性值。在编辑器代码中,有个MaterialProperty公开类,作为材质属性设置和获取的接口。

它将材质属性类型分为5种:

public enum PropType
{
    Color,
    Vector,
    Float,
    Range,
    Texture
}

将纹理类型分为3种:

public enum TexDim
{
    Unknown = -1,
    None,
    Tex2D = 2,
    Tex3D,
    Cube,
    Any = 6
}

可获取和设置值包括colorValuefloatValuevectorValuetextureValue,那么设计更改材质属性事件也可按此来设计。

材质属性更改事件

对事件的物体,做材质属性的修改。

using System;
using UnityEngine;

namespace CinemaDirector
{
    [CutsceneItemAttribute("Material", "Set Material Propery", CutsceneItemGenre.ActorItem)]
    public class SetMaterialProperyEvent : CinemaActorEvent
    {
        public enum PropType
        {
            Color,
            Vector,
            Float,
            Range,
            Texture
        }

        [Flags]
        public enum TextureModifyType
        {
            Texture = 1,
            TextureOffset = 2,
            TextureScale = 4
        }

        public string shaderName = String.Empty;
        public PropType propType = PropType.Texture;
        public string propName = "_MainTex";
        public Color colorValue;
        public Vector4 vectorValue;
        public float floatValue;
        public Texture textureValue;
        public int textureModifyType = (int)TextureModifyType.Texture;
        public Vector2 textureOffsetValue;
        public Vector2 textureScaleValue = Vector2.one;

        public override void Trigger(GameObject Actor)
        {
            if (!Application.isPlaying || string.IsNullOrEmpty(propName) || !Actor)
            {
                return;
            }

            Renderer[] mrs = Actor.GetComponentsInChildren<Renderer>();
            foreach (var mr in mrs)
            {
                ModifyMaterialProp(mr);
            }
        }

        private void ModifyMaterialProp(Renderer mr)
        {
            if (!mr)
            {
                return;
            }
            Material mat = mr.material;
            if (!mat || !mat.shader)
            {
                return;
            }
            if (mat.shader.name != shaderName)
            {
                return;
            }

            switch (propType)
            {
                case PropType.Color:
                    mat.SetColor(propName, colorValue);
                    break;
                case PropType.Vector:
                    mat.SetVector(propName, vectorValue);
                    break;
                case PropType.Float:
                case PropType.Range:
                    mat.SetFloat(propName, floatValue);
                    break;
                case PropType.Texture:
                    if (((TextureModifyType)textureModifyType & TextureModifyType.Texture) != 0)
                    {
                        mat.SetTexture(propName, textureValue);
                    }
                    if (((TextureModifyType)textureModifyType & TextureModifyType.TextureOffset) != 0)
                    {
                        mat.SetTextureOffset(propName, textureOffsetValue);
                    }
                    if (((TextureModifyType)textureModifyType & TextureModifyType.TextureScale) != 0)
                    {
                        mat.SetTextureScale(propName, textureScaleValue);
                    }
                    break;
            }
        }
    }
}

SetMaterialProperyEvent 的检视器设计

虽然SetMaterialProperyEvent脚本可以达到运行时修改材质属性,但是在编辑时,需要手动去查看此时材质所拥有的属性,是比较麻烦的。可以做个编辑器类,自动获取当前所有可更改的材质属性,让用户去选择。

新建SetMaterialProperyEventInspector脚本,在OnEnable的时候,通过MaterialEditor.GetMaterialProperties来获得材质的所有属性。接着,将所有的属性描述列出来,让用户选择即可。

0
0
查看评论

【Unity技巧】调整画质(贴图)质量

写在前面 当我们在Unity中,使用图片进行2D显示时,会发现显示出来的画面有明显的模糊或者锯齿,但是美术给的原图却十分清晰。 要改善这一状况实际上很简单。 造成这样的原因,是Unity在导入图片(或者纹理)时会自动进行压缩,以便减少运行时游戏的内存占用率,提供性能。 注意:...
  • candycat1992
  • candycat1992
  • 2014-04-02 14:45
  • 56676

unity几种优化建议

最简单的优化建议: 1.PC平台的话保持场景中显示的顶点数少于200K~3M,移动设备的话少于10W,一切取决于你的目标GPU与CPU。 2.如果你用U3D自带的SHADER,在表现不差的情况下选择Mobile或Unlit目录下的。它们更高效。 3.尽可能共用材质。 4.将不需要移动的物...
  • honey199396
  • honey199396
  • 2016-10-14 16:28
  • 2861

unity修改材质属性和更换shader

renderer.material.shader = Shader.Find("Custom/SimpleAlpha");代码控制切换shader。
  • Thebluewing
  • Thebluewing
  • 2017-05-31 14:41
  • 2565

unity标准材质球动态改值和共用材质不同设置问题

可以用SetPropertyBlock方式来实现多个物体共享材质,有部分属性略有不同的情况 这种方式被用在unity的地形上,里面的树就是通过这种方式实现不同树共用材质, 却可以有不同的颜色倾向,风力效果等等 这种方式可以在一定程度上简化材质数量,提高效率 注意SetPropertyBlock...
  • shenmifangke
  • shenmifangke
  • 2016-05-28 15:22
  • 7875

Unity3D 5 官方教程:标准着色器之材质参数(一)

标准着色器的材质参数(一):渲染模式,反射率和透明度,镜面模式的镜面参数
  • u010930289
  • u010930289
  • 2016-03-13 22:33
  • 8992

Unity3D 中动态更改材质球纹理

动态更改材质球纹理的步骤: 1:找到对应的材质球 2:更改材质球纹理 ---->  renderer.material.mainTexture = "目标纹理"; 代码如下: 点击按钮,就能实现对应功能
  • jeksonal
  • jeksonal
  • 2013-03-01 00:48
  • 28438

Unity-代码中动态设置Material参数

我们知道在Unity中可以在代码中动态地改变Material监视面板中的参数,如改变数值大小或替换贴图。常用的API有:SetColor , SetFloat, SetInt, SetTexture.然而今天在设置一个StandardShader的材质贴图的时候,发现设置了法线贴图但是场景中的物体并...
  • lilysara
  • lilysara
  • 2017-08-23 23:08
  • 2025

【Unity Shader】自定义材质面板的小技巧

写在前面之前遇到过一些朋友问怎么在材质面板里定义类似于bool这种变量,控制一些代码的执行。我们当然可以写一个C#文件来自定义材质面板,就像Unity为Standard Shader写材质面板一样(你可以在built-in shader包里找到这些文件),但这样有时候太麻烦了。实际上,有一种更简单的...
  • candycat1992
  • candycat1992
  • 2016-05-15 20:21
  • 16573

【Unity3D Shader编程】之十一 深入理解Unity5中的Standard Shader(三)&屏幕像素化特效的实现

概要:续接上文,本文进一步讲解与分析了上文未讲完的Unity5中Standard Shader正向基础渲染通道源码的片段着色实现部分,以及对屏幕像素化后期特效进行了实现。 同样需要声明的是。本文中对Stardard Shader源码的一些分析,全是浅墨自己通过对Unity Shader内建源码的...
  • zhmxy555
  • zhmxy555
  • 2015-11-29 13:59
  • 18899

Unity Shader-后处理:屏幕水波效果

一.简介 最近在打黑魂,被虐得死去活来,每次都是想砸电脑的节奏,然而还是忍不住想玩,唉。在被虐了千百遍之后,我发现写代码比玩游戏爽....下面步入正题,黑魂的传送技能之前会播放一个帅帅的屏幕特效-屏幕水波,从屏幕中间向四周扩散开来,很有赶脚。下面附上一张截图:
  • puppet_master
  • puppet_master
  • 2016-11-03 10:13
  • 11315
    个人资料
    • 访问:3556395次
    • 积分:36087
    • 等级:
    • 排名:第136名
    • 原创:402篇
    • 转载:88篇
    • 译文:5篇
    • 评论:3425条
    个人说明
    联系方式:
    文章存档
    最新评论