using System; using UnityEngine; using Spine.Unity; using System.Collections.Generic; /// /// 命格战斗对象 - 没有血量、没有实体,不会被攻击和选中,唯一作用是释放技能 /// public class MinggeBattleObject : BattleObject { public TeamMingge teamMingge { get; private set; } // Buff 管理器(命格现在也需要 buff 系统) public BattleObjectBuffMgr buffMgr; // 预留的命格 Buff 显示接口,供外部自定义显示逻辑 public Action> OnMinggeBuffRefresh; public MinggeBattleObject(BattleField _battleField) : base(_battleField) { } public virtual void Init(TeamBase teamBase, TeamMingge _teamMingge, BattleCamp _camp) { teamMingge = _teamMingge; Camp = _camp; ObjID = teamMingge.ObjID; // 初始化 buff 管理器 buffMgr = new BattleObjectBuffMgr(); buffMgr.Init(this); layerMgr = new BattleObjectLayerMgr(); layerMgr.Init(this); } public override void Run() { // 更新 buff 管理器 buffMgr?.Run(); } public override void Pause() { // 命格暂停 } public override void Resume() { // 命格恢复 } public override void Destroy() { // 清理显示回调 OnMinggeBuffRefresh = null; // 清理 buff 管理器 if (buffMgr != null) { buffMgr.Release(); buffMgr = null; } } // ============ 实现抽象访问方法 ============ public override BattleObjectBuffMgr GetBuffMgr() => buffMgr; public override int GetPositionNum() => teamMingge.positionNum; public override float GetModelScale() => teamMingge.modelScale; public override string GetName() => teamMingge.name; protected override bool GetIsStunned() => teamMingge.isStunned; protected override bool GetIsFrozen() => teamMingge.isFrozen; protected override bool GetIsStoned() => teamMingge.isStoned; protected override bool GetIsSlient() => teamMingge.isSlient; protected override bool GetIsDisarmed() => teamMingge.isDisarmed; protected override bool GetIsInvincible() => teamMingge.isInvinceble; protected override bool GetIsDead() => teamMingge.isDead; public override int GetRage() => teamMingge.rage; protected override void ApplyCasterHpChange(long newHp) { // 命格没有血量,忽略 } public override long GetCurHp() => 0; public override long GetMaxHp() => 0; public override void SetCurHp(long value) { } public override void SetIsDead(bool value) { } public override int GetNPCID() => 0; public override long GetFightPower() => 0; // ============ 动画相关方法实现(命格没有动画) ============ public override void PlayAnimation(MotionName motionName, bool loop) { // 命格没有动画 } public override void ShowIllusionShadow(bool show, Color? color = null) { // 命格没有幻影 } public override Spine.TrackEntry PlaySkillAnimation(SkillConfig skillConfig, SkillBase skillBase, bool isCounter, Action onComplete) { // 命格没有技能动画,立即触发所有帧事件 int loopCount = skillConfig.LoopCount + 1; //默认会有一次 int frameCount = skillConfig.ActiveFrames.Length; // 1. 技能开始 skillBase.OnSkillStart(); // 2. 前摇结束 skillBase.OnStartSkillFrameEnd(); // 3. 循环执行中摇 int triggerCount = 0; for (int currentLoop = 0; currentLoop < loopCount; currentLoop++) { // 每个 loop 开始时调用 OnMiddleFrameStart skillBase.OnMiddleFrameStart(currentLoop); // 触发该 loop 的所有 ActiveFrame for (int i = 0; i < frameCount; i++) { skillBase.OnMiddleFrameEnd(currentLoop, triggerCount++); } } // 4. 后摇开始 skillBase.OnFinalFrameStart(); // 5. 完成回调 onComplete?.Invoke(); // 6. 后摇结束 skillBase.OnFinalFrameEnd(); return null; } public override bool CanStartDeath() { // 命格不会死亡 return false; } public override bool CanCastSkillAnimation(SkillConfig skillConfig) { // 命格总是可以释放技能(从动画角度) return true; } public override SkeletonAnimation GetSkeletonAnimation() { // 命格没有骨骼动画 return null; } public override void SetSkeletonAlpha(float alpha) { // 命格没有骨骼动画 } // ============ 以下方法命格不需要,但必须实现接口 ============ public override DeathRecordAction Hurt(BattleHurtParam battleHurtParam, SkillRecordAction _parentSkillAction = null) { // 命格不会被攻击 Debug.LogWarning("命格不应该被攻击"); return null; } public override void OnDodgeBegin(DamageType damageType) { // 命格不需要闪避 } public override void OnDodgeEnd(Action _complete = null) { // 命格不需要闪避 _complete?.Invoke(); } public override void OnDeath(Action _onDeathAnimationComplete, bool withoutAnime = false) { // 命格没有死亡 _onDeathAnimationComplete?.Invoke(); } protected override BattleDmgInfo PopDamage(BattleHurtParam battleHurtParam) { // 命格不显示伤害 return null; } protected override BattleDmgInfo PopDamageForCaster(BattleHurtParam battleHurtParam) { // 命格不显示伤害 return null; } public override void HaveRest() { // 清理 buff buffMgr?.RemoveAllBuff(); } public override void SetSpeedRatio(float ratio) { // 命格不需要速度控制 } public override void OnObjPropertyRefreshView(HB418_tagSCObjPropertyRefreshView vNetData) { // 命格没有血量,不需要属性刷新 } #if UNITY_EDITOR_STOP_USING public override void EditorRevive() { // 命格不需要复活 } #endif protected override void OnPlayHitAnimation() { // 命格不需要受击动画 } }