using Animancer; using Common.Utility.CombatEvent; using Excel2Json; using Fort23.Core; using Fort23.UTool; using GameLogic.Combat.Buff; using GameLogic.Combat.CombatTool; using GameLogic.Combat.Hero.State; using UnityEngine; using UnityEngine.AI; namespace GameLogic.Combat.Hero { /// /// 法宝对象 /// public class CombatMagicWeaponEntity : CombatHeroEntity { /// /// 碰撞的target /// public CombatMagicWeaponEntity CollidingTarget; public int MagicWeaponCollisionId=-1; protected MagicWeaponConfig _magicWeaponConfig; public float cd = 2; public float HpBl { get { return _HpBl; } } private float _HpBl = 100; public int useIndex; /// /// 是否进入战斗状态 /// public bool isCombatState; private MagicWeaponControl _magicWeaponControl; public MagicWeaponControl MagicWeaponControl { get { return _magicWeaponControl; } } public void ReduceHp(float value) { _HpBl -= value; if (_HpBl <= 0) { HeroDieEventData heroDieEventData = HeroDieEventData.Create(); heroDieEventData.combatHeroEntity = this; CombatEventManager.Instance.Dispatch(CombatEventType.MagicWeaponDie, heroDieEventData); cd = 10; CombatAIBasic.ChangeState(CombatHeroStateType.XiuMian); } } 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.GetComponentInChildren(); combatHeroAnimtion = new CombatHeroAnimtion(); poolInterface.own.SetActive(true); combatHeroAnimtion.Init(this); CombatAIBasic.ChangeState(CombatHeroStateType.XiuMian); #endif callBack?.Invoke(this); return this; } public override float GetAttSpeed() { return 1; } public override void Update(float t) { combatHeroTimeLineControl.Update(t); CombatAIBasic?.Update(t); if (CombatAIBasic.CurrState.GetType() == typeof(MagicWeapomDormancyState)) { cd -= t; if (cd <= 0&&_magicWeaponControl.combatHeroEntity.CombatAIBasic.currFocusTarget != null) { _HpBl = 100; CollidingTarget = null; _magicWeaponControl.UseMagicWeapon(this); } } } } }