版本:Unity 6 (6000.0)
语言:English
流式素材
素材包

通过脚本修改源素材

自动实例化

通常,当您想要修改任何类型的游戏素材时,您希望它在运行时发生并且是临时的。例如,如果您的角色拾取了一个无敌增强道具,您可能希望更改玩家角色的着色器在 GPU 上运行的程序。 更多信息
参见 术语表
材质定义表面如何渲染的素材。 更多信息
参见 术语表
以视觉方式展示无敌状态。此操作涉及修改正在使用的材质。此修改不是永久性的,因为我们不希望材质在退出播放模式时具有不同的着色器。

但是,在 Unity 中可以编写脚本允许您创建自己的组件、触发游戏事件、随时间推移修改组件属性并以任何您喜欢的方式响应用户输入的代码段。 更多信息
参见 术语表
,永久修改源素材。让我们以上述材质示例作为起点。

要临时更改材质的着色器,我们更改材质组件的着色器属性。

private var invincibleShader = Shader.Find ("Specular");

function StartInvincibility {
    renderer.material.shader = invincibleShader;
}

使用此脚本并退出播放模式后,材质的状态将重置为最初进入播放模式之前的状态。发生这种情况是因为每当访问 renderer.material 时,材质都会自动实例化并返回实例。此实例会同时并自动应用于渲染器。因此,您可以随意进行任何更改,而无需担心永久性。

直接修改

重要提示

下面介绍的方法将修改 Unity 中使用的实际源素材文件。这些修改是不可撤销的。请谨慎使用。

现在假设我们不希望材质在退出播放模式时重置。为此,您可以使用renderer.sharedMaterial。sharedMaterial 属性将返回此渲染器(以及可能的其他渲染器)使用的实际素材。

以下代码将永久更改材质以使用镜面反射着色器。它不会将材质重置为播放模式之前所处的状态。

private var invincibleShader = Shader.Find ("Specular");

function StartInvincibility {
    renderer.sharedMaterial.shader = invincibleShader;
}

如您所见,对 sharedMaterial 进行任何更改都可能既有用又冒险。对 sharedMaterial 进行的任何更改都将是永久性的,并且不可撤销。

适用的类成员

上述公式不仅适用于材质,还可以应用于其他方面。遵循此约定的所有素材列表如下

  • 材质:renderer.material 和 renderer.sharedMaterial
  • 网格:meshFilter.网格Unity 的主要图形基元。网格构成了 3D 世界的很大一部分。Unity 支持三角形或四边形多边形网格。NURBS、NURMS、细分曲面必须转换为多边形。 更多信息
    参见 术语表
    和 meshFilter.sharedMesh
  • 物理材质用于调整碰撞物体的摩擦力和弹跳效果的物理素材。 更多信息
    参见 术语表
    碰撞器用于处理对象物理碰撞的不可见形状。碰撞器不需要与对象的网格完全相同形状 - 粗略的近似值通常更有效,并且在游戏中无法区分。 更多信息
    参见 术语表
    .material 和 collider.sharedMaterial

直接赋值

如果声明了上述任何类的公共变量:材质、网格或物理材质,并使用该变量而不是使用相关的类成员对素材进行修改,则在应用修改之前,您将无法获得自动实例化的优势。

不会自动实例化的素材

有两种不同的素材在修改时永远不会自动实例化。

通过脚本对这些素材进行的任何修改都是永久性的,并且永远无法撤销。因此,如果您正在通过脚本更改地形场景中的景观。地形游戏对象会在您的场景中添加一个大的平面,您可以使用地形的检查器窗口创建详细的景观。 更多信息
参见 术语表
高度图存储对象高度数据的灰度纹理。每个像素都存储垂直于该像素所代表的面部的相对高度。
参见 术语表
,则需要自行考虑实例化和赋值。纹理也是如此。如果更改纹理文件的像素计算机图像中的最小单位。像素大小取决于屏幕分辨率。像素光照在每个屏幕像素处计算。 更多信息
参见 术语表
,则更改是永久性的。

iOS 和 Android 说明

在 iOS 和 Android 项目中修改Texture2D素材时,它们永远不会自动实例化。通过脚本对这些素材进行的任何修改都是永久性的,并且永远无法撤销。因此,如果更改纹理文件的像素,则更改是永久性的。

流式素材
素材包