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; } }