using System.Collections.Generic;
using System;
using UnityEngine;
using Spine.Unity;
using Cysharp.Threading.Tasks;
public class BattleObjectFactory
{
// 本意是要在这里做池的内容的 但是想了一下 利用效率有点差 最多做一下红色方的缓存 蓝色方的即时用 即时删除 或者缓存上一次战斗的就行
// private static int AutoIncrementID = 100000;
private static float m_modelScaleRate = 0f;
public static float modelScaleRate
{
get
{
if (m_modelScaleRate <= 0f)
{
m_modelScaleRate = float.Parse(FuncConfigConfig.Get("BattleModelScale").Numerical1);
}
return m_modelScaleRate;
}
}
///
/// US2: Async version of CreateBattleObject.
///
public static async UniTask CreateBattleObjectAsync(BattleField _battleField, List posNodeList, TeamHero teamHero, BattleCamp _Camp)
{
var skinCfg = HeroSkinConfig.Get(teamHero.SkinID);
if (skinCfg == null)
{
Debug.LogError($"BattleObjectFactory: skinCfg is null for SkinID {teamHero.SkinID}");
return null;
}
SkeletonDataAsset skeletonDataAsset = await ResManager.Instance.LoadAssetAsync(
"Hero/SpineRes/",
skinCfg.SpineRes
);
if (skeletonDataAsset == null)
{
Debug.LogError($"BattleObjectFactory: Failed to load SkeletonDataAsset for {skinCfg.SpineRes}");
return null;
}
GameObject battleGO = await ResManager.Instance.LoadAssetAsync("Hero/SpineRes", "Hero_001");
GameObject goParent = posNodeList[teamHero.positionNum];
BattleObject battleObject = Produce(teamHero.positionNum, _battleField);
battleObject.ObjID = teamHero.ObjID;
GameObject realGO = GameObject.Instantiate(battleGO, goParent.transform);
SkeletonAnimation skeletonAnimation = realGO.GetComponentInChildren(true);
float finalScaleRate = modelScaleRate * teamHero.modelScale;
skeletonAnimation.initialSkinName = skinCfg.InitialSkinName;
skeletonAnimation.skeletonDataAsset = skeletonDataAsset;
skeletonAnimation.Initialize(true);
if (!string.IsNullOrEmpty(skinCfg.InitialSkinName))
{
var skeleton = skeletonAnimation.Skeleton;
skeleton.SetSkin(skinCfg.InitialSkinName);
skeleton.SetSlotsToSetupPose();
skeletonAnimation.Update(0);
}
realGO.name = battleObject.ObjID.ToString();
realGO.transform.localScale = new Vector3(finalScaleRate, finalScaleRate, finalScaleRate);
RectTransform rectTrans = realGO.GetComponent();
rectTrans.anchoredPosition = Vector2.zero;
if (battleObject is HeroBattleObject heroBattleObject)
{
heroBattleObject.Init(realGO, teamHero, _Camp);
}
return battleObject;
}
public static BattleObject Produce(int positionNum, BattleField battleField)
{
if (positionNum >= 0)
{
return new HeroBattleObject(battleField);
}
else if (positionNum == 99)
{
// 命格
return new MinggeBattleObject(battleField);
}
// else if (positionNum >= 101)
// {
// // 灵兽
// return new SpiritBeastBattleObject(battleField);
// }
else
{
return new HeroBattleObject(battleField);
}
}
public static void DestroyBattleObject(int key, BattleObject battleObj)
{
battleObj.Destroy();
battleObj = null;
}
public static BattleObject CreateMinggeBattleObject(BattleField battleField, TeamBase teamBase, BattleCamp camp)
{
MinggeBattleObject minggeBattleObject = new MinggeBattleObject(battleField);
minggeBattleObject.Init(teamBase, teamBase.teamMingge, camp);
minggeBattleObject.ObjID = teamBase.teamMingge.ObjID;
return minggeBattleObject;
}
}