OverlapBox的绘制问题

我们发现Gizmos没有直接绘制OverlapBox的API,所以只能借助DrawLine来间接绘制OverlapBox,所以首先我们需要计算出Box四个顶点的坐标公式。

转换为如下问题:

已知有一个矩形ABCD,A为矩形的左上顶点,C为矩形的右下顶点,宽为w,高为h,矩形中心点O坐标为(a,b),∠α是OA与X轴负方向的夹角,矩形有一个外接圆,现使得矩形按中心进行顺时针或逆时针旋转θ角度,规定-π <= θ <= π,求旋转过后矩形四个顶点A1,B1,C1,D1的坐标分别是多少?

求解过程如下:

代码示例(C#)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class BoxTrigger : MonoBehaviour
{[Header("必要组件")][Tooltip("触发器检测层")][SerializeField] private LayerMask cTriggerLayer;public LayerMask triggerLayer { get => cTriggerLayer; set => cTriggerLayer = value; }[Tooltip("触发器检测区域的中心坐标组件")][SerializeField] private Transform cTriggerArea;public Transform triggerArea { get => cTriggerArea; set => cTriggerArea = value; }[Header("必要属性")][Tooltip("触发器的宽度和高度")][SerializeField] private Vector2 mSize;[Tooltip("触发器的角度")][Range(-180f, 180f)][SerializeField] private float mAngle;[Tooltip("触发器绘制颜色")][SerializeField] private DrawColor mColor;public Vector2 center { get => cTriggerArea.position; }public Vector2 size { get => mSize; set => mSize = value; }public float angle { get => mAngle; set { if (value >= -180f && value <= 180f) mAngle = value; } }//Trigger_check用于检测主角是否进入触发区域private bool trigger_check { get; set; }private Vector2 mLU;private Vector2 mRU;private Vector2 mRD;private Vector2 mLD;private Color currentColor;private float mSin;private float mCos;private float mWidth;private float mHeight;private const float mC = 1f / 2;void Start(){if (!cTriggerArea) cTriggerArea = transform;}void Update(){}//触发检测public bool TriggerCheck(){//检测是否进入了触发区域if (!Physics2D.OverlapBox(center, mSize, mAngle, cTriggerLayer))trigger_check = false;elsetrigger_check = true;return trigger_check;}//角度转换为弧度private void AngleConversion(){float v_angle = mAngle * Mathf.PI / 180;mSin = Mathf.Sin(v_angle);mCos = Mathf.Cos(v_angle);}//坐标更新private void UpdatePosition(){mWidth = mSize.x;mHeight = mSize.y;float x_Lu = (-mC * (mWidth * mCos + mHeight * mSin)) + center.x;float y_Lu = (mC * (mHeight * mCos - mWidth * mSin)) + center.y;float x_Ru = (mC * (mWidth * mCos - mHeight * mSin)) + center.x;float y_Ru = (mC * (mWidth * mSin + mHeight * mCos)) + center.y;float x_Rd = (mC * (mWidth * mCos + mHeight * mSin)) + center.x;float y_Rd = (mC * (mWidth * mSin - mHeight * mCos)) + center.y;float x_Ld = (mC * (mHeight * mSin - mWidth * mCos)) + center.x;float y_Ld = (-mC * (mHeight * mCos + mWidth * mSin)) + center.y;mLU = new Vector2(x_Lu, y_Lu);mRU = new Vector2(x_Ru, y_Ru);mRD = new Vector2(x_Rd, y_Rd);mLD = new Vector2(x_Ld, y_Ld);}//颜色替换private void UpdateColor(){switch (mColor){case DrawColor.Red:currentColor = Color.red;break;case DrawColor.Blue:currentColor = Color.blue;break;case DrawColor.Green:currentColor = Color.green;break;case DrawColor.White:currentColor = Color.white;break;case DrawColor.Yellow:currentColor = Color.yellow;break;case DrawColor.Cyan:currentColor = Color.cyan;break;case DrawColor.Gray:currentColor = Color.gray;break;case DrawColor.Grey:currentColor = Color.grey;break;case DrawColor.Magenta:currentColor = Color.magenta;break;default:currentColor = Color.red;break;}}//Gizmos绘制private void OnDrawGizmos(){AngleConversion();UpdatePosition();UpdateColor();Gizmos.color = currentColor;Gizmos.DrawLine(mLU, mRU);Gizmos.DrawLine(mRU, mRD);Gizmos.DrawLine(mRD, mLD);Gizmos.DrawLine(mLD, mLU);}
}

如果这篇文章对你有帮助,请给作者点个赞吧!

Unity中通过Gizmos绘制OverlapBox相关推荐

  1. unity中辅助类Gizmos说明

    unity中有一个划线的辅助类,很多插件中都有看到,在某些时候还是比较有用的.这里实际上手测试一波. 脚本如下: using System.Collections; using System.Coll ...

  2. Unity中利用LineRenderer绘制寻路路径

    基于A*的寻路路径点生成,这里只做之后的显示以及曲线平滑 这里主要是Catmull-Rom的应用,最终选用的是Centripetal Catmull–Rom spline 起初想要通过贝塞尔曲线去平滑 ...

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

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

  4. 在Unity中实现,使用笔刷绘制多边形

    在Unity中实现,使用笔刷绘制多边形 1. 啰嗦前言 2. 实现 1. 啰嗦前言 做毕设其中需要一个功能就是使用笔刷在地图刷绘制出河流之类的东西.如果只是绘制贴图或者顶点颜色,得到一张图片还是不难实 ...

  5. Unity Gizmos 绘制 Camera 的 视口、视锥和 FOV

    Unity Gizmos 绘制 Camera 的 视口.视锥和 FOV 一.目的 由于开发需要,需要绘制出Camera 的 视口.视锥和 FOV 以便于观察游戏物体与camera之间的一些关系,以利于 ...

  6. 在Unity中绘制贝塞尔(Bezier)曲线

    在Unity中绘制贝塞尔(Bezier)曲线 1 效果 2 公式 3 绘制曲线 4 编辑器扩展 作业有道题,让算出三个贝塞尔曲线的点,并画出草图.其实题目本身没有什么难度,就是带进去算一下就能出来了. ...

  7. 在Unity中使用四叉树算法绘制地形

    四叉树算法在游戏中获得了广泛的应用,前几年3D引擎实现的地形绘制大部分都是用四叉树生成的,因为移动端在硬件方面的限制,我们的地形使用的是美术自己制作的地形,对于程序来说省去了不少工作量,但是作为程序开 ...

  8. 【Unity3D日常开发】Unity中的资源加载与文件路径

    推荐阅读 CSDN主页 GitHub开源地址 Unity3D插件分享 简书地址 我的个人博客 QQ群:1040082875 大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有 ...

  9. Unity中在Game窗口画线

    在Unity中画线有几种方式: Debug.DrawLine()  函数画线,在Game窗口不开启 Gizmos 时,只在Scene窗口显示,多用于调试. 通过  LineRenderer  来画线, ...

最新文章

  1. ios中图片不显示的问题
  2. 联想笔记本Win10 F1-F12失效的解决方法
  3. HDOJ--4821--String【弦hash】
  4. Java语言程序设计实验指导_《java语言程序设计》上机实验指导手册(4).doc
  5. 密织“地网” 南充“试水”智慧安防
  6. 跳出当前_活在当下,跳出当下
  7. [数据结构-严蔚敏版]P64循环队列-队列的顺序存储结构
  8. sql查询条件为空的另类写法o( ̄▽ ̄)d
  9. java----EL表达式
  10. db2数据库基础知识
  11. echarts中国地图,设置地图外边框,内各省界线不同样式
  12. R语言进行系统聚类分析并作图(数据来源国家统计局)
  13. Windows_5种方法解除Windows密码
  14. 卷积神经网络之OverFeat(2014)
  15. HBase shell删除表失败:ERROR: Table user is enabled. Disable it first.
  16. 如何使用QT实现左右滑动的按钮
  17. 一位程序员工作10年总结的10条建议
  18. angular使用jqwidgets注意事项
  19. 三级分销如何做分销推广 如何设置分销比例
  20. 【问题记录】更换域名的DNS时,浏览器许久不生效。

热门文章

  1. XiyouLinuxgroup 2015 2017 2018面试题
  2. 2021年工具钳工(中级)考试内容及工具钳工(中级)模拟试题
  3. EMCP/DDR中专业词汇(rank、bank、die、channel)的解析!
  4. 组态王通过串口服务器通讯smart200_串口虚拟化 | 串口服务器Nport 5630 设置
  5. Java 平台无关性的问题
  6. ui设计培训课程包含哪些
  7. android 精简列表 指纹,小米 小米8屏下指纹(安卓9.0)获取Root权限服务含精简系统方案...
  8. 零基础小白如何练习文案能力
  9. HTML画正方形钟表,html画圆形时钟
  10. 曾轶可%20最天使吉他谱+最春哥歌词,顶啊!