예제 #1
0
    public static PropObject Create(Transform parent, PropTools.Prop prop)
    {
        GameObject newPropGO = new GameObject();

        newPropGO.name             = prop.propName;
        newPropGO.transform.parent = parent;

        PropObject newProp = newPropGO.AddComponent <PropObject>();

        newProp.prop = prop;

        Bounds propBounds = CreateProxies(newPropGO, prop);

        BoxCollider collider = newPropGO.AddComponent <BoxCollider>();

        collider.hideFlags = HideFlags.HideInInspector | HideFlags.NotEditable;
        collider.center    = propBounds.center;
        collider.size      = propBounds.size;

        return(newProp);
    }
예제 #2
0
    public static Bounds CreateProxies(GameObject go, PropTools.Prop prop)
    {
        List <Mesh>     proxyMeshes    = new List <Mesh>();
        List <Material> proxyMaterials = new List <Material>();

        GameObject cube     = GameObject.CreatePrimitive(PrimitiveType.Cube);
        MeshFilter cubeMF   = cube.GetComponent <MeshFilter>();
        Mesh       cubeMesh = cubeMF.sharedMesh;

        foreach (PropTools.Proxy proxy in prop.proxies)
        {
            Vector3[] verts = cubeMesh.vertices;

            for (int i = 0; i < verts.Length; i++)
            {
                verts[i].Scale(proxy.size);
                verts[i] += proxy.center;
            }

            Mesh proxyMesh = new Mesh();
            proxyMesh.vertices  = verts;
            proxyMesh.triangles = cubeMesh.triangles;
            proxyMesh.uv        = cubeMesh.uv;
            proxyMesh.normals   = cubeMesh.normals;


            Material proxyMat = new Material(Shader.Find("Diffuse"));
            proxyMat.color     = proxy.color;
            proxyMat.hideFlags = HideFlags.HideInInspector | HideFlags.NotEditable;
            proxyMeshes.Add(proxyMesh);
            proxyMaterials.Add(proxyMat);
        }


        CombineInstance[] cI = new CombineInstance[proxyMeshes.Count];
        for (int i = 0; i < proxyMeshes.Count; i++)
        {
            cI[i].mesh = proxyMeshes[i];
        }


        Mesh combinedMesh = new Mesh();

        combinedMesh.CombineMeshes(cI, false, false);
        combinedMesh.RecalculateBounds();

        MeshFilter mf = go.AddComponent <MeshFilter>();

        mf.hideFlags  = HideFlags.HideInInspector | HideFlags.NotEditable;
        mf.sharedMesh = combinedMesh;

        MeshRenderer mr = go.AddComponent <MeshRenderer>();

        mr.hideFlags       = HideFlags.HideInInspector | HideFlags.NotEditable;
        mr.sharedMaterials = proxyMaterials.ToArray();


        DestroyImmediate(cube);
        for (int i = 0; i < proxyMeshes.Count; i++)
        {
            DestroyImmediate(proxyMeshes[i]);
        }

        return(combinedMesh.bounds);
    }