c# - 在 Unity 着色器中避免字符串属性

标签 c# unity3d graphics shader

在 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/

相关文章:

c# - 了解涉及 paint() 的小 C# 代码片段

c# - 使用 MEF 延迟加载?

来自 toolStrip 的 C# DragDrop

c# - 在不继承 Monobehaviour 的情况下实例化预制件

ios - 用于 2D 游戏的 Unity

algorithm - 二维矢量图形的最佳数据存储算法

c# - 创建自定义文本编辑控件

c# - 尝试建立与 SQL Server Express 的连接时出错

c# - 在Unity3D中播放另一个音频时停止音频

Java 图形类困惑