yyl
2025-05-15 d341a47ed9bbb740f2ccb9d6d42fd74d5a1c6b5d
Main/Battle/BattleObject/BattleObject.cs
@@ -2,206 +2,129 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using DG.Tweening;
using DG.Tweening.Core;
using DG.Tweening.Plugins.Options;
/// <summary>
/// 战斗对象阵营枚举
/// </summary>
public enum BattleCamp
{
    Friendly,   // 友方
    Enemy       // 敌方
    Friendly,
    Enemy
}
/// <summary>
/// 战斗状态枚举
/// </summary>
[Flags]
public enum BattleState
{
    None = 0,
    Stunned = 1 << 0,     // 眩晕
    Poisoned = 1 << 1,    // 中毒
    Bleeding = 1 << 2,    // 流血
    Silenced = 1 << 3,    // 沉默
    Frozen = 1 << 4,      // 冰冻
    Burned = 1 << 5       // 灼烧
    Stunned = 1 << 0,
    Poisoned = 1 << 1,
    Bleeding = 1 << 2,
    Silenced = 1 << 3,
    Frozen = 1 << 4,
    Burned = 1 << 5
}
/// <summary>
/// 战斗对象基类
/// </summary>
public class BattleObject
{
    /// <summary>
    /// 战斗对象ID
    /// </summary>
    public string BattleObjectId { get; protected set; }
    
    /// <summary>
    /// 战斗对象阵营
    /// </summary>
    public BattleCamp Camp { get; protected set; } = BattleCamp.Friendly;
    
    // Buff系统
    // List<BuffInfo> buffList;         // 所有buff列表
    // List<BuffInfo> gainBuffList;     // 增益buff列表
    // List<BuffInfo> debuffList;       // 减益buff列表
    public TeamCard teamCard { get; protected set; }
    protected MotionBase motionBase;
    protected GameObject cardGO;
    
    /// <summary>
    /// 初始化战斗对象
    /// </summary>
    /// <param name="id">战斗对象ID</param>
    /// <param name="camp">战斗对象阵营</param>
    public virtual void Initialize(string id, BattleCamp camp)
    public virtual void Init(TeamCard _teamCard)
    {
        BattleObjectId = id;
        Camp = camp;
        this.teamCard = _teamCard;
        motionBase = new MotionBase();
    }
    protected void LoadCard()
    {
        
        // 初始化Buff列表
        // buffList = new List<BuffInfo>();
        // gainBuffList = new List<BuffInfo>();
        // debuffList = new List<BuffInfo>();
    }
    
    #region Buff系统(待实现)
    // /// <summary>
    // /// 添加Buff
    // /// </summary>
    // /// <param name="buff">Buff信息</param>
    // public virtual void AddBuff(BuffInfo buff)
    // {
    //     // 添加Buff到列表
    //     // 根据Buff类型添加到对应列表
    //     // 应用Buff效果
    // }
    //
    // /// <summary>
    // /// 移除Buff
    // /// </summary>
    // /// <param name="buffId">Buff ID</param>
    // public virtual void RemoveBuff(string buffId)
    // {
    //     // 从列表中移除Buff
    //     // 移除Buff效果
    // }
    //
    // /// <summary>
    // /// 更新所有Buff
    // /// </summary>
    // public virtual void UpdateBuffs()
    // {
    //     // 更新所有Buff的持续时间
    //     // 移除已过期的Buff
    //     // 应用Buff的持续效果
    // }
    //
    // /// <summary>
    // /// 获取所有Buff
    // /// </summary>
    // /// <returns>Buff列表</returns>
    // public virtual List<BuffInfo> GetAllBuffs()
    // {
    //     return buffList;
    // }
    //
    // /// <summary>
    // /// 获取所有增益Buff
    // /// </summary>
    // /// <returns>增益Buff列表</returns>
    // public virtual List<BuffInfo> GetGainBuffs()
    // {
    //     return gainBuffList;
    // }
    //
    // /// <summary>
    // /// 获取所有减益Buff
    // /// </summary>
    // /// <returns>减益Buff列表</returns>
    // public virtual List<BuffInfo> GetDebuffs()
    // {
    //     return debuffList;
    // }
    #endregion
    
    #region 战斗相关函数
    
    /// <summary>
    /// 攻击目标
    /// </summary>
    /// <param name="target">攻击目标</param>
    /// <param name="damage">伤害值</param>
    /// <param name="isCritical">是否暴击</param>
    /// <returns>实际造成的伤害</returns>
    public virtual float AttackTarget(BattleObject target)
    public virtual void AttackTarget(List<BattleObject> targets)
    {
        // 子类实现具体逻辑
        return 0;
        // 找离自己最近的
        if (0 == targets.Count) return;
        BattleObject target = targets[0];
        if (1 != targets.Count)
        {
            for (int i = 1; i < targets.Count; i++)
            {
                if (Vector3.Distance(cardGO.transform.position, targets[i].cardGO.transform.position) < Vector3.Distance(cardGO.transform.position, target.cardGO.transform.position))
                {
                    target = targets[i];
                }
            }
        }
        Vector3 tempPos = cardGO.transform.position;
        motionBase.OnAttackAnimationComplete = () => {
            // 攻击动画结束之后 回到原来的位置
            cardGO.transform.DOMove(tempPos, 1f).OnComplete(() => {
                // motionBase.ClearEvent();// = null;
                //  通知本次攻击行动结束
                //  通过battleFieldId来告知BattleFieldMgr
            });
        };
        cardGO.transform.DOMove(target.cardGO.transform.position, 1f).OnComplete(() => {
            // 播放攻击动画
            motionBase.OnAttackHitEvent = (int attackIndex) => {
                for (int i = 0; i < targets.Count; i++)
                {
                    targets[i].UnderAttack(this);
                }
            };
            //普攻是hit1
            motionBase.PlayAnimationEx(MotionName.atk1, false, new List<int>(){
                5//假设是5帧 目前还没有数据
            });
        });
    }
    public virtual void CastSkill(List<BattleObject> targets)
    {
        //  需不需要move 攻击目标是谁
    }
    
    /// <summary>
    /// 被攻击
    /// </summary>
    /// <param name="attacker">攻击者</param>
    /// <param name="damage">伤害值</param>
    /// <param name="isCritical">是否暴击</param>
    /// <returns>实际受到的伤害</returns>
    public virtual float UnderAttack(BattleObject attacker)
    {
        // 子类实现具体逻辑
        return 0;
    }
    
    /// <summary>
    /// 治疗目标
    /// </summary>
    /// <param name="target">治疗目标</param>
    /// <param name="healAmount">治疗量</param>
    /// <param name="isCritical">是否暴击</param>
    /// <returns>实际治疗量</returns>
    public virtual float HealTargets(List<BattleObject> targets)
    {
        // 子类实现具体逻辑
        return 0;
    }
    
    /// <summary>
    /// 被治疗
    /// </summary>
    /// <param name="healer">治疗者</param>
    /// <param name="healAmount">治疗量</param>
    /// <param name="isCritical">是否暴击</param>
    /// <returns>实际被治疗量</returns>
    public virtual float BeHealed(BattleObject healer, float healAmount)
    {
        // 子类实现具体逻辑
        return 0;
    }
    
    /// <summary>
    /// 复活目标
    /// </summary>
    /// <param name="target">复活目标</param>
    /// <param name="healthPercent">复活后的生命值百分比</param>
    /// <returns>是否复活成功</returns>
    public virtual bool Revive(BattleObject target)
    {
        // 子类实现具体逻辑
        return false;
    }
    
    /// <summary>
    /// 被复活
    /// </summary>
    /// <param name="reviver">复活者</param>
    /// <param name="healthPercent">复活后的生命值百分比</param>
    /// <returns>是否被复活成功</returns>
    public virtual bool BeRevived(BattleObject reviver, float healthPercent = 0.5f)
    {
        // 子类实现具体逻辑
        return false;
    }
    
@@ -209,35 +132,23 @@
    
    #region 辅助函数
    
    /// <summary>
    /// 判断是否为敌对关系
    /// </summary>
    /// <param name="other">其他战斗对象</param>
    /// <returns>是否为敌对关系</returns>
    public virtual bool IsEnemy(BattleObject other)
    {
        if (other == null) return false;
        
        // 不同阵营为敌对关系
        return Camp != other.Camp;
    }
    
    /// <summary>
    /// 判断是否为友好关系
    /// </summary>
    /// <param name="other">其他战斗对象</param>
    /// <returns>是否为友好关系</returns>
    public virtual bool IsFriendly(BattleObject other)
    {
        if (other == null) return false;
        
        // 相同阵营为友好关系
        return Camp == other.Camp;
    }
    public virtual void Run()
    {
        // 子类实现具体逻辑
        motionBase.Run();
    }
    
    #endregion