因为在Unity中使用触发器比较消耗内存,所以一般采用设计数学计算方法判断目标是否在攻击范围内。
1、先设计一个抽象的技能类。
public abstract class Skill
{
//被攻击对象
public MyHero[] attackTarget { get; set; }
//施法者
public MyHero SkillFirerHero { get; set; }
//技能参数
public float[] SkillParameters { get; set; }
//技能伤害
public float Damage { get; set; }
//扣血的方法
public abstract void TakeDamage();
}
2、定义一个英雄类。
public class MyHero
{
private string name;
public float HeroHp { get; set; }
public Transform HeroTra { get; set; }
public Skill skill { get; set; }
public MyHero(string name)
{
this.name = name;
}
public void FireSkill()
{
skill.SkillFirerHero = this;
skill.TakeDamage();
}
//扣血
public void TakeDamage(float damage)
{
HeroHp -= damage;
Debug.Log(name+"收到伤害"+damage);
}
}
3、定义圆形攻击类
public class CircleSkill:Skill
{
public override void TakeDamage()
{
//拿到玩家坐标
Vector3 playerPos = SkillFirerHero.HeroTra.position;
//技能中心,-->palyerPos+forward+length
Vector3 skillCenter = playerPos + SkillFirerHero.HeroTra.forward * SkillParameters[0];
for (int i = 0; i < attackTarget.Length; i++)
{
//计算目标与技能中心的距离
float dis= Vector3.Distance(skillCenter, attackTarget[i].HeroTra.position);
//如果距离小于技能半径
if (dis<=SkillParameters[1])
{
attackTarget[i].TakeDamage(Damage);
}
}
}
}
4、定义矩形攻击类
public class CubeSkill:Skill
{
public override void TakeDamage()
{
//拿到玩家坐标
Vector3 playerPos = SkillFirerHero.HeroTra.position;
//技能中心,-->palyerPos+forward&