首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Unity:如何为自定义资产类型创建材料属性抽屉?

Unity:如何为自定义资产类型创建材料属性抽屉?
EN

Stack Overflow用户
提问于 2020-09-14 22:55:38
回答 1查看 361关注 0票数 0

我有一个自定义资产,类型为

代码语言:javascript
复制
[System.Serializable]
public class Ranges: ScriptableObject
{
  public Vector4[] minPoints;
  public Vector4[] ranges;
}

相应的着色器定义了两个统一

代码语言:javascript
复制
half4 _coeffMins[25];
half4 _coeffRanges[25];

我可以使用Material.SetVectorArray设置制服,但是,我希望能够使用着色器将自定义资源直接拖动到材质的属性检查器中的某个窗口中。

MaterialPropertyDrawer,但是它看起来像是MaterialProperty,传递的OnGUI函数不支持数组。

有支持数组的MaterialPropertyBlock,但我不知道如何使用它来创建自定义属性抽屉。

那么,我如何创建一个material属性和相应的属性抽屉,将我的自定义可脚本化对象作为类型?

EN

回答 1

Stack Overflow用户

发布于 2020-09-15 01:09:03

我的方法是为material属性抽屉创建自定义编辑器,然后添加一个新的对象字段,它将接受您的对象,,并将数据挂接到该材质的更改上,以基于此数据更改Material.SetVectorArray。

代码语言:javascript
复制
    [CustomEditor(typeof(Material))]
    public class MyMaterialEditor : UnityEditor.Editor
    {
        Ranges source = new Ranges();

        public override void OnInspectorGUI()
        {
            var material = ((Material) serializedObject.targetObject);
            if (material.name == "DryWallPainted_Mat") // or other way to identify your material in editor
            {
                source = (Ranges) EditorGUILayout.ObjectField((Object) source, typeof(Ranges), true);
                if (source != null && source.ranges != null && source.minPoints != null)
                {
                    material.SetVectorArray("minPoints", source.minPoints);
                    material.SetVectorArray("ranges", source.ranges);
                    EditorUtility.SetDirty(material); //important
                }
            }
            DrawDefaultInspector();
        }
    }

结果:

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63886810

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档