在 Unity 中创建着色器时,您可以向其添加一个可以从不同脚本内部调用的属性。为此,可以使用以下行调用并设置 Vector3 属性名称 _vector3
:
materialName.SetVector("_vector3", new Vector3(1, 1, 1));
这很好,但是真的没有办法避免使用“魔法”字符串吗?看起来这是一种非常困惑且容易出错的方法。我知道也许您可以在顶部定义它,这样它就不是一个“神奇”的字符串,但它仍然是一个字符串变量,在进行任何更改时需要从着色器传递到脚本。
这里有一个非常基本的问题:在 Unity 中调用变量时有没有办法避免使用“魔术”字符串?
最佳答案
不,没有办法摆脱字符串标识符。 当然,您可以在一个地方添加一些包含着色器属性标识符的帮助程序类,以提高可维护性。
public static class ShaderProps
{
public static class MyShaderA
{
public const string SomeProperty = "_vector3";
}
}
// Usage
public class MyBehaviour : MonoBehaviour
{
private void Update
{
material.SetVector(ShaderProps.MyShaderA.SomeProperty, ...);
}
}
您应该使用 Shader.PropertyToID(string name)
并缓存结果,因为它更有效。每次您使用字符串标识符时,Unity 都会在后台调用它,从而使重复调用字符串(例如在 Update
中)变得不利。
关于c# - 在 Unity 着色器中避免字符串属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64745639/