Unity3d 使用Gizmos画一个圆圈
作者:mfmdaoyou 发布时间:2022-05-22 05:10:52
标签:Unity3d,Gizmos,画圆
Gizmos是场景视图里的一个可视化调试工具。
在做项目过程中。我们常常会用到它,比如:绘制一条射线等。
Unity3D 4.2版本号截至。眼下仅仅提供了绘制射线,线段,网格球体,实体球体,网格立方体,实体立方体,图标。GUI纹理,以及摄像机线框。
假设须要绘制一个圆环还须要自己写代码
using UnityEngine;
using System;
public class HeGizmosCircle : MonoBehaviour
{
public Transform m_Transform;
public float m_Radius = 1; // 圆环的半径
public float m_Theta = 0.1f; // 值越低圆环越平滑
public Color m_Color = Color.green; // 线框颜色
void Start()
{
if (m_Transform == null)
{
throw new Exception("Transform is NULL.");
}
}
void OnDrawGizmos()
{
if (m_Transform == null) return;
if (m_Theta < 0.0001f) m_Theta = 0.0001f;
// 设置矩阵
Matrix4x4 defaultMatrix = Gizmos.matrix;
Gizmos.matrix = m_Transform.localToWorldMatrix;
// 设置颜色
Color defaultColor = Gizmos.color;
Gizmos.color = m_Color;
// 绘制圆环
Vector3 beginPoint = Vector3.zero;
Vector3 firstPoint = Vector3.zero;
for (float theta = 0; theta < 2 * Mathf.PI; theta += m_Theta)
{
float x = m_Radius * Mathf.Cos(theta);
float z = m_Radius * Mathf.Sin(theta);
Vector3 endPoint = new Vector3(x, 0, z);
if (theta == 0)
{
firstPoint = endPoint;
}
else
{
Gizmos.DrawLine(beginPoint, endPoint);
}
beginPoint = endPoint;
}
// 绘制最后一条线段
Gizmos.DrawLine(firstPoint, beginPoint);
// 恢复默认颜色
Gizmos.color = defaultColor;
// 恢复默认矩阵
Gizmos.matrix = defaultMatrix;
}
}
把代码拖到一个GameObject上,关联该GameObject的Transform,然后就能够在Scene视图窗体里显示一个圆了。
通过调整Transform的Position。Rotation。Scale,来调整圆的位置,旋转,缩放。
补充:基于Unity3D使用LineRender组件绘制圆线
在此记录一下使用Unity3D 的LineRender绘制线的过程,经过测试LineRender与OpenGL的GL_LINE_STRIP绘制方式一样,因此计算完点之后需要把起始点即为终点,多算一个点才算闭合。
代码如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class DrawLines: MonoBehaviour
{
public float m_radius = 1.0f;
public Material m_material;
public float m_lineWidth = 1.0f;
private List<Vector3> vPath = new List<Vector3>();
// Start is called before the first frame update
void Start()
{
int count = 60;
for (int i=1; i<= (count+1); i++)
{
if(i == (count+1))
{
float x = Mathf.Cos(2 * Mathf.PI / count) * m_radius;
float y = transform.localPosition.y;
float z = Mathf.Sin(2 * Mathf.PI / count) * m_radius;
vPath.Add(new Vector3(x, y, z));
}
else
{
float x = Mathf.Cos(2 * Mathf.PI / count * i) * m_radius;
float y = transform.localPosition.y;
float z = Mathf.Sin(2 * Mathf.PI / count * i) * m_radius;
vPath.Add(new Vector3(x, y, z));
}
}
GameObject lineGroup = new GameObject("LineGroup");
GameObject lineObject = new GameObject("RadarLine");
LineRenderer line = lineObject.AddComponent<LineRenderer>();
line.material = m_material;
line.useWorldSpace = false;
line.positionCount = vPath.Count;
line.startWidth = m_lineWidth;
line.endWidth = m_lineWidth;
line.SetPositions(vPath.ToArray());
}
// Update is called once per frame
void Update()
{
}
}
运行一下看一下效果:
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。如有错误或未考虑完全的地方,望不吝赐教。
来源:https://www.cnblogs.com/mfmdaoyou/p/7235990.html


猜你喜欢
- 两个小解释:FileProvider是ContentProvider特殊的子类,ContentProvider通过创建content://
- 本文实例为大家分享了C语言自定义扫雷游戏的具体代码,供大家参考,具体内容如下实现过程对于用C语言实现扫雷游戏得实现,可将游戏过程分为两个板块
- tjxCold(根据配置模板,快速生成controller,service,serviceimpl 代码) 为什么要开发这款插件市面上有很多
- public Bitmap CopyBitmap(Bitmap source){ int depth =
- 发送邮件的主程序 import java.util.Properties; import common.util.Ema
- 1.例如下面的代码片段,Toast类的第一个参数接受一个Context对象:@Override protected Dialog onCr
- 双重循环打印顶点在左上的直角三角形:public static void main(String[] args) { // TO
- 1、private实现封装处理如果像想要知道封装,首先必须清楚如果没有封装会怎么样?没有封装方法中的属性,在所有方法被调用后都可以进行无权限
- 1、SerialPortHelper「Android串口通信」介绍原项目地址https://github.com/freyskill/Ser
- 1.算法效率算法效率分析分为两种:第一种是时间效率,第二种是空间效率。时间效率被称为时间复杂度,而空间效率被称作空间复杂度。时间复杂度主要衡
- 前言相信大家在写前端脚本的时候经常会遇到发送数据到后台的情况,但是由于浏览器的限制,不同域名之间的数据是不能互相访问的,那前端怎么和后端如何
- Android WebView常见问题解决方案汇总:就目前而言,如何应对版本的频繁更新呢,又如何灵活多变地展示我们的界面呢,这又涉及到了we
- java 反射机制:测试实体类以Human为例/** * Project: Day12_for_lxy * Created: Lulu *
- 由于项目没有设计返回键,一旦进入别的应用,就无法回到桌面。只能通过串口输入input keyevent 4(返回键)来返回桌面,为了方便调试
- Android系统对所有的危险权限进行了分组,称为 权限组 。属于同一组的危险权限将自动合并授予,用户授予应用某个权限组的权限,则应用将获得
- Android TimePicker 直接输入的问题解决方案TimePicker 提供了上下的按钮,点击按钮,相关操作都是正常的。但是如果直
- 一、Shader基础知识1.1、什么是Shader在讲什么是Shader之前我们先看看下面两段代码 这两段代码实现的功能都是提取
- 先看看常规的隐藏状态栏的方法:方法一:@Overrideprotected void onCreate(Bundle savedInstan
- 一、数组与数组元素Java中数组是引用类型数组的元素可以是基本类型也可以是引用类型,弄清数组元素的类型可以帮助我们去理解数组元素默认初始化二
- Jetty和tomcat的比较Tomcat和Jetty都是一种Servlet引擎,他们都支持标准的servlet规范和JavaEE的规范。架