rp_10012/assets/Loading/scripts/i18n/LocalizedSpine.ts
2025-09-11 16:51:53 +08:00

123 lines
3.8 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { _decorator, Component, resources } from 'cc';
import { sp } from 'cc';
import { I18nManager } from '../manager/I18nManager';
const { ccclass, property, executeInEditMode } = _decorator;
@ccclass('LocalizedSpine')
export class LocalizedSpine extends Component {
private spineComponent: sp.Skeleton | null = null;
@property({ tooltip: 'Spine资源名字' })
private spineName: string = '';
@property({ tooltip: '默认动画名称' })
private defaultAnimation: string = '';
@property({ tooltip: '是否自动播放默认动画' })
private autoPlay: boolean = true;
onLoad() {
// if (!I18nManager.instance.getIsReady()) {
// I18nManager.instance.init('en');
// }
this.fetchRender();
}
fetchRender() {
if (!this.spineComponent) {
this.spineComponent = this.getComponent(sp.Skeleton);
}
if (this.spineComponent) {
this.updateSpine();
} else {
console.warn(`LocalizedSpine: No Spine component found on node ${this.node.name}`);
this.loadDefaultSpine();
}
}
public updateSpine() {
if (!this.spineComponent || !this.spineName) return;
const currentLanguage = I18nManager.instance.currentLanguage;
const cacheKey = `${currentLanguage}_${this.spineName}`;
// 从I18nManager获取缓存的SpineData
const cachedSpineData = I18nManager.instance.spineCache.get(cacheKey);
if (cachedSpineData) {
this.setNewSpineData(cachedSpineData);
return;
}
// 如果缓存中没有从resources加载
const spinePath = `i18nSprite/${currentLanguage}/${this.spineName}_${currentLanguage}`;
resources.load(spinePath, sp.SkeletonData, (err, spineData) => {
if (err) {
console.warn(`Failed to load spine: ${spinePath}`, err);
this.loadDefaultSpine();
return;
}
if (spineData) {
// 添加到I18nManager的缓存中
I18nManager.instance.spineCache.set(cacheKey, spineData);
this.setNewSpineData(spineData);
}
});
}
private loadDefaultSpine() {
const defaultPath = `i18nSpine/en/${this.spineName}_en`;
const cacheKey = `en_${this.spineName}`;
// 从I18nManager获取默认语言的缓存
const cachedSpineData = I18nManager.instance.spineCache.get(cacheKey);
if (cachedSpineData) {
this.setNewSpineData(cachedSpineData);
return;
}
resources.load(defaultPath, sp.SkeletonData, (err, spineData) => {
if (err) {
console.error('Failed to load default spine:', err);
return;
}
if (spineData) {
I18nManager.instance.spineCache.set(cacheKey, spineData);
this.setNewSpineData(spineData);
}
});
}
private setNewSpineData(newData: sp.SkeletonData) {
if (this.spineComponent) {
this.spineComponent.skeletonData = newData;
// 如果设置了默认动画且启用了自动播放,则播放默认动画
if (this.defaultAnimation && this.autoPlay) {
this.spineComponent.setAnimation(0, this.defaultAnimation, true);
}
}
}
public setSpineName(name: string) {
this.spineName = name;
this.updateSpine();
}
public playAnimation(animName: string, loop: boolean = false) {
if (this.spineComponent) {
this.spineComponent.setAnimation(0, animName, loop);
}
}
onDestroy() {
// 清理组件引用
if (this.spineComponent) {
this.spineComponent.skeletonData = null;
}
this.spineComponent = null;
}
}