| | |
| | | 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; |
| | | } |
| | | |
| | |
| | | |
| | | #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 |