unity在Game窗口绘制网格Capsule

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ShowCapsuleColider : MonoBehaviour
{
    //画线用的材质球
    Material lineMat;
    private float subdivide = 305.7f;
    void OnEnable()
    {
        if (lineMat == null)
        {
            lineMat = Resources.Load<Material>("Materials/LineMat");
        }

    }
    void OnRenderObject()
    {
        CapsuleCollider capsuleCollider = GetComponent<CapsuleCollider>();
        if (!capsuleCollider.enabled||capsuleCollider==null)
        {
            return;
        }
        Vector3 center = capsuleCollider.center;
        float radius = capsuleCollider.radius;
        float height = capsuleCollider.height;
        lineMat.SetPass(0);
        GL.Begin(GL.LINES);
        GL.Color(Color.green);
        float step =1.0f / subdivide;
        float halfHeight =( height - 2 * radius)*0.5f;
        for (float i = 0; i < 1; i += step)
        {

            Vector3 p1 = GraphLib.Circle(i, radius);
            Vector3 p = new Vector3(p1.x + center.x, p1.y + center.y+ halfHeight, p1.z + center.z);
            p = transform.TransformPoint(p);
            GL.Vertex(p);

        }
        for (float i = step; i < 1.0f+step; i += step)
        {

            Vector3 p1 = GraphLib.Circle(i, radius);
            Vector3 p = new Vector3(p1.x + center.x, p1.y + center.y + halfHeight, p1.z + center.z);
            p = transform.TransformPoint(p);
            GL.Vertex(p);

        }
        GL.End();
        GL.Begin(GL.LINES);
        GL.Color(Color.green);
        for (float i = 0; i < 1; i += step)
        {

            Vector3 p1 = GraphLib.Circle(i, radius);
            Vector3 p = new Vector3(p1.x + center.x, p1.y + center.y- halfHeight, p1.z + center.z);
            p = transform.TransformPoint(p);
            GL.Vertex(p);

        }
        for (float i = step; i < 1.0f+step; i += step)
        {

            Vector3 p1 = GraphLib.Circle(i, radius);
            Vector3 p = new Vector3(p1.x + center.x, p1.y + center.y - halfHeight, p1.z + center.z);
            p = transform.TransformPoint(p);
            GL.Vertex(p);

        }
        GL.End();
        GL.Begin(GL.LINES);
        GL.Color(Color.green);
        for (float i = 0; i < 1; i += step)
        {
            Vector3 p1 = GraphLib.Circle(i, radius);
            if (i<0.5f)
            {
                Vector3 p = new Vector3(p1.x + center.x, p1.z + center.y+halfHeight, p1.y + center.z);
                p = transform.TransformPoint(p);
                GL.Vertex(p);
            }
            else
            {
                Vector3 p = new Vector3(p1.x + center.x, p1.z + center.y - halfHeight, p1.y + center.z);
                p = transform.TransformPoint(p);
                GL.Vertex(p);
            }
            
            

        }
        for (float i = step; i < 1.0f+step; i += step)
        {
            Vector3 p1 = GraphLib.Circle(i, radius);
            if (i < 0.5f)
            {
                Vector3 p = new Vector3(p1.x + center.x, p1.z + center.y + halfHeight, p1.y + center.z);
                p = transform.TransformPoint(p);
                GL.Vertex(p);
            }
            else
            {
                Vector3 p = new Vector3(p1.x + center.x, p1.z + center.y - halfHeight, p1.y + center.z);
                p = transform.TransformPoint(p);
                GL.Vertex(p);
            }



        }
        GL.End();
        GL.Begin(GL.LINES);
        GL.Color(Color.green);
        for (float i = 0; i < 1; i += step)
        {
            Vector3 p1 = GraphLib.Circle(i, radius);
            if (i < 0.5f)
            {
                Vector3 p = new Vector3(p1.y + center.x, p1.z + center.y + halfHeight, p1.x + center.z);
                p = transform.TransformPoint(p);
                GL.Vertex(p);
            }
            else
            {
                Vector3 p = new Vector3(p1.y + center.x, p1.z + center.y - halfHeight, p1.x + center.z);
                p = transform.TransformPoint(p);
                GL.Vertex(p);
            }



        }
        for (float i = step; i < 1.0f+step; i += step)
        {
            Vector3 p1 = GraphLib.Circle(i, radius);
            if (i < 0.5f)
            {
                Vector3 p = new Vector3(p1.y + center.x, p1.z + center.y + halfHeight, p1.x + center.z);
                p = transform.TransformPoint(p);
                GL.Vertex(p);
            }
            else
            {
                Vector3 p = new Vector3(p1.y + center.x, p1.z + center.y - halfHeight, p1.x + center.z);
                p = transform.TransformPoint(p);
                GL.Vertex(p);
            }
        }
        GL.End();
        GL.Begin(GL.LINES);
        GL.Color(Color.green);
        Vector3 point = GraphLib.Circle(0, radius);
        point = new Vector3(point.y + center.x, point.z + center.y + halfHeight, point.x + center.z);
        point = transform.TransformPoint(point);
        GL.Vertex(point);
        GL.Vertex(point - Vector3.up* halfHeight*2);

        point = GraphLib.Circle(0.5f, radius);
        point = new Vector3(point.y + center.x, point.z + center.y + halfHeight, point.x + center.z);
        point = transform.TransformPoint(point);
        GL.Vertex(point);
        GL.Vertex(point - Vector3.up * halfHeight * 2);

        Vector3 point1 = GraphLib.Circle(0, radius);
        point1 = new Vector3(point1.x + center.x, point1.z + center.y + halfHeight, point1.y + center.z);
        point1 = transform.TransformPoint(point1);
        GL.Vertex(point1);
        GL.Vertex(point1 - Vector3.up * halfHeight * 2);

        point1 = GraphLib.Circle(0.5f, radius);
        point1 = new Vector3(point1.x + center.x, point1.z + center.y + halfHeight, point1.y + center.z);
        point1 = transform.TransformPoint(point1);
        GL.Vertex(point1);
        GL.Vertex(point1 - Vector3.up * halfHeight * 2);
        GL.End();

    }
}

  

    //s角度  0-1之间  r:半径
    public static Vector3 Circle(float s,float r)
    {
        Vector3 p;
        p.x =r* Mathf.Cos(2*Mathf.PI * s);
        p.y = 0;
        p.z =r* Mathf.Sin(2*Mathf.PI * s);
        return p;
    }
原文地址:https://www.cnblogs.com/DazeJiang/p/14367235.html