yyl
2026-05-11 51b0f6ed9f4e1d3bb6f8144470b46908c7699a96
Main/System/Battle/BattleObject/BattleObjectFactory.cs
@@ -1,23 +1,107 @@
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 int AutoIncrementID = 100000;
    public static BattleObject CreateBattleObject(BattleField _battleField, List<GameObject> posNodeList, TeamHero teamHero, BattleCamp _Camp)
    private static float m_modelScaleRate = 0f;
    public static float modelScaleRate
    {
        HeroSkinConfig skinCfg = teamHero.heroInfo.skinConfig;
        GameObject battleGO = ResManager.Instance.LoadAsset<GameObject>("Hero/SpineRes", "Hero_001"/*skinCfg.SpineRes*/);
        GameObject goParent = posNodeList[teamHero.heroIndex];
        BattleObject battleObject = new BattleObject(_battleField);
        battleObject.BattleObjectId = AutoIncrementID++;
        battleGO.name = battleObject.BattleObjectId.ToString();
        battleObject.Init(GameObject.Instantiate(battleGO, goParent.transform), teamHero, _Camp);
        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)
@@ -25,4 +109,12 @@
        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;
    }
}