脚本具体内容如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class DrawRectangleSolid2D : MonoBehaviour {
public static GameObject go;
public static MeshFilter mf;
public static MeshRenderer mr;
public static Shader shader;
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
if(Input.GetKeyDown (KeyCode.A)) {
ToDrawRectangleSolid2D (transform, 1, 3, 4);
}
}
private static GameObject CreateMesh(List vertices)
{
int[] triangles;
Mesh mesh = new Mesh();
int triangleAmount = vertices.Count - 2;
triangles = new int[3 * triangleAmount];
//根据三角形的个数,来计算绘制三角形的顶点顺序(索引)
//顺序必须为顺时针或者逆时针
for (int i = 0; i
{
triangles[3 * i] = 0;//固定第一个点
triangles[3 * i + 1] = i + 1;
triangles[3 * i + 2] = i + 2;
}
if (go == null)
{
go = new GameObject("mesh");
go.transform.position = new Vector3(0, 0.1f, 0);//让绘制的图形上升一点,防止被地面遮挡
mf = go.AddComponent();
mr = go.AddComponent();
shader = Shader.Find("Unlit/Color");
}
mesh.vertices = vertices.ToArray();
mesh.triangles = triangles;
mf.mesh = mesh;
mr.material.shader = shader;
mr.material.color = Color.red;
return go;
}
//绘制实心长方形2D
//distance指的是这个长方形与Transform t的中心点的距离
public static void ToDrawRectangleSolid2D(Transform t, float distance, float length, float width)
{
List vertices = new List();
if (IsFacingRight(t))
{
Vector3 forwardMiddle = new Vector3(t.position.x + distance, t.position.y);
vertices.Add(forwardMiddle + new Vector3(0, width / 2));
vertices.Add(forwardMiddle + new Vector3(length, width / 2));
vertices.Add(forwardMiddle + new Vector3(length, -width / 2));
vertices.Add(forwardMiddle + new Vector3(0, -width / 2));
}
else
{
//看不到颜色但点击mesh可以看到形状
Vector3 forwardMiddle = new Vector3(t.position.x - distance, t.position.y);
vertices.Add(forwardMiddle + new Vector3(0, width / 2));
vertices.Add(forwardMiddle + new Vector3(-length, width / 2));
vertices.Add(forwardMiddle + new Vector3(-length, -width / 2));
vertices.Add(forwardMiddle + new Vector3(0, -width / 2));
}
CreateMesh(vertices);
}
public static bool IsFacingRight(Transform t)
{
if (t.localEulerAngles.y > 0) return false;
else return true;
}
}