Представьте свойство float2 / vector2 из шейдера в инспектор материалов Unity - PullRequest
0 голосов
/ 28 марта 2020

В шейдере Unity Shaderlab вы можете открыть свойства шейдера для инспектора материалов в редакторе. Это можно сделать, поместив свойства, которые вы хотите предоставить, в раздел Properties следующим образом:

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

Unity определяет список свойств в документации здесь .

Однако это не включает в себя любую форму float2 или vector2, только один Float или Vector, который состоит из xyzw.

Я попытался установить тип свойства на float2 И 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, но это делает неясным интерфейс пользователя, поскольку в инспекторе теперь есть два неиспользуемых элемента, и я не смог найти атрибут свойства или Ящик (например, HideInInspector), который позволяет скрыть значения zw от инспектора.

Так есть ли способ выставить float2, используя тип свойства? Или, может быть, альтернатива, в которой вы можете поместить два свойства с плавающей точкой рядом друг с другом в редакторе, например, блок Tiling / Offset, находится в стандартном типе свойства 2D (может быть, что-то похожее на [EditorGUILayout.BeginHorizontal][2])?

1 Ответ

1 голос
/ 28 марта 2020

В результате быстрого поиска я обнаружил, что MaterialPropertyDrawer может быть расширен для добавления пользовательских тегов в инспекторах шейдеров (ref: https://docs.unity3d.com/ScriptReference/MaterialPropertyDrawer.html).

Таким образом, вы можете использовать Свойство Vector в шейдере, создайте пользовательский атрибут, скажем, [ShowAsVector2] и создайте для него MaterialPropertyDrawer, который будет отображать только два поля ввода, и присвойте их значение значениям x и y вектора. В результате свойство шейдера будет иметь вид:

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

...