126 lines
3.8 KiB
TypeScript
126 lines
3.8 KiB
TypeScript
import { _decorator, Component, Node, Vec3, MeshRenderer, BoxCollider, RigidBody, Material, Color, primitives, utils } from 'cc';
|
|
|
|
const { ccclass, property } = _decorator;
|
|
|
|
/**
|
|
* 简单预制体工厂
|
|
*/
|
|
@ccclass('SimplePrefabFactory')
|
|
export class SimplePrefabFactory extends Component {
|
|
|
|
/**
|
|
* 创建单位节点
|
|
*/
|
|
static createUnit(name: string, color: Color = Color.WHITE): Node {
|
|
const unit = new Node(name);
|
|
|
|
// 添加网格渲染器
|
|
const meshRenderer = unit.addComponent(MeshRenderer);
|
|
|
|
// 创建立方体网格
|
|
const mesh = utils.createMesh(primitives.box({ width: 1, height: 1, length: 1 }));
|
|
meshRenderer.mesh = mesh;
|
|
|
|
// 创建材质
|
|
const material = new Material();
|
|
material.initialize({ effectName: 'builtin-unlit' });
|
|
material.setProperty('mainColor', color);
|
|
meshRenderer.material = material;
|
|
|
|
// 添加碰撞器
|
|
const collider = unit.addComponent(BoxCollider);
|
|
collider.size = new Vec3(1, 1, 1);
|
|
|
|
// 添加刚体
|
|
const rigidBody = unit.addComponent(RigidBody);
|
|
rigidBody.type = RigidBody.Type.KINEMATIC;
|
|
|
|
return unit;
|
|
}
|
|
|
|
/**
|
|
* 创建建筑节点
|
|
*/
|
|
static createBuilding(name: string, size: Vec3 = new Vec3(2, 2, 2), color: Color = Color.GRAY): Node {
|
|
const building = new Node(name);
|
|
|
|
// 添加网格渲染器
|
|
const meshRenderer = building.addComponent(MeshRenderer);
|
|
|
|
// 创建立方体网格
|
|
const mesh = utils.createMesh(primitives.box({
|
|
width: size.x,
|
|
height: size.y,
|
|
length: size.z
|
|
}));
|
|
meshRenderer.mesh = mesh;
|
|
|
|
// 创建材质
|
|
const material = new Material();
|
|
material.initialize({ effectName: 'builtin-unlit' });
|
|
material.setProperty('mainColor', color);
|
|
meshRenderer.material = material;
|
|
|
|
// 添加碰撞器
|
|
const collider = building.addComponent(BoxCollider);
|
|
collider.size = size;
|
|
|
|
return building;
|
|
}
|
|
|
|
/**
|
|
* 创建资源节点
|
|
*/
|
|
static createResource(name: string, color: Color = Color.YELLOW): Node {
|
|
const resource = new Node(name);
|
|
|
|
// 添加网格渲染器
|
|
const meshRenderer = resource.addComponent(MeshRenderer);
|
|
|
|
// 创建球体网格
|
|
const mesh = utils.createMesh(primitives.sphere(0.5));
|
|
meshRenderer.mesh = mesh;
|
|
|
|
// 创建材质
|
|
const material = new Material();
|
|
material.initialize({ effectName: 'builtin-unlit' });
|
|
material.setProperty('mainColor', color);
|
|
meshRenderer.material = material;
|
|
|
|
// 添加碰撞器
|
|
const collider = resource.addComponent(BoxCollider);
|
|
collider.size = new Vec3(1, 1, 1);
|
|
|
|
return resource;
|
|
}
|
|
|
|
/**
|
|
* 创建地面节点
|
|
*/
|
|
static createGround(size: Vec3 = new Vec3(50, 0.1, 50), color: Color = new Color(100, 150, 100, 255)): Node {
|
|
const ground = new Node('Ground');
|
|
|
|
// 添加网格渲染器
|
|
const meshRenderer = ground.addComponent(MeshRenderer);
|
|
|
|
// 创建平面网格
|
|
const mesh = utils.createMesh(primitives.box({
|
|
width: size.x,
|
|
height: size.y,
|
|
length: size.z
|
|
}));
|
|
meshRenderer.mesh = mesh;
|
|
|
|
// 创建材质
|
|
const material = new Material();
|
|
material.initialize({ effectName: 'builtin-unlit' });
|
|
material.setProperty('mainColor', color);
|
|
meshRenderer.material = material;
|
|
|
|
// 添加碰撞器
|
|
const collider = ground.addComponent(BoxCollider);
|
|
collider.size = size;
|
|
|
|
return ground;
|
|
}
|
|
}
|