123 lines
3.8 KiB
TypeScript
123 lines
3.8 KiB
TypeScript
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;
|
||
}
|
||
} |