Unity3d 使用Gizmos画一个圆圈

2022-07-23,,

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

运行一下看一下效果:

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

《Unity3d 使用Gizmos画一个圆圈.doc》

下载本文的Word格式文档,以方便收藏与打印。