/// <summary> /// 怪物的 AI 逻辑 /// </summary> public override void TickAILogic() { if (!runAI) { return; } // 防止还在 出生状态 就开始移动,从而出现滑动效果 if (currentAniState == AniState.Idle || currentAniState == AniState.Move) { // 暂停游戏 if (battleMgr.isPauseGame) { Idle(); return; } // 检测时间间隔计算 float delta = Time.deltaTime; checkCountTime += delta; if (checkCountTime < checkTime) { return; } else { // 计算目标方向 Vector2 dir = CalcTargetDir(); // 判断目标是否在攻击范围 if (!InAtkRange()) // 不在,设置移动方向,移动 { SetDir(dir); Move(); } else // 在,停止移动,攻击 { SetDir(Vector2.zero); // 判断攻击间隔 atkCountTime += checkCountTime; // 把移动的时间当成时间间隔的一部分,防止移动到目标身边后还要等待一会才会攻击 if (atkCountTime > atkTime) // 达到攻击时间,转向并攻击 { SetAtkRotation(dir); Attack(md.mCfg.skillID); atkCountTime = 0; } else // 等待 { Idle(); } } checkCountTime = 0; checkTime = PETools.RanInt(1, 5) * 1.0f / 10; // 第一次 2 s,之后随机检测时间间隔 } } }
/// <summary> /// 获取一个随机的名字 /// </summary> /// <param name="man">默认男人名字,false 为女人</param> /// <returns></returns> public string GetRanName(bool man = true) { string ranName = surnameLst[PETools.RanInt(0, surnameLst.Count - 1)]; if (man) { ranName += manLst[PETools.RanInt(0, manLst.Count - 1)]; } else { ranName += womanLst[PETools.RanInt(0, womanLst.Count - 1)]; } return(ranName); }
/// <summary> /// 伤害运算 /// </summary> private void CalcDamage(EntityBase caster, EntityBase target, SkillCfg skillCfg, int damage) { int dmgSum = damage; // AD 伤害 if (skillCfg.dmgType == DamageType.AD) { // 计算闪避 int dodgeNum = PETools.RanInt(1, 100, rd); if (dodgeNum <= target.Props.dodge) { // UI 显示闪避 TODO PECommon.Log("闪避Rate:" + dodgeNum + "/" + target.Props.dodge); target.SetDodge(); return; } // 计算属性加成 dmgSum += caster.Props.ad; // 计算暴击 int criticalNum = PETools.RanInt(1, 100, rd); if (criticalNum <= caster.Props.critical) { float criticalRate = 1 + (PETools.RanInt(1, 100, rd) / 100.0f); // 暴击率 dmgSum = (int)criticalRate * dmgSum; PECommon.Log("暴击Rate:" + criticalNum + "/" + caster.Props.critical); target.SetCritical(dmgSum); } // 计算穿甲 int addef = (int)((1 - caster.Props.pierce / 100.0f) * target.Props.addef); dmgSum -= addef; } // AP 伤害 else if (skillCfg.dmgType == DamageType.AP) { // 计算属性加成 dmgSum += caster.Props.ap; // 计算魔法抗性 dmgSum -= target.Props.apdef; } else { } // 最终伤害 if (dmgSum < 0) { dmgSum = 0; return; } target.SetHurt(dmgSum); if (target.HP < dmgSum) { target.HP = 0; target.Die(); // 目标死亡 if (target.entityType == EntityType.Monster) { target.battleMgr.RmvMonster(target.Name); // 移除 } else if (target.entityType == EntityType.Player) { target.battleMgr.EndBattle(false, 0); // 结束战斗 target.battleMgr.entitySelfPlayer = null; } } else { target.HP -= dmgSum; if (target.entityState == EntityState.None && target.GetBreakState()) { target.Hit(); } } }