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; }