1

在 Unity shaderlab 着色器中,您可以在编辑器中向材质检查器公开着色器属性。这可以通过将要公开的属性放置在Properties部分中来完成,如下所示

Properties
{
    _SomeFloat("A Float", float) = 5
}

Unity 在此处的文档中定义了一个属性列表。

但是,这不包括任何形式的 float2 或 vector2,只是单个FloatVectorxyzw.

我尝试将属性类型设置为float2And Vector2

_SomeFloat("A Float", float2) = (5,5)
_SomeFloat2("A Float2", Vector2) = (5,5)

两者都返回错误Parse error: syntax error, unexpected TVAL_ID at line 7

Vector或试图通过只设置一半的成员来减少一半

_SomeFloat("A Float", Vector) = (5,5)

返回错误Parse error: syntax error, unexpected ')', expecting ','

我可以只使用 Vector 类型并且只使用它xy,但这会导致 UI 不清楚,因为检查器中现在有两个未使用的元素,并且找不到HideInInspector允许您隐藏zw值的 Property Attribute 或 Drawer(例如)检查员。

那么有没有办法使用属性类型公开 float2 ?或者,您可以在编辑器中将两个浮动属性彼此相邻放置,例如平铺/偏移抽屉是标准2D属性类型(可能类似于[EditorGUILayout.BeginHorizontal][2])?

4

2 回答 2

4

通过快速搜索,我发现MaterialPropertyDrawer可以扩展以在着色器检查器中添加自定义标签(参考:https ://docs.unity3d.com/ScriptReference/MaterialPropertyDrawer.html )。

因此,您可以Vector在着色器中使用属性,创建自定义属性,比如说,[ShowAsVector2]MaterialPropertyDrawer为它制作,它只会显示两个输入字段,并将它们的值分配给向量xy值。这将导致着色器属性写为:

[ShowAsVector2] _Position2D("Position", Vector) = (0, 0, 0, 0)

于 2020-03-28T10:01:33.980 回答
3

这是@tsvedas 答案的扩展。

using UnityEngine;
using UnityEditor;


/// <summary>
/// Draws a vector2 field for vector properties.
/// Usage: [ShowAsVector2] _Vector2("Vector 2", Vector) = (0,0,0,0)
/// </summary>
public class ShowAsVector2Drawer : MaterialPropertyDrawer
{
    public override void OnGUI(Rect position, MaterialProperty prop, GUIContent label, MaterialEditor editor)
    {
        if( prop.type == MaterialProperty.PropType.Vector )
        {
            EditorGUIUtility.labelWidth = 0f;
            EditorGUIUtility.fieldWidth = 0f;

            if (!EditorGUIUtility.wideMode)
            {
                EditorGUIUtility.wideMode = true;
                EditorGUIUtility.labelWidth = EditorGUIUtility.currentViewWidth - 212;
            }

            EditorGUI.BeginChangeCheck();
            EditorGUI.showMixedValue = prop.hasMixedValue;
            Vector4 vec = EditorGUI.Vector2Field(position, label, prop.vectorValue);
            if (EditorGUI.EndChangeCheck()) {
                prop.vectorValue = vec;
            }
        }
        else
            editor.DefaultShaderProperty( prop, label.text );

    }
}

只需将此脚本放在Editor文件夹中,您应该只能看到 x 和 y 坐标。

于 2021-08-20T19:04:54.343 回答