在 Unity 中,并未提供可以直接绘制几何图形的组件,绘制几何图形(如线段、圆形、矩形等)可以通过几种不同的方法来实现。常见的绘制方法包括使用 Gizmos、LineRenderer 或 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