using UnityEditor;
using UnityEngine;public class DrawSector : MonoBehaviour
{//扇形角度public float angle = 80f;//扇形半径public float radius = 3.5f;//物体Bpublic Transform b;private bool flag;private void Update(){flag = IsInRange(angle, radius, transform, b);}/// <summary>/// 判断target是否在扇形区域内/// </summary>/// <param name="sectorAngle">扇形角度</param>/// <param name="sectorRadius">扇形半径</param>/// <param name="attacker">攻击者的transform信息</param>/// <param name="target">目标</param>/// <returns>目标target在扇形区域内返回true 否则返回false</returns>public bool IsInRange(float sectorAngle, float sectorRadius, Transform attacker, Transform target){//攻击者位置指向目标位置的向量Vector3 direction = target.position - attacker.position;//点乘积结果float dot = Vector3.Dot(direction.normalized, transform.forward);//反余弦计算角度float offsetAngle = Mathf.Acos(dot) * Mathf.Rad2Deg;return offsetAngle < sectorAngle * .5f && direction.magnitude < sectorRadius;}private void OnDrawGizmos(){Handles.color = flag ? Color.red : Color.cyan;float x = radius * Mathf.Sin(angle / 2f * Mathf.Deg2Rad);float y = Mathf.Sqrt(Mathf.Pow(radius, 2f) - Mathf.Pow(x, 2f));Vector3 a = new Vector3(transform.position.x - x, 0f, transform.position.z + y);Vector3 b = new Vector3(transform.position.x + x, 0f, transform.position.z + y);Handles.DrawLine(transform.position, a);Handles.DrawLine(transform.position, b);float half = angle / 2;for (int i = 0; i < half; i++){x = radius * Mathf.Sin((half - i) * Mathf.Deg2Rad);y = Mathf.Sqrt(Mathf.Pow(radius, 2f) - Mathf.Pow(x, 2f));a = new Vector3(transform.position.x - x, 0f, transform.position.z + y);x = radius * Mathf.Sin((half - i - 1) * Mathf.Deg2Rad);y = Mathf.Sqrt(Mathf.Pow(radius, 2f) - Mathf.Pow(x, 2f));b = new Vector3(transform.position.x - x, 0f, transform.position.z + y);Handles.DrawLine(a, b);}for (int i = 0; i < half; i++){x = radius * Mathf.Sin((half - i) * Mathf.Deg2Rad);y = Mathf.Sqrt(Mathf.Pow(radius, 2f) - Mathf.Pow(x, 2f));a = new Vector3(transform.position.x + x, 0f, transform.position.z + y);x = radius * Mathf.Sin((half - i - 1) * Mathf.Deg2Rad);y = Mathf.Sqrt(Mathf.Pow(radius, 2f) - Mathf.Pow(x, 2f));b = new Vector3(transform.position.x + x, 0f, transform.position.z + y);Handles.DrawLine(a, b);}}
}

OnDrawGizmos()是c#自带重载的一个方法属于Editor类型可以不加以运行便能进行显示绘制图形,如上述的Gif动图的扇形图形。它就是通过此代码生成的而最开始的Handles里的Bool值的一个方法是改变颜色用的,如果检测范围内有敌人的话则边框变为红色,平时为默认浅蓝色模样,而这一现象需要运行Unity才能看到效果因为在上面的IsInRange()方法内是判断是否在这个扇形范围内的方法,需要挂在Update()里实时检测。因为这个Update()是继承MonoBehaviour需要运行才能看到效果,而我在上面定义的Transform b 则是敌人的预制体我这边定义的是死的方便更直观的看到效果。

【创造者】(DrawLine)绘制扇形检测范围敌人相关推荐

  1. [Unity]利用Mesh在Unity中绘制扇形图片

    背景 最近碰到个功能, 要画一个扇形图案, 如下图: 美术原图: 需求是这个图形跟随角色, 在角色背后, 并且每个角色的扇形角度可能不同. So, NGUI和UGUI很好用的FilledType是用不 ...

  2. 绘制扇形的多种方式,包括border-radius、clip裁剪显示、canvas原点变换等方式的详细理解及demo

    对clip的理解: clip是对使用了该样式的元素进行裁剪显示.使用方法是rect (top, right, bottom, left) 其中参数top代表显示的区域上边界离该元素顶部border-t ...

  3. php扇形分布图,使用php绘制扇形分布图

    首先创建一个表单提交的页面,并且使用session会话的方式,将表单提交的值保存到session会话中,表单页面的代码我就不写了,获取到值以后对数据进行处理,然后绘制成图: 具体绘制与数据处理代码: ...

  4. flash as3_vinson_01:绘制扇形

    遇见一个绘制用户信息统计的扇形图项目,找到我晏哥留的一个方法,贴在这儿备用: /*** 绘制扇形* @param mc 承载扇形的对象* @param x 圆心角x* @param y 圆心角y* @ ...

  5. 用canvas画布绘制扇形和弧线

    <title>用canvas画布绘制扇形和弧线</title> <style> .box{ width: 600px; margin: 0 auto; } < ...

  6. android编程绘制扇形,分析实现Android自定义View之扇形图

    继承View基类,画了这样的扇形图 粗糙的样子^_^ 直接来步骤吧 1.分析 自定义View需要认真的分析下,里面还是会用到一些数学知识 首先是扇形该怎么表现 1. 扇形的外观是个圆弧,而且是围绕一个 ...

  7. [Unity][UGUI]绘制扇形图形

    绘制扇形图形 的资料 参考资料 1,2 都比较完整 想到一种 使用 UGUI 创建 扇形 的方法 相关资料: 1. [Unity&特效]怎么画圆范围circle range技能指示器skill ...

  8. vue + canvas绘制扇形圆盘

    vue + canvas绘制扇形圆盘 html: <canvas style="position: fixed;z-index:-1" width="545&quo ...

  9. Canvas之使用弧度绘制扇形图

    一.体现曲线的绘制 首先需要明白角度和弧度的关系: 一个角度等于π/180个弧度 1. 根据点动成线的概念绘制圆弧(利用函数) 比如: y = x/2 y = (x + 2) ^2 y = sin(x ...

最新文章

  1. msteel能计算钢结构楼梯吗_坚持爬楼梯能减肥吗 怎么爬楼梯可以减肥
  2. 一文看懂BCH减半时间计算及减半影响
  3. ubuntu mysql配置教程视频_ubuntu16.04安装配置mysql数据库,分割视频为帧图像
  4. jQuery单选按钮监听事件
  5. hdu5391 Zball in Tina Town
  6. url映射 ccf (Java正则表达式80分解法)
  7. Java中的延迟分配
  8. ps去水印教程_ps去水印教程,详细解析五种去水印的方法
  9. python minimize_【趣味案例】用Python来做一个屏幕录制工具
  10. 在ASP.NET中使用FCKeditor V2
  11. mysql4语法_4 MySQL 语法技巧
  12. Eclipse创建JSP程序
  13. 鸿蒙系统桌面首页怎么修改,如何设置才能恢复Win7/8/10系统被修改的默认主页
  14. ccleaner激活后又要注册_ccleaner如何激活? ccleaner注册激活图文步骤
  15. 二维特征分类的基础_用特征提取技术降低数据集维度,你学会了吗?
  16. 为Windows 7的winsxs文件夹瘦身,慎重。
  17. python绘制图形沙漏_论计时沙漏对于学习python的重要性
  18. STM32F103ZE单片机FSMC接口读取NAND Flash芯片K9F1G08U0E的数据时出现数据丢失的解决办法
  19. BC20/BC26-opencpu移植cjson,mqtt等注意事项
  20. Hbase葱岭探秘--JavaApi实践

热门文章

  1. Voronoi图 | 泰森多边形
  2. 弹簧床垫怎么选?软硬度、透气性皆优异的弹簧床垫更舒适!
  3. windows api获取主板序列号
  4. 线上VR看房是什么体验,vr看房有哪些优势?
  5. 计算机职业编个谜语,职业编成谜语
  6. U盘(优盘)数据恢复
  7. 欧姆龙CP1H移位指令使用
  8. CVPR2021 | 视觉推理解释框架VRX:用结构化视觉概念作为解释网络推理逻辑的「语言」
  9. c语言 goto 语句
  10. oracle oci.dll无法加载_基于OGG 实现Oracle到Kafka增量数据实时同步