【3.8.8】使用代码来给Mesh生成无光照材质和有光照材质

主要是为了防止我以后忘记了怎么写和帮助有需要的人,所以发个帖子记录一下。

---------------------------------手动分割线------------------------------------

预备

首先创建一个名为“ProceduralShape”的空节点和名为“ProceduralShape”的TS脚本,并把这个TS脚本挂到这个空节点上

image
image
image

---------------------------------手动分割线------------------------------------

创建无光照材质的代码

import { _decorator, builtinResMgr, Color, Component, Material, MeshRenderer, Node, primitives, utils } from ‘cc’;

const { ccclass, property, requireComponent } = _decorator;

@ccclass(‘ProceduralShape’)

@requireComponent(MeshRenderer)

export class ProceduralShape extends Component {

start() {

    const data = primitives.torus(2, 0.5)

    const mesh = utils.createMesh(data)

    const meshRenderer = this.getComponent(MeshRenderer)

    meshRenderer.mesh = mesh

    // 2. 创建无光照材质实例

    // 方法:使用内置的 'builtin-unlit' 效果名称来创建材质

    const unlitMaterial = new Material();

    unlitMaterial.initialize({ effectName: 'builtin-unlit' });

    // 3. 为材质设置一个明显的颜色(例如红色)

    // 'mainColor' 是 builtin-unlit 效果暴露的主要颜色属性

    unlitMaterial.setProperty('mainColor', new Color(255, 0, 0, 255)); // 设置为不透明的红色

    // // 4. 将材质赋给 MeshRenderer

    meshRenderer.material = unlitMaterial; // 或者使用 meshRenderer.setMaterial(0, unlitMaterial);

}

update(deltaTime: number) {

}

}

---------------------------------手动分割线------------------------------------

创建有光照材质的代码

此时得在场景里加一个3D对象“Cube立方体”才能正常运行下面这段代码,我暂时还没想到其他解决办法。

import { _decorator, builtinResMgr, Color, Component, Material, MeshRenderer, Node, primitives, utils } from ‘cc’;

const { ccclass, property, requireComponent } = _decorator;

@ccclass(‘ProceduralShape’)

@requireComponent(MeshRenderer)

export class ProceduralShape extends Component {

start() {

    const data = primitives.torus(2, 0.5)

    const mesh = utils.createMesh(data)

    const meshRenderer = this.getComponent(MeshRenderer)

    meshRenderer.mesh = mesh

    // 2. 从引擎内置资源中获取 Standard PBR 材质的基础模板

    // 'builtin-standard': 受光照影响 (PBR)

    // 'builtin-unlit': 不受光照影响 (无光)

    const standardAsset = new Material();

    standardAsset.initialize({ effectName: 'builtin-standard' });

    if (!standardAsset) {

        console.error("内置材质加载失败!");

        return;

    }

    // 3. 将材质赋值给 MeshRenderer

    // 注意:此时如果我们用 meshRenderer.sharedMaterial = standardAsset

    // 那么修改它会影响所有使用该材质的物体。

    // 所以我们通常先赋值,然后通过 .material 获取实例。

    meshRenderer.setMaterial(standardAsset, 0); // 0 代表第0个材质槽(Slot)

    // 4. 获取材质实例 (关键步骤!)

    // 当你读取 .material 属性时,Cocos 会自动检测:

    // 如果当前是共享材质,它会立刻克隆一份新的给你,并替换掉引用。

    const materialInstance = meshRenderer.material;

    // 5. 设置 PBR 参数 (因为是实例,所以只影响当前物体)

    // 设置颜色 (Albedo) - 比如设为亮蓝色

    materialInstance.setProperty('mainColor', new Color(50, 100, 255, 255));

    // 设置粗糙度 (Roughness) - 0.0(像镜子) ~ 1.0(像砖头)

    // 越小越光滑,高光越明显

    materialInstance.setProperty('roughness', 0.3);

    // 设置金属度 (Metallic) - 0.0(塑料/木头) ~ 1.0(金属)

    materialInstance.setProperty('metallic', 0.1);

    // 6. 重新赋值回去 (通常读取 .material 时引擎已经内部替换了,但这步是安全习惯)

    meshRenderer.material = materialInstance;

}

update(deltaTime: number) {

}

}

5赞

up再传一个demo上来怎么样

mark !