Unity3d 运行模式下绘制BoxCollider

最近在搞运行模式下的编辑器功能,策划提了个要求是在Game窗口中能看到BoxCollider,所以就找了找资料,实现了一下:

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

public class TriggerRectView : MonoBehaviour {
    public int width;
    public int height;
    //画线用的材质球
    Material lineMat;

    private Vector3 v3FrontTopLeft;
    private Vector3 v3FrontTopRight;
    private Vector3 v3FrontBottomLeft;
    private Vector3 v3FrontBottomRight;
    private Vector3 v3BackTopLeft;
    private Vector3 v3BackTopRight;
    private Vector3 v3BackBottomLeft;
    private Vector3 v3BackBottomRight;

    // Use this for initialization
    void Start () {

    }
	
	// Update is called once per frame
	void Update () {
	
	}

    void OnEnable()
    {
        if (lineMat == null)
        {
            lineMat = Resources.Load<Material>("M/LineMat");
        }
        CalcBoxColliderPositons();
    }

    void OnRenderObject()
    {
        CalcBoxColliderPositons();
        lineMat.SetPass(0);

        GL.Begin(GL.LINES);
        GL.Color(Color.red);
        GL.Vertex(v3FrontTopLeft);
        GL.Vertex(v3FrontTopRight);

        GL.Vertex(v3FrontTopRight);
        GL.Vertex(v3FrontBottomRight);

        GL.Vertex(v3FrontBottomRight);
        GL.Vertex(v3FrontBottomLeft);

        GL.Vertex(v3FrontBottomLeft);
        GL.Vertex(v3FrontTopLeft);

        GL.Vertex(v3BackTopLeft);
        GL.Vertex(v3BackTopRight);

        GL.Vertex(v3BackTopRight);
        GL.Vertex(v3BackBottomRight);

        GL.Vertex(v3BackBottomRight);
        GL.Vertex(v3BackBottomLeft);

        GL.Vertex(v3BackBottomLeft);
        GL.Vertex(v3BackTopLeft);

        GL.Vertex(v3FrontTopLeft);
        GL.Vertex(v3BackTopLeft);

        GL.Vertex(v3FrontTopRight);
        GL.Vertex(v3BackTopRight);

        GL.Vertex(v3FrontBottomRight);
        GL.Vertex(v3BackBottomRight);

        GL.Vertex(v3FrontBottomLeft);
        GL.Vertex(v3BackBottomLeft);
        GL.End();
    }
   
    void CalcBoxColliderPositons()
    {
        Bounds bounds = GetComponent<BoxCollider>().bounds;

        Vector3 v3Center = bounds.center - transform.position;//此处减去GameObject本身坐标是为了在物体移动时,绘制的Box也跟着一起移动
        Vector3 v3Extents = bounds.extents;

        v3FrontTopLeft = new Vector3(v3Center.x - v3Extents.x, v3Center.y + v3Extents.y, v3Center.z - v3Extents.z);  // Front top left corner
        v3FrontTopRight = new Vector3(v3Center.x + v3Extents.x, v3Center.y + v3Extents.y, v3Center.z - v3Extents.z);  // Front top right corner
        v3FrontBottomLeft = new Vector3(v3Center.x - v3Extents.x, v3Center.y - v3Extents.y, v3Center.z - v3Extents.z);  // Front bottom left corner
        v3FrontBottomRight = new Vector3(v3Center.x + v3Extents.x, v3Center.y - v3Extents.y, v3Center.z - v3Extents.z);  // Front bottom right corner
        v3BackTopLeft = new Vector3(v3Center.x - v3Extents.x, v3Center.y + v3Extents.y, v3Center.z + v3Extents.z);  // Back top left corner
        v3BackTopRight = new Vector3(v3Center.x + v3Extents.x, v3Center.y + v3Extents.y, v3Center.z + v3Extents.z);  // Back top right corner
        v3BackBottomLeft = new Vector3(v3Center.x - v3Extents.x, v3Center.y - v3Extents.y, v3Center.z + v3Extents.z);  // Back bottom left corner
        v3BackBottomRight = new Vector3(v3Center.x + v3Extents.x, v3Center.y - v3Extents.y, v3Center.z + v3Extents.z);  // Back bottom right corner

        v3FrontTopLeft = transform.TransformPoint(v3FrontTopLeft);
        v3FrontTopRight = transform.TransformPoint(v3FrontTopRight);
        v3FrontBottomLeft = transform.TransformPoint(v3FrontBottomLeft);
        v3FrontBottomRight = transform.TransformPoint(v3FrontBottomRight);
        v3BackTopLeft = transform.TransformPoint(v3BackTopLeft);
        v3BackTopRight = transform.TransformPoint(v3BackTopRight);
        v3BackBottomLeft = transform.TransformPoint(v3BackBottomLeft);
        v3BackBottomRight = transform.TransformPoint(v3BackBottomRight);
    }
}

  

 

posted @ 2017-03-30 20:39  yixuan1980  阅读(602)  评论(0编辑  收藏  举报