import { _decorator, Component, Node, Vec3 } from 'cc'; import { RoadPoint } from './RoadPoint'; const { ccclass, property } = _decorator; @ccclass('Car') export class Car extends Component { public _currentRoadPoint: RoadPoint | null = null; private _pointA = new Vec3();//第1条线, 的起点。 private _pointB = new Vec3();//第1条线, 的下个点。 private _currentSpeed = 1.2; private _isMove = false; private _offset = new Vec3(); private _tempVec = new Vec3();//用于计算小车离开下个点的距离 public update(dt: number) { if (this._isMove) { console.log("car--update-move"); //这是快捷世界坐标。不能让我们改。所以先存起来。 this._offset.set(this.node.worldPosition); switch (this._currentRoadPoint?.move_type) { case RoadPoint.RoadMoveType.BEND: break; default: //A就是我起点(当前的点 小车自身的点)。B就是下一个点。 //从点a 到 点b z的坐标是减少 b.z=50 a.z=0 大于0 const z = this._pointA.z - this._pointB.z; console.log("点a到点b的z差距:"+z); if (z !== 0) { //代表我们动z轴就能跑到 目的,然后判断 加 还是 减 if (z > 0) { console.log("减法:"); //offset就是小车当前位置。随着动而动 this._offset.z -= this._currentSpeed; if(this._offset.z < this._pointB.z){ this._offset.z = this._pointB.z; } } else { this._offset.z += this._currentSpeed; if(this._offset.z>this._pointB.z){ this._offset.z = this._pointB.z; } } }else{ const x = this._pointA.x - this._pointB.x; if (x > 0) { this._offset.x += this._currentSpeed; if(this._offset.x>this._pointB.x){ this._offset.x = this._pointB.x; } } else { this._offset.x -= this._currentSpeed; if(this._offset.x < this._pointB.x){ this._offset.x = this._pointB.x; } } } break; } //重新设置小车的坐标 this.node.setWorldPosition(this._offset); //计算 pointB和offset之间的长度。 Vec3.subtract(this._tempVec,this._pointB,this._offset); if(this._tempVec.length()<=0.01){ this._arrivalStation(); } } } /** * * @param entry 是第1条路径 的起始点。上面有脚本RoadPoint */ public setEntry(entry: Node) { //世界坐标,绝对位置,他在别的模型的位置,可能有偏移量,不准。所以使用世界坐标系 this.node.setWorldPosition(entry.worldPosition); //这是传来的 1条直接的2个点。创建路径的点。上面有RoadPoint脚本 this._currentRoadPoint = entry.getComponent(RoadPoint) as RoadPoint; if (!this._currentRoadPoint) { console.log("这个点没有roadPoint" + entry.name); } //A就是我起点(当前的点 小车自身的点)。B就是下一个点。 this._pointA.set(entry.worldPosition); this._pointB.set(this._currentRoadPoint.nextStation.worldPosition); //计算车身,是否需要,转动方向 //下一点的z 减去 小车的z 如果是0 如果不是0 // 原理我是知道,但是为什么会有这种效果。我不知道。 const z = this._pointB.z - this._pointA.z;// 50 - 80 console.log("z:"+z); if (z !== 0) { if (z < 0) { console.log("z是负数,没有偏移不用转向") //没有偏移不用转向 这个函数,经过测试 会自动修正方向 this.node.eulerAngles = new Vec3(); } else { console.log("z是正数") //旋转用的是y转。 this.node.eulerAngles = new Vec3(0, 180, 0); } } else { const x = this._pointB.x - this._pointA.x; console.log("x:"+x); if (x > 0) { console.log("x是正数") this.node.eulerAngles = new Vec3(0, 270, 0); } else { console.log("x是负数") this.node.eulerAngles = new Vec3(0, 90, 0); } } } public startRunning() { if (this._currentRoadPoint) { this._isMove = true; } } public stopRunning() { this._isMove = false; } private _arrivalStation(){ console.log("arrival...."); this._pointA.set(this._pointB); //这个就是B上面的 RoadPoint this._currentRoadPoint= this._currentRoadPoint?.nextStation?.getComponent(RoadPoint) as RoadPoint; if(this._currentRoadPoint.nextStation){ this._pointB.set(this._currentRoadPoint.nextStation.worldPosition); }else{ this._isMove= false; this._currentRoadPoint = null; } } }
站长微信:xiaomao0055
站长QQ:14496453