You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于C#的Unity运行时创建材质方法咨询(含自定义类YAML语言场景)

在Unity运行时用C#创建新材质的方法

当然可以在Unity运行时用C#创建新材质,完全没问题!而且你完全可以按照之前自定义语言的逻辑来编写代码,把配置参数映射成实际的材质实例。下面我一步步给你讲清楚怎么做:

核心实现步骤

Unity的Material类支持在运行时直接实例化,只要你能获取到对应的着色器、纹理等资源,就能快速创建符合需求的材质。针对你提到的Legacy Diffuse着色器、TEX_BRICK纹理、RGB(55,55,55,255)颜色的需求,我写了一个完整的示例方法:

using UnityEngine;

public class MaterialCreator : MonoBehaviour
{
    public Material CreateCustomBrickMaterial()
    {
        // 1. 查找Legacy Diffuse着色器
        Shader diffuseShader = Shader.Find("Legacy Shaders/Diffuse");
        if (diffuseShader == null)
        {
            Debug.LogError("找不到Legacy Diffuse着色器!请确保该着色器已添加到项目的Always Included Shaders列表中(Player Settings -> Graphics)");
            return null;
        }

        // 2. 创建新的材质实例
        Material customMaterial = new Material(diffuseShader);

        // 3. 加载并设置TEX_BRICK纹理(这里假设纹理放在Resources文件夹下,你也可以用Addressable/AssetBundle加载)
        Texture2D brickTexture = Resources.Load<Texture2D>("TEX_BRICK");
        if (brickTexture != null)
        {
            customMaterial.mainTexture = brickTexture;
        }
        else
        {
            Debug.LogWarning("未找到TEX_BRICK纹理,材质将使用默认纹理");
        }

        // 4. 设置颜色:把你给的0-255范围的RGB值转换成Unity的Color格式
        customMaterial.color = new Color32(55, 55, 55, 255);

        return customMaterial;
    }

    // 测试用的方法,比如在Start里调用
    private void Start()
    {
        Material newMaterial = CreateCustomBrickMaterial();
        if (newMaterial != null)
        {
            // 可以把材质赋值给某个Renderer的material属性
            GetComponent<Renderer>().material = newMaterial;
        }
    }
}

按自定义语言逻辑扩展

如果你想和之前的自定义语言逻辑对齐,可以把配置参数(比如着色器名称、纹理路径、颜色值)封装成类似的结构,然后写一个解析方法自动生成材质。比如模仿你之前的对象数组逻辑:

假设你有一个数据类对应自定义语言的配置:

[System.Serializable]
public class MaterialConfig
{
    public string shaderName;
    public string texturePath;
    public byte[] colorRGBA; // 对应[55,55,55,255]
}

然后就可以写一个通用的创建方法:

public Material CreateMaterialFromConfig(MaterialConfig config)
{
    Shader shader = Shader.Find(config.shaderName);
    if (shader == null) return null;

    Material mat = new Material(shader);

    Texture2D tex = Resources.Load<Texture2D>(config.texturePath);
    if (tex != null) mat.mainTexture = tex;

    if (config.colorRGBA != null && config.colorRGBA.Length == 4)
    {
        mat.color = new Color32(
            config.colorRGBA[0],
            config.colorRGBA[1],
            config.colorRGBA[2],
            config.colorRGBA[3]
        );
    }

    return mat;
}

这样你就可以把自定义语言解析出来的配置直接传入这个方法,完全复用之前的逻辑。

注意事项

  • 运行时创建的材质是内存中的临时实例,不会自动保存到你的Unity项目中。如果需要持久化,你可以把材质的配置参数(着色器名、纹理路径、颜色)保存到文件(比如JSON),下次启动时再重建材质。
  • 确保Legacy Shaders/Diffuse着色器被包含在构建中:如果你的项目默认没启用Legacy着色器,需要在Player Settings -> Graphics -> Always Included Shaders里添加它,否则运行时Shader.Find会返回null。
  • 纹理加载方式:示例中用了Resources.Load,如果你的项目用了Addressable Asset System或者AssetBundle,替换成对应的加载方式即可。

内容的提问来源于stack exchange,提问作者user8445415

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 03:44:26