因为在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+lengthVector3 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+lengthVector3 skillCenter = playerPos + SkillFirerHero.HeroTra.forward * SkillParameters[0];for (int i = 0; i < attackTarget.Length; i++){//计算目标与技能中心的距离Vector3 dir = attackTarget[i].HeroTra.position - skillCenter;//计算技能方向向量在横向right和纵向forward的投影向量Vector3 rightDir= Vector3.Project(dir, SkillFirerHero.HeroTra.right);Vector3 forwardDir = Vector3.Project(dir, SkillFirerHero.HeroTra.forward);//如果在矩形范围内,则收到伤害if(rightDir.magnitude<SkillParameters[1]/2&&forwardDir.magnitude<SkillParameters[2]/2){attackTarget[i].TakeDamage(Damage);}}}
}

5、定义扇形攻击类

public class SectorSkill:Skill
{public override void TakeDamage(){//拿到玩家坐标Vector3 playerPos = SkillFirerHero.HeroTra.position;//技能长度,-->palyerPos+forward+lengthVector3 skillCenter = playerPos + SkillFirerHero.HeroTra.forward * SkillParameters[0];for (int i = 0; i < attackTarget.Length; i++){//距离目标前方向量Vector3 forwardDir = skillCenter - playerPos;//目标与攻击者的方向向量Vector3 targetDir = attackTarget[i].HeroTra.position - playerPos;//目标与攻击者的距离float targetDis = Vector3.Distance(playerPos, attackTarget[i].HeroTra.position);float jiajiao = Mathf.Acos(Vector3.Dot(forwardDir.normalized, targetDir.normalized)) * Mathf.Rad2Deg;if(targetDis<=SkillParameters[0]){if(jiajiao<=SkillParameters[1]){attackTarget[i].TakeDamage(Damage);}}}}
}

6、完整的代码

using UnityEngine;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();}
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);}
}
/// <summary>
/// 圆形攻击
/// </summary>
public class CircleSkill:Skill
{public override void TakeDamage(){//拿到玩家坐标Vector3 playerPos = SkillFirerHero.HeroTra.position;//技能中心,-->palyerPos+forward+lengthVector3 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);}}}
}/// <summary>
/// 矩形攻击
/// </summary>
public class CubeSkill:Skill
{public override void TakeDamage(){//拿到玩家坐标Vector3 playerPos = SkillFirerHero.HeroTra.position;//技能中心,-->palyerPos+forward+lengthVector3 skillCenter = playerPos + SkillFirerHero.HeroTra.forward * SkillParameters[0];for (int i = 0; i < attackTarget.Length; i++){//计算目标与技能中心的距离Vector3 dir = attackTarget[i].HeroTra.position - skillCenter;//计算技能方向向量在横向right和纵向forward的投影向量Vector3 rightDir= Vector3.Project(dir, SkillFirerHero.HeroTra.right);Vector3 forwardDir = Vector3.Project(dir, SkillFirerHero.HeroTra.forward);//如果在矩形范围内,则收到伤害if(rightDir.magnitude<SkillParameters[1]/2&&forwardDir.magnitude<SkillParameters[2]/2){attackTarget[i].TakeDamage(Damage);}}}
}
/// <summary>
/// 扇形攻击
/// </summary>
public class SectorSkill:Skill
{public override void TakeDamage(){//拿到玩家坐标Vector3 playerPos = SkillFirerHero.HeroTra.position;//技能长度,-->palyerPos+forward+lengthVector3 skillCenter = playerPos + SkillFirerHero.HeroTra.forward * SkillParameters[0];for (int i = 0; i < attackTarget.Length; i++){//距离目标前方向量Vector3 forwardDir = skillCenter - playerPos;//目标与攻击者的方向向量Vector3 targetDir = attackTarget[i].HeroTra.position - playerPos;//目标与攻击者的距离float targetDis = Vector3.Distance(playerPos, attackTarget[i].HeroTra.position);float jiajiao = Mathf.Acos(Vector3.Dot(forwardDir.normalized, targetDir.normalized)) * Mathf.Rad2Deg;if(targetDis<=SkillParameters[0]){if(jiajiao<=SkillParameters[1]){attackTarget[i].TakeDamage(Damage);}}}}
}

7、使用协同程序测试程序

using System.Collections;
using UnityEngine;public class StrategyConsole : MonoBehaviour
{//先使用拖拽的方法,获取三个游戏对象的Transform组件public Transform ruiziTra;public Transform nameiTra;public Transform shangjinlierenTra;//采用协同程序测试private IEnumerator Start(){MyHero ruizi = new MyHero("瑞兹");ruizi.HeroHp = 1000;ruizi.HeroTra = ruiziTra;MyHero namei = new MyHero("娜美");namei.HeroHp = 1200;namei.HeroTra = nameiTra;MyHero shangjinlieren = new MyHero("赏金猎人");shangjinlieren.HeroHp = 1000;shangjinlieren.HeroTra = shangjinlierenTra;MyHero[] allHeros = new MyHero[] { ruizi, namei,shangjinlieren };//矩形技能Skill skill01 = new CubeSkill();skill01.Damage = 100;skill01.SkillParameters = new float[] { 5, 5, 3 };  //距离目标前方5米,长5米,宽3米skill01.attackTarget = allHeros;//园形技能Skill skill02 = new CircleSkill();skill02.Damage = 90;skill02.SkillParameters = new float[] { 5, 2};   //距离目标前方5米,半径为2米skill02.attackTarget = allHeros;//扇形技能Skill skill03 = new SectorSkill();skill03.Damage = 50;skill03.SkillParameters = new float[] { 5, 60 };   //与施法者距离5米,扇形夹角为60skill03.attackTarget = allHeros;ruizi.skill = skill01;namei.skill = skill02;shangjinlieren.skill = skill03;while(true){yield return 0;namei.FireSkill();ruizi.FireSkill();shangjinlieren.FireSkill();}}
}

8、在unity内看一下结果

ruizi为矩形块,namei为圆球,shangjinlieren为胶囊体

可以看出ruizi与娜美都在收到伤害,而伤害的范围就不在这里演示了,大家可以自己试试。

Unity不使用触发器,检测目标是否在圆形,矩形,扇形攻击范围内。相关推荐

  1. 【Unity】图形相交检测

    前言 图形相交检测常常用在伤害判定,使用自定义的图形相交检测,可以在一定程度上控制性能. 比如2D格斗游戏中使用的矩形包围盒(AABB),一些动作游戏中常常出现的扇形攻击. 2D的图形相交检测能够满足 ...

  2. ping 丢包 网络摄像头_利用Zabbix监控工具自动帮我们检测目标网络状况

    通过上一篇文章<IT人员必须要掌握的几个网络测试命令详解>的介绍,我们知道了可以使用"ping"命令检测到目标主机的联通性,可以使用"telnet" ...

  3. 如何在超大分辨率的图片中检测目标?

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 文章导读 本文通过一篇YOLT的文章引出超大分辨率的图片遇到目标检 ...

  4. 检测到目标URL存在http host头攻击漏洞

    一.前言 漏洞描述:为了方便的获得网站域名,开发人员一般依赖于HTTP Host header.例如,在php里用_SERVER["HTTP_HOST"].但是这个header是不 ...

  5. 对象检测目标小用什么模型好_[目标检测] YOLO4论文中文版

    点击上方 蓝字 关注我呀! [目标检测] YOLO4论文中文版 文章目录 YOLO4论文中文版 摘要 1.介绍 2.相关工作 2.1.目标检测模型 2.2.Bag of freebies 2.3.Ba ...

  6. 单片机检测stc没反应_stc单片机无法烧录,一直正在检测目标单片机怎么办?

    点击上方「电子菌」关注我们 tc89c52rc,串口芯片ch340g,驱动安好了,可以正确识别串口.板子是自己画的,原理图如下 因为安上两个芯片之后,电压从3.3伏拉到了3.1伏,我担心供电不够(而且 ...

  7. yolo 负样本_SSD——样本正负比控制+多尺度检测 (目标检测)(one-stage)(深度学习)(ECCV 2016)...

    SSD--样本正负比控制+多尺度检测 (目标检测)(one-stage)(深度学习)(ECCV 2016) 发布时间:2018-11-23 20:57, 浏览次数:1399 , 标签: SSD one ...

  8. c51单片机烧录程序 控制台显示正在检测目标单片机

    问题 c51单片机烧录程序 控制台显示正在检测目标单片机 详细问题 笔者使用单片机型号STC89C52, 进行程序烧录.控制台显示正在检测目标单片机 解决方案 将单片机型号由STC89C52更改为ST ...

  9. usb转ttl 一直显示正在检测目标单片机 ...的解决方法

    usb转ttl 一直显示正在检测目标单片机 -的解决方法 芯片:STC51F204EA 接口PCB:(5个接口) 连线: 解决方法: 1.单片机电源需要接USB的5V接口 2.最低波特率调到1200, ...

最新文章

  1. CentOS内核编译
  2. 双继承_在Python中使用双下划线防止类属性被覆盖!
  3. 到底绿茶能不能减肥瘦小肚子? - 生活至上,美容至尚!
  4. 听说你的模型训练耗时太长?来昇腾开发者沙龙找解决方案
  5. 腾讯说:云上移动开发很简单(这不是P的)!
  6. TempDB 中表变量和局部临时表的对比
  7. 神经结构化学习 4 图像分类的对抗性学习Adversarial learning for image classification
  8. db4o java_DB4O 社区版 8.1.3 发布,面向对象数据库
  9. Matlab绘制散点密度图
  10. 网狐6603服务器文档,【整理发布】网狐 6603 棋牌平台搭建图文详解(二)
  11. 酒店预订系统web端Android端,基于WEB的酒店客房预订系统的设计与实现
  12. c#的chart标题_C#之Chart篇
  13. 反转一个英语句子c++
  14. ❤️Java17 发布了,YYDS!重磅!Oracle 宣布 JDK 17 可以免费商用了。。
  15. 专业Java报表工具Stimulsoft Reports.Java常见问题解答
  16. 《如何优化项目一》:页面缓存优化
  17. 计算机上配置静态ip,如何给电脑设置固定IP地址
  18. 评价RA滑膜炎的综合评分系统的计量学特点: 来自一项随机、前瞻、多中心研究的结果...
  19. 算法:字符串全部子序列、子串、全排列
  20. Alpine基础用法

热门文章

  1. 链式前向星与邻接表对比
  2. 经直肠前列腺穿刺活检靶向MRI可见病变的3D超声引导系统的开发和验证
  3. pic单片机解惑篇,6个pic单片机问题解疑(上)
  4. Vulkan_Ray Tracing 13_Callable Shader
  5. winform 以光标指向点为中心 通过鼠标滚轮对图片进行缩放
  6. SWT Designer下载与安装
  7. 【无标题】实用新型专利交底书
  8. 【校招VIP】应届生也被裁!如何在校招中站稳脚跟?
  9. 世界杯 | 中国首次承建世界杯主赛场,基建狂魔用BIM征服世界杯
  10. 介绍一些Emacs功能强大的函数