LineDrawer.ts 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. import {
  2. _decorator,
  3. Component,
  4. Vec3,
  5. Color,
  6. MeshRenderer,
  7. Material,
  8. Mesh,
  9. utils,
  10. gfx,
  11. director
  12. } from 'cc';
  13. const { ccclass } = _decorator;
  14. @ccclass('LineDrawer')
  15. export class LineDrawer extends Component {
  16. private _meshRenderer: MeshRenderer | null = null;
  17. onLoad() {
  18. this._meshRenderer = this.getComponent(MeshRenderer) || this.node.addComponent(MeshRenderer);
  19. // 使用 unlit 材质
  20. const mat = new Material();
  21. mat.initialize({ effectName: 'unlit' });
  22. this._meshRenderer.material = mat;
  23. }
  24. public drawLine(start: Vec3, end: Vec3, color: Color = Color.RED) {
  25. if (!this._meshRenderer) return;
  26. // 创建顶点数据
  27. const positions = [start.x, start.y, start.z, end.x, end.y, end.z];
  28. const colors = [color.r, color.g, color.b, color.a, color.r, color.g, color.b, color.a];
  29. // 创建Mesh
  30. const mesh = new Mesh();
  31. utils.createMesh({
  32. positions: positions,
  33. colors: colors,
  34. primitiveMode: gfx.PrimitiveMode.LINE_LIST
  35. }, mesh);
  36. // 设置Mesh
  37. this._meshRenderer.mesh = mesh;
  38. }
  39. public clear() {
  40. if (this._meshRenderer) {
  41. this._meshRenderer.mesh = null;
  42. }
  43. }
  44. }