public override void TickAILogic() { if (runAI == false) { return; } if (currentAniState == AniState.Idle || currentAniState == AniState.Move) { if (battleMgr.isGamePause == true) { Idle(); return; } float delta = Time.deltaTime; checkCountTime += delta; if (checkCountTime < checkTime) { return; } else { // 计算目标方向 Vector2 dir = CalcTargetDir(); // 判断目标是否在攻击范围了 if (InAtkRange() == false) { // 不在则设置移动方向,并进入移动状态 SetDir(dir); Move(); } else { Debug.Log(GetType() + "/TickAILogic()/In Atk Range"); // 在:则停止移动,进行攻击 SetDir(Vector2.zero); // 判读攻击间隔 atkCountTime += checkCountTime; if (atkCountTime >= atkTime) { //达到攻击事件,转向并攻击 SetAtkRotation(dir); Attack(md.mCfg.skillID); atkCountTime = 0; } else { // 未达到攻击时间,Idle等待 Idle(); } } checkCountTime = 0; checkTime = PETools.RDInt(1, 5) * 1.0f / 10; } } }
private void NormalMonsterLogic() { //这里待修复为什么怪物出生以后是none状态,没有进入idle状态,暂时的解决办法是判断加入none if (currentState == AniState.Idle || currentState == AniState.Walk || currentState == AniState.None) { float delta = Time.deltaTime; checkTimeCount += delta; if (checkTimeCount < checkTime) { return; } else { if (md.mCfg.mType==MonsterType.Elite) { if (checkTimeCount<bossCheckTime) { return; } } //计算目标方向 Vector2 dir = CalculateTargetDir(); if (!InAtkRange(false)) { //不在范围:设置移动方向,进入移动状态 SetDir(dir); Move(); } else { //在:停止移动,进行攻击 SetDir(Vector2.zero);//这里设置为0,controller就会把状态修改为idle //判断攻击间隔,移动过程的时间也在累计攻击间隔 atkTimeCount += delta; atkTimeCount += checkTimeCount; if (atkTimeCount > atkTime) { //达到攻击时间,转向并且攻击 SetAtkRotation(dir); Attack(md.mCfg.skillID); atkTimeCount = 0; } else { Idle(); } checkTimeCount = 0; } //让检测时间在0.1~0.5秒内浮动 checkTime = PETools.RDInt(1, 5) * 1.0f / 10; bossCheckTime= PETools.RDInt(1, 5) * 1.0f / 10; } } }
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等待 Idle(); } } checkCountTime = 0; checkTime = PETools.RDInt(1, 5) * 1.0f / 10; } } }
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.RDInt(1, 5) * 1.0f / 10; } } }
public override void TickAILogic() { if (!runAI) { return; } if (CurrentAniState == AniState.Idle || CurrentAniState == AniState.Move) { if (BattleMgr.IsPauseGame) { Idle(); return; } float delta = Time.deltaTime; m_CheckCountTime += delta; if (m_CheckCountTime < m_CheckTime) { return; } else { Vector2 dir = CalcTargetDir(); if (!InAtkRange()) { SetDir(dir); Move(); } else { SetDir(Vector2.zero);//设置静止 m_AtkCountTime += m_CheckCountTime; if (m_AtkCountTime > m_AtkTime) { SetAtkRotation(dir, false); Attack(Md.mCfg.skillID); m_AtkCountTime = 0; } else { Idle(); } } m_CheckCountTime = 0; m_CheckTime = PETools.RDInt(1, 5) * 1.0f / 10; } } }
public string GetRDNameData(bool man = true) { string rdName = surnameLst[PETools.RDInt(0, surnameLst.Count - 1)]; if (man) { rdName += manLst[PETools.RDInt(0, manLst.Count - 1)]; } else { rdName += womanLst[PETools.RDInt(0, womanLst.Count - 1)]; } return(rdName); }
public string GetRDNameData(bool man = true) { System.Random rd = new System.Random(); string rdName = surNameList[PETools.RDInt(0, surNameList.Count - 1)]; if (man) { rdName += manList[PETools.RDInt(0, manList.Count - 1)]; } else { rdName += womanList[PETools.RDInt(0, womanList.Count - 1)]; } return(rdName); }
private void CalcDamage(EntityBase caster, EntityBase target, SkillCfg skillCfg, int damage) { int dmgSum = damage; if (skillCfg.dmgType == DamageType.AD) { //计算闪避 int dodgeNum = PETools.RDInt(1, 100, rd); if (dodgeNum <= target.Props.dodge) { //UI显示闪避 TODO target.SetDodge(); return; } //计算属性加成 dmgSum += caster.Props.ad; //计算暴击 int criticalNum = PETools.RDInt(1, 100, rd); if (criticalNum <= caster.Props.critical) { float criticalRate = 1 + (PETools.RDInt(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; } 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(); } } }
//boss行动逻辑 private void BossLogic() { if (currentState == AniState.Idle || currentState == AniState.Walk || currentState == AniState.None) { float delta = Time.deltaTime; checkTimeCount += delta; if (checkTimeCount < bossCheckTime) { return; } else { if (skillEnd) { BossSkillSelect(); skillEnd = false; } //计算目标方向 Vector2 dir = CalculateTargetDir(); if (!InAtkRange(true)) { //不在范围:设置移动方向,进入移动状态 SetDir(dir); Move(); //攻击4秒钟还没打出去,直接调用黑气,可以修改地形压迫玩家走位 if (checkTimeCount>=4) { SetDir(Vector2.zero); atkTimeCount += delta; atkTimeCount += checkTimeCount; if (atkTimeCount > atkTime) { SetAtkRotation(dir); Attack(bossSkillArray[1]); skillEnd = true; atkTimeCount = 0; } else {//攻击间隔就追踪移动,可能回过于灵敏 //贴身的时候要进入idle状态 SetDir(dir); SetAtkRotation(dir); if (DistanceTooClose()) { Attack(bossSkillArray[0]); } else { Move(); } } checkTimeCount = 0; bossCheckTime = PETools.RDInt(1, 5) * 1.0f / 10; } } else { //在:停止移动,进行攻击 SetDir(Vector2.zero);//这里设置为0,controller就会把状态修改为idle //判断攻击间隔,移动过程的时间也在累计攻击间隔 atkTimeCount += delta; atkTimeCount += checkTimeCount; if (atkTimeCount > atkTime) { //达到攻击时间,转向并且攻击 SetAtkRotation(dir); Attack(currentBossSkill); skillEnd = true; atkTimeCount = 0; } else {//攻击间隔就追踪移动,可能回过于灵敏 //贴身的时候就会发动攻击 SetDir(dir); SetAtkRotation(dir); if (DistanceTooClose()) { Attack(bossSkillArray[0]); } else { Move(); } } checkTimeCount = 0; } //让检测时间在0.1~0.5秒内浮动 checkTime = PETools.RDInt(1, 5) * 1.0f / 10; bossCheckTime = PETools.RDInt(1, 5) * 1.0f / 10; } } }
/// <summary> /// 技能伤害计算 /// </summary> /// <param name="caster">施法者</param> /// <param name="target">目标</param> /// <param name="skillCfg">技能数据配置</param> /// <param name="damage">技能原本伤害值</param> private void CalcDamage(EntityBase caster, EntityBase target, SkillCfg skillCfg, int damage) {//伤害除了技能本身伤害,还需要加上自身属性值 int dmgSum = damage; //计算属性加成 dmgSum += caster.AttackValue; //暴击 int criticalNum = PETools.RDInt(1, 100, rd); if (criticalNum <= caster.BattleProps.critical) { //暴击伤害比率在110%~200%之间 float criticalRate = 1 + (PETools.RDInt(10, 100, rd) / 100.0f); dmgSum = (int)criticalRate * dmgSum; target.SetCritical(dmgSum); //Debug.Log("暴击伤害率:"+criticalRate+" 暴击率:"+caster.BattleProps.critical); } //计算防御扣减 dmgSum -= target.BattleProps.defend; //最小伤害为0 if (dmgSum < 0) { dmgSum = 0; return; } target.SetHurt(dmgSum); if (target.Hp <= dmgSum) { target.Hp = 0; //死亡 target.Die(); if (target.entityType == EntityType.Monster) { target.battleMg.RemoveMonster(target.Name); } else if (target.entityType == EntityType.Player) { target.battleMg.EndBattle(false, 0); target.battleMg.entitySelfPlayer = null; } } else { target.Hp -= dmgSum; //判断是否符合获取霸体条件 target.GetUnBreakState(); //TODO,是否处于剑刃风暴状态,是则反弹伤害 if (!target.unBreakable && !target.cantStop) { target.Wound(); } else {//为了对玩家友好,霸体状态下也会受伤提示 if (target is EntityPlayer) { AudioSource characterAudio = target.GetAudio(); AudioSvc.instance.PlayCharacterAudio(Constants.archerSpecialWound, characterAudio); } } } }
/// <summary> /// 技能伤害计算 /// </summary> /// <param name="caster"></param> /// <param name="target"></param> /// <param name="skillCfg"></param> /// <param name="damage"></param> private void CalcDamage(EntityBase caster, EntityBase target, SkillCfg skillCfg, int damage) { //Debug.Log(GetType() + "/CalcDamage()/ "); int dmgSum = damage; if (skillCfg.dmgType == DamageType.AD) { // 计算闪避 int dodgeNum = PETools.RDInt(1, 100, rd); if (dodgeNum <= target.Props.dodge) { // UI 显示闪避 Debug.Log(GetType() + "/()/ Dodge Rate : " + dodgeNum + "/" + target.Props.dodge); target.SetDodge(); return; } // 计算属性加成 dmgSum += caster.Props.ad; //计算暴击 int criticalNum = PETools.RDInt(1, 100, rd); if (criticalNum <= caster.Props.critical) { float criticalRate = 1 + PETools.RDInt(1, 100, rd) / 100.0f; dmgSum += (int)criticalRate * dmgSum; // UI 暴击 Debug.Log(GetType() + "/()/ Critical Rate : " + criticalNum + "/" + caster.Props.critical); target.SetCiritical(dmgSum); } //计算穿甲 int addef = (int)((1 - caster.Props.pierce / 100.0f) * target.Props.addef); dmgSum -= addef; } else if (skillCfg.dmgType == DamageType.AP) { // 计算属性加成 dmgSum += caster.Props.ap; // 计算魔法抗性 dmgSum -= target.Props.apdef; } else { } // 最终的伤害不能小于0(根据自己的项目来设定) if (dmgSum < 0) { dmgSum = 0; return; } // UI 显示最终伤害 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.entityPlayer = null; } } else { target.HP -= dmgSum; // 霸体状态可受伤害,但是不会切换到受伤状态 if (target.entityState == EntityState.None && target.GetBreakState() == true) { // 目标受到攻击 target.Hit(); } } }