创建材质
SandMod 支持在游戏项目运行时动态创建 材质(Material)实例。
前提条件
通过脚本创建 材质(Material)需要基于 着色器(Shader)进行创建:
创建流程
通过着色器命名找到被新创建的材质所引用的着色器,其中自定义着色器的着色器命名可以通过 name 命令定义。
基于材质所引用的着色器创建材质。
基于 SandMod 默认着色器(Engine/Default)创建材质的代码示例如下:
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.sharedMaterialAPI 将仅读取或引用第一个材质,如果您想通过编码配置所有材质,您需要使用Renderer.sharedMaterials[]数组逐个读取或引用。 具体方法请参阅 API 文档关于 Rederer 类的相关内容。

图中网格渲染器可以同时引用多个材质。
设置材质属性
您可以在游戏项目运行时通过代码编辑 材质(Material)的 材质属性(Property),这些可被编辑的材质属性都是在其所引用的 着色器(Shader)中通过 property 命令所定义。
您需要根据被修改或读取的材质属性类型选择 Material 类中设置或读取的方法,具体方法请参阅 API 文档关于 Material 类的相关内容。
如示例中需要修改方块材质 叠加颜色(_Color) 的材质属性,使颜色改变为红色,代码如下:
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)中显示会有些许差异,具体请参阅 内置着色器 及其子章节。
