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()
    {
    }
}

运行一下看一下效果:

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。如有错误或未考虑完全的地方,望不吝赐教。

(0)

相关推荐

  • Unity3D 单例模式和静态类的使用详解

    Unity3D的API提供了很多的功能,但是很多流程还是会自己去封装一下去.当然现在网上也有很多的框架可以去下载使用,但是肯定不会比自己写的用起来顺手. 对于是否需要使用框架的问题上,本人是持肯定态度的,把一些常用方法进行封装,做成一个功能性的框架,可以很大程度上提高代码的效率,维护也方便. 对于网络上很多教程上使用的"游戏通用MVC框架",现在看来并不符合MVC这种结构性框架的设计思想:要知道,MVC最初是被设计为Web应用的框架,而游戏中的很多事件并不是通过用户点击UI发生的,Vi

  • Unity3D启动外部程序并传递参数的实现

    之前开发项目,一直都使用的是外壳程序加子程序的模式,通过外壳程序去启动子程序,外壳程序和子程序之间的通信,是使用配置文件完成的. 我总觉得这样通信很麻烦,因为外壳程序需要对配置文件进行更改和写入,然后子程序又要读取信息.而且整合的时候,会导致有很多配置文件,而且需要对路径做很多处理和限制. 我发现Process.Start()函数中,是可以传递参数的. 也就是说,我们是可以在使用Process.Start()函数启动外部程序时,传递参数的进行通信的. 具体操作如下: public void St

  • Unity3D运行报DllNotFoundException错误的解决方案

    起因 unity程序build到pc上,拿到其他人的机器上结果有些功能不正常,看log里面大概是 Fallback handler could not load library: xxx.dll DllNotFoundException: xxx.dll 初看以为是缺失dll,但是实际上并不是这样,首先在很多人机器上都是没有问题的,只在极少数机器上才出现异常,另外报错的dll都是有的,并不存在缺失的问题. 后来网上搜了一下,看到http://answers.unity3d.com/questio

  • Unity3D实现模型随机切割

    本文实例为大家分享了Unity3D实现模型随机切割的具体代码,供大家参考,具体内容如下 模型切割的效果图如下: 我们都知道,模型是由一个个小三角形面组成的,因此我们不妨将问题简化,先实现个小目标,完成单个三角形的切割,甚至继续细分成求一条线段与某个平面的交点. 三角形与切割平面的位置关系主要有以下三种: 1. 三角形与切割平面有两个交点,一个交点在顶点上,一个交点在边上.这时,原有的三角形将被分成两个三角形,分别为013.042. 2. 三角形与切割平面有两个交点,两个交点都在边上.这时,原有的

  • Unity3D 计时器的实现代码(三种写法总结)

    1.每帧检查 定义一个时间变量 timer,每帧将此时间减去帧间隔时间 Time.deltaTime,如果小于或者等于零,说明定时器到了,执行相应功能代码,将此定时器重置,代码如下: public float timer = 1.0f; // Update is called once per frame void Update() { timer -= Time.deltaTime; if (timer <= 0) { Debug.Log(string.Format("Timer1 is

  • Unity3D UI Text得分数字增加的实例代码

    Unity3D UGUI Text得分数字增加 代码 一.首先在Hierarchy中创建Text,并绑定脚本. using UnityEngine; using System.Collections; using UnityEngine.UI; **//导入资源库** public class Score : MonoBehaviour { public static Text txt; **//定义静态变量名以用于其他脚本内的引用** public static float x = 0; vo

  • Unity3d 如何更改Button的背景色

    我就废话不多说了,大家还是直接看代码吧~ using UnityEngine; using System.Collections; public class ButtonStyle : MonoBehaviour { public Color _color;//在编辑环境下选择背景色,透明度不能为0 public Texture2D tex; void OnGUI(){GUI.Button(new Rect(0,0,100,100),"tex");Color oldColor = GU

  • Unity3d使用FairyGUI 自定义字体的操作

    最近ui同学使用了一种新字体(锐字锐线怒放黑简) 发现全部切成图片字体 吓死我了 unity3d和fairygui搭配使用字体过程 1.第一步肯定是找美术同学拿他们找来的字体 由于fairygui编辑器用的字体是访问操作系统的字体 所以拿到新字体直接双击安装吧(或者放入操作系统盘内的Windows/Fonts)如下图 2.在fairygui里加个文本 选择字体 就能找到我们添加的字体了 3.接着把字体拷贝到unity3d工程下 存放在Resource\Font(没有可以自己建文件夹)注意这边命名

  • Unity3d 使用Gizmos画一个圆圈

    Gizmos是场景视图里的一个可视化调试工具. 在做项目过程中.我们常常会用到它,比如:绘制一条射线等. Unity3D 4.2版本号截至.眼下仅仅提供了绘制射线,线段,网格球体,实体球体,网格立方体,实体立方体,图标.GUI纹理,以及摄像机线框. 假设须要绘制一个圆环还须要自己写代码 using UnityEngine; using System; public class HeGizmosCircle : MonoBehaviour { public Transform m_Transfor

  • Python使用matplotlib实现在坐标系中画一个矩形的方法

    本文实例讲述了Python使用matplotlib实现在坐标系中画一个矩形的方法.分享给大家供大家参考.具体实现方法如下: import matplotlib.pyplot as plt from matplotlib.patches import Rectangle class Annotate(object): def __init__(self): self.ax = plt.gca() self.rect = Rectangle((0,0), 1, 1) self.x0 = None s

  • 如何用C语言画一个“圣诞树”

    如何用C语言画一个"圣诞树",我使用了左右镜像的Sierpinski triangle,每层减去上方一小块,再用符号点缀.可生成不同层数的「圣诞树」,如下图是5层的结果 #include <stdlib.h> int main(int argc, char* argv[]) { int n = argc > 1 ? atoi(argv[1]) : 4; for (int j = 1; j <= n; j++) { int s = 1 << j, k

  • vue+vuex+axios+echarts画一个动态更新的中国地图的方法

    本文介绍了vue+vuex+axios+echarts画一个动态更新的中国地图的方法,分享给大家,具体如下: 一. 生成项目及安装插件 # 安装vue-cli npm install vue-cli -g # 初始化项目 vue init webpack china-map # 切到目录下 cd china-map # 安装项目依赖 npm install # 安装 vuex npm install vuex --save # 安装 axios npm install axios --save

  • python turtle库画一个方格和圆实例

    使用python的turtle库画一个方格和圆 打开python编译器,导入turtle库 from turtle import * 首先画一个距离为100的横线 forward(100) 顺时针旋转90度,前进100 在通过两次的旋转和平移得到方格,使用for循环重复两次 抬起笔,直接到方格的中间,也就是(50,0)坐标 penup() goto(50,0) 开始画半径为50的圆,放下笔 pendown() circle(50) 在圆的中心画个圆心点 goto(50,50) dot() 最后隐

  • python 图像处理画一个正弦函数代码实例

    这篇文章主要介绍了python 图像处理画一个正弦函数代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 import numpy as np from PIL import Image import matplotlib.pyplot as plt import math size = 300 new_im = Image.new("RGBA",(size,size)) #创建一个空的图片 a_img = np.array(ne

  • 用Python画一个LinkinPark的logo代码实例

    这篇文章主要介绍了用Python画一个LinkinPark的logo代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 代码如下 # -*- coding: UTF-8 -*- from turtle import * width(17) right(25) circle(150,200,20) left(65) forward(240) left(120) forward(195) left(120) forward(135) left(

  • 易语言在画板中画一个填充矩形的方法

    填充矩形方法 英文命令:FillRect 操作系统支持:Windows    所属对象:画板 将画板上指定的矩形区域用当前刷子填充. 语法:  无返回值  画板.填充矩形 (矩形左上角横坐标,矩形左上角纵坐标,矩形右下角横坐标,矩形右下角纵坐标) 例程 说明 通过"填充矩形"命令在画板中画一个填充矩形. 运行结果: 总结 以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对我们的支持.如果你想了解更多相关内容请查看下面相关链接

  • 易语言在画板中画一个指定样式圆角矩形的方法

    画圆角矩形方法 英文命令:RoundRect 操作系统支持:Windows    所属对象:画板 使用画笔在画板上画出一个圆角矩形,圆角矩形的内部使用刷子填充. 语法:  无返回值  画板.画圆角矩形 (矩形左上角横坐标,矩形左上角纵坐标,矩形右下角横坐标,矩形右下角纵坐标,圆角宽度,[圆角高度]) 例程 说明 通过"画圆角矩形"命令在画板中画一个指定样式的圆角矩形. 运行结果: 总结 以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对我

  • 使用Python实现画一个中国地图

    为什么是Python 先来聊聊为什么做数据分析一定要用Python或R语言.编程语言这么多种,Java, PHP都很成熟,但是为什么在最近热火的数据分析领域,很多人选择用Python语言? 数据分析只是一个需求,理论上来讲,任何语言都可以满足任何需求,只是麻烦与简易之别.Python这门语言诞生也相当之早,它的第一个版本是26年前发表的,曾经(或者说当前)也被用于web开发,但是就流行程度来说,远远干不过Java和PHP.东方不亮西方亮,在与Java干仗失败的这20几年时光里,Python练就了

随机推荐