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;
|
}
|
}
|
|
/// <summary>
|
/// US2: Async version of CreateBattleObject.
|
/// </summary>
|
public static async UniTask<BattleObject> CreateBattleObjectAsync(BattleField _battleField, List<GameObject> 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<SkeletonDataAsset>(
|
"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<GameObject>("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<SkeletonAnimation>(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<RectTransform>();
|
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;
|
}
|
}
|