import { _decorator, Component, Node, tween, Vec3 } from 'cc';
const { ccclass, property } = _decorator;
@ccclass('SheepMoveLToR')
export class SheepMoveLToR extends Component {
@property([Node])
movePointsTrans:Node[]=[];
start() {
if(this.movePointsTrans.length>0){
this.moveAlongPath();
}
}
moveAlongPath(){
let points = this.movePointsTrans.map(point=>point.getPosition());
let currentIndex=0;
//递归方式让每次tween结束后继续下一个点循环
const moveToNextPont=()=>{
let targetPos = points[currentIndex];
currentIndex = (currentIndex+1)%points.length;//循环索引
//创建新的tween动画,移动到目标点
tween(this.node).to(1,{position:targetPos},{easing:'sineInOut'})//1s到达目标点
.call(moveToNextPont)//tween结束后继续下一个点循环
.start();
};
moveToNextPont();
}
//每帧执行:自动翻转朝向
update(deltaTime: number) {
if(this.node.position.y>=0){
this.node.setScale(-1,1);
}else{
this.node.setScale(1,1);
}
}
}
把路径节点转成坐标
使用递归 + tween 实现无限循环移动
去 A → 结束 → 去 B → 结束 → 去 C → 结束 → 回到 A
(currentIndex+1) % points.length
模运算 = 自动循环,不会越界
easing:'sineInOut'
平滑缓动,移动更自然,不是机械匀速

image.png
cocos设置好节点点位,引入ts脚本代码

image.png