VehicleViewComp.ts 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. import { Color, MeshRenderer, RenderableComponent, SkeletalAnimation, _decorator } from "cc";
  2. import { ecs } from "../../../../../extensions/oops-plugin-framework/assets/libs/ecs/ECS";
  3. import { CCComp } from "../../../../../extensions/oops-plugin-framework/assets/module/common/CCComp";
  4. import { VehicleViewController } from "./VehicleViewController";
  5. import { Vehicle } from "../Vehicle";
  6. import { VehicleViewAnimator } from "./VehicleViewAnimator";
  7. import { smc } from "../../common/SingletonModuleComp";
  8. import { Puppet } from "../../puppet/puppet";
  9. import { PuppetModelComp } from "../../puppet/model/PuppetModelComp";
  10. import { PuppetAnimatorType } from "../../puppet/model/PuppetEnum";
  11. import { adjustColor } from "../../common/utils/color";
  12. const { ccclass, property } = _decorator;
  13. /** 车辆显示组件 */
  14. @ccclass('VehicleViewComp') // 定义为 Cocos Creator 组件
  15. @ecs.register('VehicleView', false) // 定义为 ECS 组件
  16. export class VehicleViewComp extends CCComp {
  17. @property({ type: SkeletalAnimation, tooltip: '角色动画' })
  18. ske: SkeletalAnimation = null!;
  19. // /** 车辆动画资源管理 */
  20. // loader: VehicleViewLoader = null!;
  21. /** 车辆动画规则管理 */
  22. animator: VehicleViewAnimator = null!;
  23. /** 车辆控制器 */
  24. controller: VehicleViewController = null!;
  25. /** 视图层逻辑代码分离演示 */
  26. onLoad() {
  27. const vehicle = this.ent as Vehicle;
  28. // this.loader = this.node.addComponent(VehicleViewLoader);
  29. // this.node.emit("load", vehicle);
  30. this.animator = this.ske.getComponent(VehicleViewAnimator)!;
  31. this.animator.vehicle = vehicle;
  32. this.controller = this.node.addComponent(VehicleViewController);
  33. this.controller.vehicle = vehicle;
  34. }
  35. // switchOutLine(on: boolean) {
  36. // // 获取MeshRenderer组件
  37. // let rendererComponet = this.node.getComponentInChildren(MeshRenderer) as RenderableComponent
  38. // if (rendererComponet) {
  39. // // 获取材质实例
  40. // let materialIns = rendererComponet.material
  41. // console.log(materialIns)
  42. // if (materialIns) {
  43. // materialIns.passes[0].defines['USE_OUTLINE_PASS'] = on
  44. // rendererComponet.material = materialIns
  45. // }
  46. // }
  47. // }
  48. changeColor(color: string) {
  49. // 获取MeshRenderer组件
  50. let rendererComponets = this.node.getComponentsInChildren(MeshRenderer) as RenderableComponent[]
  51. rendererComponets.forEach((rendererComponet) => {
  52. // 获取材质实例
  53. // let materialIns = rendererComponet.material
  54. // if (materialIns) {
  55. // // 修改材质实例的颜色
  56. // materialIns.setProperty('mainColor', new Color(color));
  57. // rendererComponet.material = materialIns
  58. // }
  59. let materials = rendererComponet.materials; // 获取所有材质(如果是多材质情况)
  60. for (let i = 0; i < materials.length; i++) {
  61. let material = materials[i];
  62. if (materials.length > 6) {
  63. if (material && [0,1,3, 7].includes(i)) {
  64. // 修改特定材质实例的颜色
  65. material.setProperty('mainColor', new Color(color));
  66. materials[i] = material; // 更新材质
  67. }
  68. } else {
  69. // 修改特定材质实例的颜色
  70. material.setProperty('mainColor', new Color(color));
  71. materials[i] = material; // 更新材质
  72. break
  73. }
  74. }
  75. rendererComponet.materials = materials; // 重新赋值更新后的材质数组
  76. })
  77. }
  78. createPuppet() {
  79. const v = this.ent as Vehicle;
  80. const account = smc.initialize.account
  81. const puppet = ecs.getEntity<Puppet>(Puppet)
  82. const puppetModel = puppet.get(PuppetModelComp)
  83. puppetModel.color = v.VehicleModel.color
  84. puppetModel.withColider = false
  85. puppet.load(this.node, v.VehicleModel.color, v.VehicleModel.sitPos[v.children.size], account.AccountModel.skin);
  86. v.addChild(puppet)
  87. puppet.PuppetView.animator.toRight()
  88. puppet.PuppetView.animator.playAni(PuppetAnimatorType.Sit)
  89. puppet.PuppetView.animator.onScaleComplete = () => {
  90. // console.log("结果",!checkpoint.CheckpointModel.puppets.some(val => val.PuppetModel?.color === this.vehicle.VehicleModel.color))
  91. // console.log(checkpoint.CheckpointModel.puppets) // ||!account.checkpoint.CheckpointModel.puppets.some(val => val.PuppetModel?.color === v.VehicleModel.color)
  92. if (v.children.size >= v.VehicleModel.capcity)
  93. v.VehicleModel.ready = true
  94. }
  95. puppet.PuppetView.animator.scale()
  96. }
  97. reset() {
  98. this.node.destroy();
  99. }
  100. }