Bootstrap

Unity中如何绘制几何图形

在 Unity 中,并未提供可以直接绘制几何图形的组件,绘制几何图形(如线段、圆形、矩形等)可以通过几种不同的方法来实现。常见的绘制方法包括使用 GizmosLineRenderer 或 Mesh。下面是几种常见的绘制几何图形的方法。

1. 使用 Gizmos 绘制几何图形

Gizmos 是 Unity 用来在编辑器中绘制调试图形的工具,可以用来显示场景中的各种图形,通常用于编辑模式下的可视化。

示例:绘制一个矩形和圆形
using UnityEngine;

public class DrawShapes : MonoBehaviour
{
    // 绘制一个矩形
    void OnDrawGizmos()
    {
        // 绘制矩形
        Gizmos.color = Color.green;
        Vector3 topLeft = new Vector3(-2, 0, 2);
        Vector3 topRight = new Vector3(2, 0, 2);
        Vector3 bottomLeft = new Vector3(-2, 0, -2);
        Vector3 bottomRight = new Vector3(2, 0, -2);

        Gizmos.DrawLine(topLeft, topRight);
        Gizmos.DrawLine(topRight, bottomRight);
        Gizmos.DrawLine(bottomRight, bottomLeft);
        Gizmos.DrawLine(bottomLeft, topLeft);

        // 绘制圆形
        Gizmos.color = Color.blue;
        DrawCircle(new Vector3(0, 0, 0), 2f, 20); // 在原点绘制半径为2的圆形,分成20段
    }

    // 绘制圆形函数
    void DrawCircle(Vector3 center, float radius, int segments)
    {
        float angleStep = 360f / segments;
        Vector3 previousPoint = center + Vector3.forward * radius;

        for (int i = 1; i <= segments; i++)
        {
            float angle = angleStep * i;
            Vector3 newPoint = center + new Vector3(Mathf.Cos(angle * Mathf.Deg2Rad) * radius, 0, Mathf.Sin(angle * Mathf.Deg2Rad) * radius);
            Gizmos.DrawLine(previousPoint, newPoint);
            previousPoint = newPoint;
        }
    }
}

解释:

  • OnDrawGizmos() 是 Unity 的一个特殊方法,用来在编辑器模式下绘制图形。

  • Gizmos.DrawLine() 绘制线段,连接给定的两个点。

  • DrawCircle() 函数绘制了一个圆形,分成多个小段进行逼近。

2. 使用 LineRenderer 绘制几何图形

LineRenderer 组件通常用于绘制动态的线条或路径,非常适合做路径、激光等效果。它在运行时绘制,可以非常方便地在游戏中表现图形。

示例:使用 LineRenderer 绘制一个圆形
using UnityEngine;

public class LineRendererCircle : MonoBehaviour
{
    public float radius = 2f;      // 圆的半径
    public int segments = 50;      // 圆的细分段数
    private LineRenderer line;     // LineRenderer 组件

    void Start()
    {
        // 获取 LineRenderer 组件
        line = gameObject.AddComponent<LineRenderer>();

        // 设置 LineRenderer 的属性
        line.positionCount = segments + 1;
        line.loop = true;  // 设置为闭环
        line.startWidth = 0.1f;
        line.endWidth = 0.1f;
        line.startColor = Color.red;
        line.endColor = Color.red;

        // 绘制圆形
        DrawCircle();
    }

    // 绘制圆形
    void DrawCircle()
    {
        for (int i = 0; i <= segments; i++)
        {
            float angle = i * Mathf.PI * 2 / segments;
            Vector3 position = new Vector3(Mathf.Cos(angle) * radius, 0, Mathf.Sin(angle) * radius);
            line.SetPosition(i, position);
        }
    }
}

解释:

  • LineRenderer 是一个用于绘制动态线段的组件。

  • 通过设置 LineRenderer.positionCount,可以控制要绘制的线段数量。

  • 通过 line.SetPosition() 方法可以为每个点设置位置,从而绘制几何图形。

  • line.loop = true 使得线条回到起始点,形成一个闭环。

3. 使用 Mesh 绘制几何图形

如果你需要绘制更复杂的几何图形(如立方体、球体等),可以使用 Mesh 来动态创建和渲染几何图形。Unity 提供了 Mesh 类来手动创建几何图形,并将其显示为物体。

示例:绘制一个矩形(四边形)Mesh
using UnityEngine;

public class MeshQuad : MonoBehaviour
{
    void Start()
    {
        CreateQuad();
    }

    void CreateQuad()
    {
        Mesh mesh = new Mesh();

        // 顶点坐标
        Vector3[] vertices = new Vector3[4]
        {
            new Vector3(-1, 0, 1), // 左上角
            new Vector3(1, 0, 1),  // 右上角
            new Vector3(1, 0, -1), // 右下角
            new Vector3(-1, 0, -1) // 左下角
        };

        // 三角形索引(两个三角形)
        int[] triangles = new int[6]
        {
            0, 2, 1, // 第一个三角形
            0, 3, 2  // 第二个三角形
        };

        // 给 Mesh 赋值
        mesh.vertices = vertices;
        mesh.triangles = triangles;

        // 为物体添加 MeshFilter 和 MeshRenderer
        MeshFilter meshFilter = gameObject.AddComponent<MeshFilter>();
        meshFilter.mesh = mesh;
        MeshRenderer meshRenderer = gameObject.AddComponent<MeshRenderer>();
        meshRenderer.material = new Material(Shader.Find("Standard"));
    }
}

解释:

  • 使用 Mesh 类创建顶点和三角形索引,从而动态生成一个几何形状。

  • MeshFilter 用来显示生成的 Mesh,MeshRenderer 负责渲染。

  • 本例绘制了一个简单的矩形(四边形),通过设置顶点和三角形索引。

4. 使用 GUI 绘制几何图形

如果你想在屏幕上绘制简单的 UI 图形(例如矩形、圆形等),可以使用 Unity 的 GUI 系统(GUI 类或者 UI 系统)。

示例:使用 GUI 绘制矩形和圆形(在屏幕上绘制)
using UnityEngine;

public class UIDrawShapes : MonoBehaviour
{
    void OnGUI()
    {
        // 绘制矩形
        GUI.color = Color.green;
        GUI.Box(new Rect(50, 50, 200, 100), "This is a box");

        // 绘制圆形
        DrawCircle(new Rect(300, 50, 100, 100), Color.blue);
    }

    void DrawCircle(Rect position, Color color)
    {
        GUI.color = color;
        float radius = position.width / 2;
        Vector2 center = new Vector2(position.x + radius, position.y + radius);
        for (float angle = 0; angle < 360; angle += 1f)
        {
            float rad = angle * Mathf.Deg2Rad;
            float x = center.x + Mathf.Cos(rad) * radius;
            float y = center.y + Mathf.Sin(rad) * radius;
            GUI.DrawTexture(new Rect(x - 1, y - 1, 2, 2), Texture2D.whiteTexture);
        }
    }
}

解释:

  • 使用 GUI.Box() 绘制矩形。

  • 使用 GUI.DrawTexture() 绘制圆形的每个小点。


总结

  • Gizmos:适合在编辑模式下可视化几何图形,常用于调试和编辑器模式下。

  • LineRenderer:用于绘制动态路径或连续线条,可以在运行时更新路径。

  • Mesh:适合绘制复杂的几何图形,创建可渲染的模型(如矩形、圆形、立方体等)。

  • GUI:适合在屏幕上绘制 UI 图形,通常用于显示简单的 UI 元素。

以上为本人开发中常用画图方法的介绍

如有问题欢迎指正交流

公众号:Altma

;