|
|
@@ -1,4 +1,4 @@
|
|
|
-import { _decorator, Component, Node, Vec3, tween, instantiate, Prefab, find, math, Label } from 'cc';
|
|
|
+import { _decorator, Component, Node, Vec3, tween, instantiate, Prefab, math, Label, director } from 'cc';
|
|
|
import { SaveDataManager } from '../LevelSystem/SaveDataManager';
|
|
|
import { TopBarController } from '../FourUI/TopBarController';
|
|
|
const { ccclass, property } = _decorator;
|
|
|
@@ -34,6 +34,18 @@ export class MoneyAni extends Component {
|
|
|
})
|
|
|
public canvasNode: Node = null;
|
|
|
|
|
|
+ @property({
|
|
|
+ type: Node,
|
|
|
+ tooltip: '金币目标节点(TopBar中的金币标签)'
|
|
|
+ })
|
|
|
+ public coinTargetNode: Node = null;
|
|
|
+
|
|
|
+ @property({
|
|
|
+ type: Node,
|
|
|
+ tooltip: '钻石目标节点(TopBar中的钻石标签)'
|
|
|
+ })
|
|
|
+ public diamondTargetNode: Node = null;
|
|
|
+
|
|
|
private saveDataManager: SaveDataManager = null;
|
|
|
|
|
|
onLoad() {
|
|
|
@@ -50,11 +62,7 @@ export class MoneyAni extends Component {
|
|
|
console.log(`[MoneyAni] 开始播放奖励动画 - 金币: ${coinAmount}, 钻石: ${diamondAmount}`);
|
|
|
|
|
|
if (!this.canvasNode) {
|
|
|
- this.canvasNode = find('Canvas');
|
|
|
- }
|
|
|
-
|
|
|
- if (!this.canvasNode) {
|
|
|
- console.error('[MoneyAni] 找不到Canvas节点');
|
|
|
+ console.error('[MoneyAni] Canvas节点未设置,请在编辑器中拖拽Canvas节点到canvasNode属性');
|
|
|
if (onComplete) onComplete();
|
|
|
return;
|
|
|
}
|
|
|
@@ -98,16 +106,15 @@ export class MoneyAni extends Component {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- // 获取目标位置(TopBar中的金币图标)
|
|
|
- const targetNode = find('Canvas/TopBar')?.getChildByName('moneyLabel') ||
|
|
|
- find('Canvas/TopBar/moneyLabel');
|
|
|
-
|
|
|
- if (!targetNode) {
|
|
|
- console.error('[MoneyAni] 找不到金币目标节点');
|
|
|
+ // 使用装饰器引用的金币目标节点
|
|
|
+ if (!this.coinTargetNode) {
|
|
|
+ console.error('[MoneyAni] 金币目标节点未设置,请在编辑器中拖拽TopBar中的金币标签节点');
|
|
|
if (onComplete) onComplete();
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
+ const targetNode = this.coinTargetNode;
|
|
|
+
|
|
|
// 生成金币数量(最多10个,超过则按比例显示)
|
|
|
const coinCount = Math.min(amount, 10);
|
|
|
const startPos = this.getRewardStartPosition();
|
|
|
@@ -142,16 +149,15 @@ export class MoneyAni extends Component {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- // 获取目标位置(TopBar中的钻石图标)
|
|
|
- const targetNode = find('Canvas/TopBar')?.getChildByName('diamondLabel') ||
|
|
|
- find('Canvas/TopBar/diamondLabel');
|
|
|
-
|
|
|
- if (!targetNode) {
|
|
|
- console.error('[MoneyAni] 找不到钻石目标节点');
|
|
|
+ // 使用装饰器引用的钻石目标节点
|
|
|
+ if (!this.diamondTargetNode) {
|
|
|
+ console.error('[MoneyAni] 钻石目标节点未设置,请在编辑器中拖拽TopBar中的钻石标签节点');
|
|
|
if (onComplete) onComplete();
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
+ const targetNode = this.diamondTargetNode;
|
|
|
+
|
|
|
// 生成钻石数量(最多5个)
|
|
|
const diamondCount = Math.min(amount, 5);
|
|
|
const startPos = this.getRewardStartPosition();
|
|
|
@@ -288,21 +294,53 @@ export class MoneyAni extends Component {
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * 静态方法:播放奖励动画
|
|
|
- * 供外部调用的便捷接口
|
|
|
+ * 静态方法:播放奖励动画(需要传入实例)
|
|
|
+ * @param moneyAniInstance MoneyAni组件实例
|
|
|
+ * @param coinAmount 金币数量
|
|
|
+ * @param diamondAmount 钻石数量
|
|
|
+ * @param onComplete 完成回调
|
|
|
+ */
|
|
|
+ public static playRewardWithInstance(moneyAniInstance: MoneyAni, coinAmount: number, diamondAmount: number, onComplete?: () => void) {
|
|
|
+ if (!moneyAniInstance) {
|
|
|
+ console.error('[MoneyAni] MoneyAni实例为空,请传入有效的MoneyAni组件实例');
|
|
|
+ if (onComplete) onComplete();
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ moneyAniInstance.playRewardAnimation(coinAmount, diamondAmount, onComplete);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 静态方法:播放奖励动画(简化版本)
|
|
|
+ * 自动查找场景中的MoneyAni组件
|
|
|
+ * @param coinAmount 金币数量
|
|
|
+ * @param diamondAmount 钻石数量
|
|
|
+ * @param onComplete 完成回调
|
|
|
*/
|
|
|
public static playReward(coinAmount: number, diamondAmount: number, onComplete?: () => void) {
|
|
|
- // 查找MoneyAni组件
|
|
|
- const moneyAniNode = find('Canvas/MoneyAni') || find('MoneyAni');
|
|
|
- if (!moneyAniNode) {
|
|
|
- console.error('[MoneyAni] 找不到MoneyAni节点');
|
|
|
+ // 尝试从director获取场景中的MoneyAni组件
|
|
|
+ const scene = director.getScene();
|
|
|
+ if (!scene) {
|
|
|
+ console.error('[MoneyAni] 无法获取当前场景');
|
|
|
if (onComplete) onComplete();
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- const moneyAni = moneyAniNode.getComponent(MoneyAni);
|
|
|
+ // 递归查找MoneyAni组件
|
|
|
+ const findMoneyAni = (node: Node): MoneyAni | null => {
|
|
|
+ const moneyAni = node.getComponent(MoneyAni);
|
|
|
+ if (moneyAni) return moneyAni;
|
|
|
+
|
|
|
+ for (const child of node.children) {
|
|
|
+ const result = findMoneyAni(child);
|
|
|
+ if (result) return result;
|
|
|
+ }
|
|
|
+ return null;
|
|
|
+ };
|
|
|
+
|
|
|
+ const moneyAni = findMoneyAni(scene);
|
|
|
if (!moneyAni) {
|
|
|
- console.error('[MoneyAni] 找不到MoneyAni组件');
|
|
|
+ console.error('[MoneyAni] 场景中未找到MoneyAni组件,请确保场景中存在MoneyAni组件');
|
|
|
if (onComplete) onComplete();
|
|
|
return;
|
|
|
}
|