using Animancer; using Common.Utility.CombatEvent; using Excel2Json; using Fort23.Core; using Fort23.UTool; using GameLogic.Combat.Buff; using GameLogic.Combat.Hero.State; using UnityEngine; using UnityEngine.AI; namespace GameLogic.Combat.Hero { /// /// 法宝对象 /// public class CombatMagicWeaponEntity : CombatHeroEntity { /// /// 碰撞的target /// public CombatMagicWeaponEntity CollidingTarget; protected MagicWeaponConfig _magicWeaponConfig; public float cd = 10; /// /// 是否进入战斗状态 /// public bool isCombatState; private MagicWeaponControl _magicWeaponControl; public MagicWeaponControl MagicWeaponControl { get { return _magicWeaponControl; } } public async CTask Init(MagicWeaponControl magicWeaponControl, MagicWeaponConfig magicWeaponConfig, System.Action callBack = null) { this._magicWeaponControl = magicWeaponControl; string modelName = magicWeaponConfig.model; // GameTimeLineParticleFactory CombatHeroGameObjectPool poolInterface = await GObjectPool.Instance.FetchAsync(modelName + ".prefab", null); #if !COMBAT_SERVER if (poolInterface == null || poolInterface.own == null) { return null; } poolInterface.own.transform.position = Vector3.one; poolInterface.own.SetActive(false); combatHeroTimeLineControl = new CombatHeroTimeLineControl(); combatHeroTimeLineControl.Init(this); AssetHandle assetHandle = await AssetBundleLoadManager.Instance.LoadAssetAsyncTask( modelName + "_TD.txt"); if (assetHandle != null) { TextAsset textAsset = assetHandle.AssetObject(); TimeLienData timeLienData = JsonManager.FromJson(textAsset.text); timeLienData.DeserializeData(); assetHandle.Release(); combatHeroTimeLineControl.AddTimeLienData(timeLienData); } combatHeroGameObject = new CombatHeroGameObject(); combatHeroGameObject.Init(this, poolInterface); if (CombatAIBasic == null) { CombatAIBasic = new MagicWeaponAi(); } HeroEntityMono heroEntityMono = poolInterface.own.GetComponent(); if (heroEntityMono == null) { heroEntityMono = poolInterface.own.AddComponent(); } heroEntityMono.combatHeroEntity = this; CombatAIBasic.Init(this); AnimancerComponent animancerComponent = poolInterface.own.GetComponent(); combatHeroAnimtion = new CombatHeroAnimtion(); poolInterface.own.SetActive(true); combatHeroAnimtion.Init(this); CombatAIBasic.ChangeState(CombatHeroStateType.XiuMian); #endif callBack?.Invoke(this); return this; } public override void Update(float t) { combatHeroTimeLineControl.Update(t); CombatAIBasic?.Update(t); if (CombatAIBasic.CurrState.GetType() == typeof(MagicWeapomDormancyState)) { cd -= t; if (cd <= 0) { _magicWeaponControl.UseMagicWeapon(this); } } } } }