主要是为了防止我以后忘记了怎么写和帮助有需要的人,所以发个帖子记录一下。
---------------------------------手动分割线------------------------------------
预备
首先创建一个名为“ProceduralShape”的空节点和名为“ProceduralShape”的TS脚本,并把这个TS脚本挂到这个空节点上



---------------------------------手动分割线------------------------------------
创建无光照材质的代码
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) {
}
}


