init
This commit is contained in:
61
assets/scripts/CameraFollow2D.ts
Normal file
61
assets/scripts/CameraFollow2D.ts
Normal file
@@ -0,0 +1,61 @@
|
||||
import { _decorator, Component, Node, Vec3, UITransform, math } from 'cc';
|
||||
const { ccclass, property } = _decorator;
|
||||
|
||||
@ccclass('CameraFollow2D')
|
||||
export class CameraFollow2D extends Component {
|
||||
@property(Node)
|
||||
target: Node = null!; // 要跟随的角色
|
||||
|
||||
@property(Node)
|
||||
map: Node = null!; // 地图节点(需要有 UITransform 才能获取大小)
|
||||
|
||||
@property
|
||||
offset: Vec3 = new Vec3(0, 0, 1000); // 相机与角色的偏移(Z 轴拉远)
|
||||
|
||||
@property
|
||||
smoothSpeed: number = 5; // 平滑跟随速度,越大越快
|
||||
|
||||
private _currentPos: Vec3 = new Vec3();
|
||||
private _mapSize: Vec3 = new Vec3();
|
||||
|
||||
onLoad() {
|
||||
if (this.map) {
|
||||
const ui = this.map.getComponent(UITransform);
|
||||
if (ui) {
|
||||
this._mapSize.set(ui.width, ui.height, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
update(deltaTime: number) {
|
||||
if (!this.target) return;
|
||||
|
||||
// 目标位置
|
||||
const targetPos = this.target.getWorldPosition();
|
||||
const desiredPos = new Vec3(
|
||||
targetPos.x + this.offset.x,
|
||||
targetPos.y + this.offset.y,
|
||||
this.offset.z // 相机保持固定 Z
|
||||
);
|
||||
|
||||
// 平滑跟随
|
||||
Vec3.lerp(this._currentPos, this.node.getWorldPosition(), desiredPos, deltaTime * this.smoothSpeed);
|
||||
|
||||
// 限制相机不超出地图
|
||||
if (this.map) {
|
||||
const halfW = this._mapSize.x / 2;
|
||||
const halfH = this._mapSize.y / 2;
|
||||
|
||||
// 相机视口一半宽高(取 UITransform 尺寸的一半)
|
||||
const camUI = this.getComponent(UITransform);
|
||||
let viewW = camUI ? camUI.width / 2 : 0;
|
||||
let viewH = camUI ? camUI.height / 2 : 0;
|
||||
|
||||
this._currentPos.x = math.clamp(this._currentPos.x, -halfW + viewW, halfW - viewW);
|
||||
this._currentPos.y = math.clamp(this._currentPos.y, -halfH + viewH, halfH - viewH);
|
||||
}
|
||||
|
||||
// 更新相机位置
|
||||
this.node.setWorldPosition(this._currentPos);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user