新增CameraController,现在项目可以正常运作了。

This commit is contained in:
janing
2025-12-18 13:27:22 +08:00
parent 90175a1665
commit e677b1e11b
11 changed files with 223 additions and 53 deletions

View File

@@ -0,0 +1,138 @@
import { Camera, Component, Node, Vec3, _decorator } from 'cc';
const { ccclass, property } = _decorator;
/**
* CameraController 摄像机控制器
* 负责让摄像机跟随指定的目标物体
*/
@ccclass('CameraController')
export class CameraController extends Component {
/** 跟随目标 */
private target: Node = null;
/** 摄像机节点 */
private cameraNode: Node = null;
/** 摄像机组件 */
private camera: Camera = null;
/** 相对偏移量 */
private offset: Vec3 = new Vec3(0, 10, 8);
/** 跟随速度 */
@property({ displayName: '跟随速度' })
public followSpeed: number = 5;
/** 是否平滑跟随 */
@property({ displayName: '平滑跟随' })
public smoothFollow: boolean = true;
onLoad() {
this.findMainCamera();
}
/**
* 查找主摄像机
*/
private findMainCamera(): void {
// 查找名为 "Main Camera" 的摄像机
const mainCameraNode = this.node.scene.getChildByName('Main Camera');
if (mainCameraNode) {
this.cameraNode = mainCameraNode;
this.camera = mainCameraNode.getComponent(Camera);
console.log('[CameraController] 找到主摄像机:', mainCameraNode.name);
} else {
console.error('[CameraController] 未找到主摄像机(Main Camera)');
}
}
/**
* 设置跟随目标
* @param target 跟随的目标节点
*/
public setTarget(target: Node): void {
this.target = target;
if (this.target && this.cameraNode) {
// 立即设置初始位置
this.updateCameraPosition(false);
console.log('[CameraController] 设置跟随目标:', target.name);
}
}
/**
* 设置摄像机偏移量
* @param offset 相对于目标的偏移量
*/
public setOffset(offset: Vec3): void {
this.offset.set(offset);
}
/**
* 获取当前跟随目标
*/
public getTarget(): Node {
return this.target;
}
/**
* 获取摄像机节点
*/
public getCameraNode(): Node {
return this.cameraNode;
}
update(deltaTime: number) {
if (this.target && this.cameraNode) {
this.updateCameraPosition(this.smoothFollow, deltaTime);
}
}
/**
* 更新摄像机位置
* @param smooth 是否使用平滑跟随
* @param deltaTime 帧时间(smooth为true时需要)
*/
private updateCameraPosition(smooth: boolean = true, deltaTime: number = 0): void {
if (!this.target || !this.cameraNode) {
return;
}
// 计算目标位置
const targetPosition = new Vec3();
Vec3.add(targetPosition, this.target.worldPosition, this.offset);
if (smooth && deltaTime > 0) {
// 平滑跟随
const currentPosition = this.cameraNode.worldPosition;
const newPosition = new Vec3();
Vec3.lerp(newPosition, currentPosition, targetPosition, this.followSpeed * deltaTime);
this.cameraNode.setWorldPosition(newPosition);
} else {
// 立即跟随
this.cameraNode.setWorldPosition(targetPosition);
}
// 让摄像机看向目标
this.cameraNode.lookAt(this.target.worldPosition);
}
/**
* 停止跟随
*/
public stopFollow(): void {
this.target = null;
console.log('[CameraController] 停止跟随');
}
/**
* 销毁控制器
*/
onDestroy(): void {
this.target = null;
this.cameraNode = null;
this.camera = null;
console.log('[CameraController] 摄像机控制器已销毁');
}
}