public bool checkingDefaultAttackRange(Monster attacker, Monster target, IVector3 targetPosition, float offset = 0.0f) { if (attacker.isPlayerSide == false) { if (isShortType) { return(VectorUtil.DistanceXZ(targetPosition, attacker.cTransformPosition) <= (IFloat)(attacker.stat.atkRange + target.damageRange + offset + attacker.damageRange)); // hitrange } else { return(Xfloat.lessEqualThan(attacker.cTransformPosition.x - attacker.stat.atkRange - offset - attacker.damageRange, targetPosition.x + target.hitObject.lineRight)); } } else { if (isShortType) { return(Xfloat.lessEqualThan(VectorUtil.DistanceXZ(targetPosition, attacker.cTransformPosition), attacker.stat.atkRange + target.damageRange + offset + attacker.damageRange)); // hitrange } else { return(Xfloat.greatEqualThan(attacker.cTransformPosition.x + attacker.stat.atkRange + offset + attacker.damageRange, target.hitObject.lineLeft + targetPosition.x)); } } }
public static int getDamage(float inputAtk, float def, float inputMagicAtk = 0.0f, float magicDef = 0.0f, float damagePer = 1.0f, float minimumDamagePer = 1.0f, float damagePer2 = 1.0f, float inputTempDiscountDamageValue = 1.0f) // damagePer2는 공격동작중 한번에 여러번 타격판정이 들어가는 경우에 사용한다. { //#if UNITY_EDITOR // Log.log("atk:",atk,"def:",def,"magicAtk:",magicAtk,"magicDef:",magicDef,"damagePer:",damagePer,"minimumDamagePer:",minimumDamagePer,"damagePer2:",damagePer2); //#endif IFloat atk = inputAtk; IFloat magicAtk = inputMagicAtk; IFloat tempDiscountDamageValue = inputTempDiscountDamageValue; damagePer = (Mathf.Round(damagePer * 100.0f)) / 100.0f; //데미지 = 물리공격력 * (1/SQRT(물리방어력)) * A + 마법공격력 * (1/SQRT(마법방어력)) * B //* SQRT : 제곱근, A : 데미지보정계수 (5), B : 데미지보정계수 (5) if (Xfloat.lessEqualThan(def, 0)) { def = 1; } if (Xfloat.lessEqualThan(magicDef, 0)) { magicDef = 1; } atk = (atk * (1.0f / Mathf.Sqrt(def))) * 5.0f + (magicAtk * (1.0f / Mathf.Sqrt(magicDef)) * 5.0f); // damagePer // 기본 데미지의 몇 %. // minimumDamagePer // 데미지의 최소 비율. if (Xfloat.lessThan(damagePer, 1.0f)) { atk = atk * minimumDamagePer + ((atk - (atk * minimumDamagePer)) * damagePer); } // 얘는 한공격 동작에 데미지가 여러번 들어가는 경우 그 횟수로 나누어줘서 밸런스를 맞춰주기 위함이다. atk *= damagePer2; // 이런 코드를 만들고 싶지 않았으나... 공격타입 5번과 15번은 단계마다 특정비율로 데미지를 깍는다. // 거치는 곳이 많기 때문에 어쩔 수 없이 예외를 만들어 데미지를 깍아준다. atk *= tempDiscountDamageValue; int gValue = Mathf.RoundToInt(atk * 100.0f); if (GameManager.inGameRandom.Range(0, 100) < gValue % 100) { return(gValue / 100 + 1); } else { return(gValue / 100); } }