Skip to content

创建材质

SandMod 支持在游戏项目运行时动态创建 材质(Material)实例。

前提条件

通过脚本创建 材质(Material)需要基于 着色器(Shader)进行创建:

  • 您可以使用系统内置着色器,常用的内置着色器及其着色器命名请参阅 内置着色器 章节。

  • 您也可以使用自定义着色器,自定义着色器的创建方法请参阅 着色器资产 章节。

创建流程

  • 通过着色器命名找到被新创建的材质所引用的着色器,其中自定义着色器的着色器命名可以通过 name 命令定义。

  • 基于材质所引用的着色器创建材质。

基于 SandMod 默认着色器(Engine/Default)创建材质的代码示例如下:

TypeScript
class NewMaterial extends Component {
  
    /*
    编辑运行时事件;
    */
    OnStart(): void {
        //通过着色器命名找到内置默认着色器,并保存在命名为 sh 的变量中;
        let sh:Shader = Shader.Find("Engine/Default");
        //通过着色器创建材质,并保存在命名为 mat 的变量中;
        let mat:Material = new Material(sh);
    }

}

引用及读取材质

引用途径

当前版本的 SandMod 对于继承自 渲染器(Renderer)的组件,都可以动态引用 材质(Material),无论是材质资产还是运行时临时创建的动态材质。其中包含以下组件:

类别组件名称
网格渲染相关网格渲染器(Mesh Renderer)
蒙皮网格渲染器(Skinned Mesh Renderer)
特效渲染相关线条特效渲染器(Line Renderer)
拖尾特效渲染器(Trail Renderer)
Sprite(精灵)渲染相关精灵渲染(Sprite Renderer)
精灵序列渲染器(Sprite Sequence Renderer)

工作流

  • SandMod 中材质无法以 组件(Component)的方式单独挂载于 游戏对象(Game Object)上,也无法直接以组件的类名读取材质,因此需要先获取继承自 渲染器(Renderer)引用该材质的 组件(Component)。

  • 您可以通过代码 Renderer.sharedMaterial 读取或引用材质。

  • 部分渲染器组件允许您同时引用多个材质,如 网格渲染器(MeshRenderer)、线条特效渲染器(LineRenderer)等, Renderer.sharedMaterial API 将仅读取或引用第一个材质,如果您想通过编码配置所有材质,您需要使用 Renderer.sharedMaterials[] 数组逐个读取或引用。 具体方法请参阅 API 文档关于 Rederer 类的相关内容。

Editing_Material_In_Scripts001

图中网格渲染器可以同时引用多个材质。

设置材质属性

您可以在游戏项目运行时通过代码编辑 材质(Material)的 材质属性(Property),这些可被编辑的材质属性都是在其所引用的 着色器(Shader)中通过 property 命令所定义。

您需要根据被修改或读取的材质属性类型选择 Material 类中设置或读取的方法,具体方法请参阅 API 文档关于 Material 类的相关内容。

如示例中需要修改方块材质 叠加颜色(_Color) 的材质属性,使颜色改变为红色,代码如下:

TypeScript
class ToRed extends Component {
    /*
    编辑运行时事件;
    */
    OnStart(): void {
        //获取用于渲染静态网格的网格渲染器组件,并保存在命名为 mr 的变量中;
        let mr:MeshRenderer = this.gameObject.GetComponent(MeshRenderer);
        //获取网格渲染器引用的材质,并保存在命名为 mtl 的变量中;
        let mtl:Material = mr.material;
        //由于叠加颜色的材质属性是 Color 类型,所以使用 SetColor 方法设置叠加颜色;
        //通过材质属性的变量名 “_Color” 将材质的叠加颜色设置为红色;
        mtl.SetColor("_Color", Color.red);
    }
}

值得注意的是,通过 API 设置或读取材质属性时,需要基于着色器中定义材质属性的参数名,内置着色器的材质属性部分参数名和 检视窗口(Inspector)中显示会有些许差异,具体请参阅 内置着色器 及其子章节。