Example #1
0
    public static void BuildFrame(GameObject obj, BZWTeleporter tp)
    {
        Mesh mesh = new Mesh();

        MeshFilter filter = obj.GetComponent <MeshFilter>();

        if (filter == null)
        {
            filter = obj.AddComponent <MeshFilter>() as MeshFilter;
        }

        List <Vector3> verts = new List <Vector3>();
        List <Vector3> norms = new List <Vector3>();
        List <Vector2> uvs   = new List <Vector2>();
        List <int>     tris  = new List <int>();

        Vector3 scale = tp.transform.localScale;

        float borderFactorZ = tp.Border / scale.z;
        float borderFactorY = tp.Border / scale.y;
        float borderFactorX = tp.Border / scale.x;

        int offset = 0;

        // left side
        // Z+ wall
        verts.Add(new Vector3(-borderFactorX, 0, 1));
        norms.Add(Vector3.back);
        uvs.Add(new Vector2(-borderFactorX * TeleporterFrameUVScale, 0));

        verts.Add(new Vector3(-borderFactorX, 1, 1));
        norms.Add(Vector3.back);
        uvs.Add(new Vector2(-borderFactorX * TeleporterFrameUVScale, scale.y * TeleporterFrameUVScale));

        verts.Add(new Vector3(borderFactorX, 1, 1));
        norms.Add(Vector3.back);
        uvs.Add(new Vector2(borderFactorX * TeleporterFrameUVScale, scale.y * TeleporterFrameUVScale));

        verts.Add(new Vector3(borderFactorX, 0, 1));
        norms.Add(Vector3.back);
        uvs.Add(new Vector2(borderFactorX * TeleporterFrameUVScale, 0));

        tris.Add(0 + offset);
        tris.Add(1 + offset);
        tris.Add(2 + offset);

        tris.Add(2 + offset);
        tris.Add(3 + offset);
        tris.Add(0 + offset);

        offset = verts.Count;

        // Z- wall
        verts.Add(new Vector3(-borderFactorX, 0, 1 + borderFactorZ));
        norms.Add(Vector3.forward);
        uvs.Add(new Vector2(-borderFactorX * TeleporterFrameUVScale, 0));

        verts.Add(new Vector3(-borderFactorX, 1 + borderFactorY, 1 + borderFactorZ));
        norms.Add(Vector3.forward);
        uvs.Add(new Vector2(-borderFactorX * TeleporterFrameUVScale, (scale.y + tp.Border) * TeleporterFrameUVScale));

        verts.Add(new Vector3(borderFactorX, 1 + borderFactorY, 1 + borderFactorZ));
        norms.Add(Vector3.forward);
        uvs.Add(new Vector2(borderFactorX * TeleporterFrameUVScale, (scale.y + tp.Border) * TeleporterFrameUVScale));

        verts.Add(new Vector3(borderFactorX, 0, 1 + borderFactorZ));
        norms.Add(Vector3.forward);
        uvs.Add(new Vector2(borderFactorX * TeleporterFrameUVScale, 0));

        tris.Add(2 + offset);
        tris.Add(1 + offset);
        tris.Add(0 + offset);

        tris.Add(0 + offset);
        tris.Add(3 + offset);
        tris.Add(2 + offset);

        offset = verts.Count;

        // X+ wall
        verts.Add(new Vector3(borderFactorX, 0, 1 + borderFactorZ));         // bottom right
        norms.Add(Vector3.left);
        uvs.Add(new Vector2(borderFactorZ * TeleporterFrameUVScale, 0.5f));

        verts.Add(new Vector3(borderFactorX, 1 + borderFactorY, 1 + borderFactorZ));            // top right
        norms.Add(Vector3.left);
        uvs.Add(new Vector2(borderFactorZ * TeleporterFrameUVScale, ((scale.y + tp.Border) * TeleporterFrameUVScale) + 0.5f));

        verts.Add(new Vector3(borderFactorX, 1, 1));            // top left
        norms.Add(Vector3.left);
        uvs.Add(new Vector2(0, (scale.y * TeleporterFrameUVScale) + 0.5f));

        verts.Add(new Vector3(borderFactorX, 0, 1));         // bottom left
        norms.Add(Vector3.left);
        uvs.Add(new Vector2(0, 0.5f));


        tris.Add(2 + offset);
        tris.Add(1 + offset);
        tris.Add(0 + offset);

        tris.Add(0 + offset);
        tris.Add(3 + offset);
        tris.Add(2 + offset);

        offset = verts.Count;

        // X- wall
        verts.Add(new Vector3(-borderFactorX, 0, 1 + borderFactorZ));         // bottom right
        norms.Add(Vector3.right);
        uvs.Add(new Vector2(-borderFactorZ * TeleporterFrameUVScale, 0.5f));

        verts.Add(new Vector3(-borderFactorX, 1 + borderFactorY, 1 + borderFactorZ));            // top right
        norms.Add(Vector3.right);
        uvs.Add(new Vector2(-borderFactorZ * TeleporterFrameUVScale, ((scale.y + tp.Border) * TeleporterFrameUVScale) + 0.5f));

        verts.Add(new Vector3(-borderFactorX, 1, 1));            // top left
        norms.Add(Vector3.right);
        uvs.Add(new Vector2(0, (scale.y * TeleporterFrameUVScale) + 0.5f));

        verts.Add(new Vector3(-borderFactorX, 0, 1));         // bottom left
        norms.Add(Vector3.right);
        uvs.Add(new Vector2(0, 0.5f));


        tris.Add(0 + offset);
        tris.Add(1 + offset);
        tris.Add(2 + offset);

        tris.Add(2 + offset);
        tris.Add(3 + offset);
        tris.Add(0 + offset);

        offset = verts.Count;



        // right side
        // Z+ wall
        verts.Add(new Vector3(-borderFactorX, 0, -1));
        norms.Add(Vector3.back);
        uvs.Add(new Vector2(-borderFactorX * TeleporterFrameUVScale, 0));

        verts.Add(new Vector3(-borderFactorX, 1, -1));
        norms.Add(Vector3.back);
        uvs.Add(new Vector2(-borderFactorX * TeleporterFrameUVScale, scale.y * TeleporterFrameUVScale));

        verts.Add(new Vector3(borderFactorX, 1, -1));
        norms.Add(Vector3.back);
        uvs.Add(new Vector2(borderFactorX * TeleporterFrameUVScale, scale.y * TeleporterFrameUVScale));

        verts.Add(new Vector3(borderFactorX, 0, -1));
        norms.Add(Vector3.back);
        uvs.Add(new Vector2(borderFactorX * TeleporterFrameUVScale, 0));

        tris.Add(2 + offset);
        tris.Add(1 + offset);
        tris.Add(0 + offset);

        tris.Add(0 + offset);
        tris.Add(3 + offset);
        tris.Add(2 + offset);

        offset = verts.Count;

        // Z- wall
        verts.Add(new Vector3(-borderFactorX, 0, -1 - borderFactorZ));
        norms.Add(Vector3.forward);
        uvs.Add(new Vector2(-borderFactorX * TeleporterFrameUVScale, 0));

        verts.Add(new Vector3(-borderFactorX, 1 + borderFactorY, -1 - borderFactorZ));
        norms.Add(Vector3.forward);
        uvs.Add(new Vector2(-borderFactorX * TeleporterFrameUVScale, (scale.y + tp.Border) * TeleporterFrameUVScale));

        verts.Add(new Vector3(borderFactorX, 1 + borderFactorY, -1 - borderFactorZ));
        norms.Add(Vector3.forward);
        uvs.Add(new Vector2(borderFactorX * TeleporterFrameUVScale, (scale.y + tp.Border) * TeleporterFrameUVScale));

        verts.Add(new Vector3(borderFactorX, 0, -1 - borderFactorZ));
        norms.Add(Vector3.forward);
        uvs.Add(new Vector2(borderFactorX * TeleporterFrameUVScale, 0));

        tris.Add(0 + offset);
        tris.Add(1 + offset);
        tris.Add(2 + offset);

        tris.Add(2 + offset);
        tris.Add(3 + offset);
        tris.Add(0 + offset);

        offset = verts.Count;

        // X+ wall
        verts.Add(new Vector3(borderFactorX, 0, -1 - borderFactorZ));         // bottom right
        norms.Add(Vector3.left);
        uvs.Add(new Vector2(borderFactorZ * TeleporterFrameUVScale, 0.5f));

        verts.Add(new Vector3(borderFactorX, 1 + borderFactorY, -1 - borderFactorZ));            // top right
        norms.Add(Vector3.left);
        uvs.Add(new Vector2(borderFactorZ * TeleporterFrameUVScale, ((scale.y + tp.Border) * TeleporterFrameUVScale) + 0.5f));

        verts.Add(new Vector3(borderFactorX, 1, -1));            // top left
        norms.Add(Vector3.left);
        uvs.Add(new Vector2(0, (scale.y * TeleporterFrameUVScale) + 0.5f));

        verts.Add(new Vector3(borderFactorX, 0, -1));         // bottom left
        norms.Add(Vector3.left);
        uvs.Add(new Vector2(0, 0.5f));


        tris.Add(0 + offset);
        tris.Add(1 + offset);
        tris.Add(2 + offset);

        tris.Add(2 + offset);
        tris.Add(3 + offset);
        tris.Add(0 + offset);

        offset = verts.Count;

        // X- wall
        verts.Add(new Vector3(-borderFactorX, 0, -1 - borderFactorZ));         // bottom right
        norms.Add(Vector3.right);
        uvs.Add(new Vector2(-borderFactorZ * TeleporterFrameUVScale, 0.5f));

        verts.Add(new Vector3(-borderFactorX, 1 + borderFactorY, -1 - borderFactorZ));            // top right
        norms.Add(Vector3.right);
        uvs.Add(new Vector2(-borderFactorZ * TeleporterFrameUVScale, ((scale.y + tp.Border) * TeleporterFrameUVScale) + 0.5f));

        verts.Add(new Vector3(-borderFactorX, 1, -1));            // top left
        norms.Add(Vector3.right);
        uvs.Add(new Vector2(0, (scale.y * TeleporterFrameUVScale) + 0.5f));

        verts.Add(new Vector3(-borderFactorX, 0, -1));         // bottom left
        norms.Add(Vector3.right);
        uvs.Add(new Vector2(0, 0.5f));


        tris.Add(2 + offset);
        tris.Add(1 + offset);
        tris.Add(0 + offset);

        tris.Add(0 + offset);
        tris.Add(3 + offset);
        tris.Add(2 + offset);

        offset = verts.Count;

        // top bar

        // roof
        verts.Add(new Vector3(-borderFactorX, 1 + borderFactorY, 1 + borderFactorZ));
        norms.Add(Vector3.up);
        uvs.Add(new Vector2((-scale.x - tp.Border) * TeleporterFrameUVScale, scale.z * TeleporterFrameUVScale));

        verts.Add(new Vector3(borderFactorX, 1 + borderFactorY, 1 + borderFactorZ));
        norms.Add(Vector3.up);
        uvs.Add(new Vector2((scale.x + tp.Border) * TeleporterFrameUVScale, scale.z * TeleporterFrameUVScale));

        verts.Add(new Vector3(borderFactorX, 1 + borderFactorY, -1 - borderFactorZ));
        norms.Add(Vector3.up);
        uvs.Add(new Vector2((scale.x + tp.Border) * TeleporterFrameUVScale, -scale.z * TeleporterFrameUVScale));

        verts.Add(new Vector3(-borderFactorX, 1 + borderFactorY, -1 - borderFactorZ));
        norms.Add(Vector3.up);
        uvs.Add(new Vector2((-scale.x - tp.Border) * TeleporterFrameUVScale, -scale.z * TeleporterFrameUVScale));

        tris.Add(0 + offset);
        tris.Add(1 + offset);
        tris.Add(2 + offset);

        tris.Add(2 + offset);
        tris.Add(3 + offset);
        tris.Add(0 + offset);

        offset = verts.Count;

        // under hang
        verts.Add(new Vector3(-borderFactorX, 1, 1));
        norms.Add(Vector3.down);
        uvs.Add(new Vector2((-scale.x) * TeleporterFrameUVScale, scale.z * TeleporterFrameUVScale));

        verts.Add(new Vector3(borderFactorX, 1, 1));
        norms.Add(Vector3.down);
        uvs.Add(new Vector2((scale.x) * TeleporterFrameUVScale, scale.z * TeleporterFrameUVScale));

        verts.Add(new Vector3(borderFactorX, 1, -1));
        norms.Add(Vector3.down);
        uvs.Add(new Vector2((scale.x) * TeleporterFrameUVScale, -scale.z * TeleporterFrameUVScale));

        verts.Add(new Vector3(-borderFactorX, 1, -1));
        norms.Add(Vector3.down);
        uvs.Add(new Vector2((-scale.x) * TeleporterFrameUVScale, -scale.z * TeleporterFrameUVScale));

        tris.Add(2 + offset);
        tris.Add(1 + offset);
        tris.Add(0 + offset);

        tris.Add(0 + offset);
        tris.Add(3 + offset);
        tris.Add(2 + offset);

        offset = verts.Count;


        // X+ wall
        verts.Add(new Vector3(borderFactorX, 1, 1));         // bottom right
        norms.Add(Vector3.right);
        uvs.Add(new Vector2(scale.z * TeleporterFrameUVScale, 0));

        verts.Add(new Vector3(borderFactorX, 1 + borderFactorY, 1 + borderFactorZ));            // top right
        norms.Add(Vector3.right);
        uvs.Add(new Vector2(scale.z * TeleporterFrameUVScale, (tp.Border * TeleporterFrameUVScale)));

        verts.Add(new Vector3(borderFactorX, 1 + borderFactorY, -1 - borderFactorZ));            // top left
        norms.Add(Vector3.right);
        uvs.Add(new Vector2(-scale.z * TeleporterFrameUVScale, (tp.Border * TeleporterFrameUVScale)));

        verts.Add(new Vector3(borderFactorX, 1, -1));         // bottom left
        norms.Add(Vector3.right);
        uvs.Add(new Vector2(-scale.z * TeleporterFrameUVScale, 0));

        tris.Add(2 + offset);
        tris.Add(1 + offset);
        tris.Add(0 + offset);

        tris.Add(0 + offset);
        tris.Add(3 + offset);
        tris.Add(2 + offset);

        offset = verts.Count;


        // X- wall
        verts.Add(new Vector3(-borderFactorX, 1, 1));         // bottom right
        norms.Add(Vector3.left);
        uvs.Add(new Vector2(scale.z * TeleporterFrameUVScale, 0));

        verts.Add(new Vector3(-borderFactorX, 1 + borderFactorY, 1 + borderFactorZ));            // top right
        norms.Add(Vector3.left);
        uvs.Add(new Vector2((scale.z + tp.Border) * TeleporterFrameUVScale, (tp.Border * TeleporterFrameUVScale)));

        verts.Add(new Vector3(-borderFactorX, 1 + borderFactorY, -1 - borderFactorZ));            // top left
        norms.Add(Vector3.left);
        uvs.Add(new Vector2((-scale.z - tp.Border) * TeleporterFrameUVScale, (tp.Border * TeleporterFrameUVScale)));

        verts.Add(new Vector3(-borderFactorX, 1, -1));         // bottom left
        norms.Add(Vector3.left);
        uvs.Add(new Vector2(-scale.z * TeleporterFrameUVScale, 0));

        tris.Add(0 + offset);
        tris.Add(1 + offset);
        tris.Add(2 + offset);

        tris.Add(2 + offset);
        tris.Add(3 + offset);
        tris.Add(0 + offset);

        offset = verts.Count;


        // add our hard work
        mesh.vertices  = verts.ToArray();
        mesh.uv        = uvs.ToArray();
        mesh.normals   = norms.ToArray();
        mesh.triangles = tris.ToArray();

        filter.sharedMesh = mesh;

        MeshRenderer render = obj.AddComponent <MeshRenderer>() as MeshRenderer;

        render.sharedMaterial = (Material)AssetDatabase.LoadAssetAtPath("Assets/BZWTools/StandardAssets/Textures/caution.mat", typeof(Material));

        MeshCollider collider = obj.AddComponent <MeshCollider>() as MeshCollider;

        collider.sharedMesh = mesh;
        obj.isStatic        = true;
    }
Example #2
0
    public static void BuildField(GameObject obj, BZWTeleporter tp)
    {
        Mesh mesh = new Mesh();

        MeshFilter filter = obj.GetComponent <MeshFilter>();

        if (filter == null)
        {
            filter = obj.AddComponent <MeshFilter>() as MeshFilter;
        }

        List <Vector3> verts = new List <Vector3>();
        List <Vector3> norms = new List <Vector3>();
        List <Vector2> uvs   = new List <Vector2>();
        List <int>     tris  = new List <int>();

        Vector3 scale = tp.transform.localScale;

        int offset = 0;

        // Z+ wall
        verts.Add(new Vector3(-1, 0, 1));
        norms.Add(Vector3.forward);
        uvs.Add(new Vector2(-scale.x * TeleporterFieldUVScale, 0));

        verts.Add(new Vector3(-1, 1, 1));
        norms.Add(Vector3.forward);
        uvs.Add(new Vector2(-scale.x * TeleporterFieldUVScale, scale.y * TeleporterFieldUVScale));

        verts.Add(new Vector3(1, 1, 1));
        norms.Add(Vector3.forward);
        uvs.Add(new Vector2(scale.x * TeleporterFieldUVScale, scale.y * TeleporterFieldUVScale));

        verts.Add(new Vector3(1, 0, 1));
        norms.Add(Vector3.forward);
        uvs.Add(new Vector2(scale.x * TeleporterFieldUVScale, 0));

        tris.Add(2 + offset);
        tris.Add(1 + offset);
        tris.Add(0 + offset);

        tris.Add(0 + offset);
        tris.Add(3 + offset);
        tris.Add(2 + offset);

        offset = verts.Count;

        // Z- wall
        verts.Add(new Vector3(-1, 0, -1));
        norms.Add(Vector3.back);
        uvs.Add(new Vector2(-scale.x * TeleporterFieldUVScale, 0));

        verts.Add(new Vector3(-1, 1, -1));
        norms.Add(Vector3.back);
        uvs.Add(new Vector2(-scale.x * TeleporterFieldUVScale, scale.y * TeleporterFieldUVScale));

        verts.Add(new Vector3(1, 1, -1));
        norms.Add(Vector3.back);
        uvs.Add(new Vector2(scale.x * TeleporterFieldUVScale, scale.y * TeleporterFieldUVScale));

        verts.Add(new Vector3(1, 0, -1));
        norms.Add(Vector3.back);
        uvs.Add(new Vector2(scale.x * TeleporterFieldUVScale, 0));

        tris.Add(0 + offset);
        tris.Add(1 + offset);
        tris.Add(2 + offset);

        tris.Add(2 + offset);
        tris.Add(3 + offset);
        tris.Add(0 + offset);

        offset = verts.Count;

        // X+ wall
        verts.Add(new Vector3(1, 0, 1));
        norms.Add(Vector3.right);
        uvs.Add(new Vector2(-scale.z * TeleporterFieldUVScale, 0));

        verts.Add(new Vector3(1, 1, 1));
        norms.Add(Vector3.right);
        uvs.Add(new Vector2(-scale.z * TeleporterFieldUVScale, scale.y * TeleporterFieldUVScale));

        verts.Add(new Vector3(1, 1, -1));
        norms.Add(Vector3.right);
        uvs.Add(new Vector2(scale.z * TeleporterFieldUVScale, scale.y * TeleporterFieldUVScale));

        verts.Add(new Vector3(1, 0, -1));
        norms.Add(Vector3.right);
        uvs.Add(new Vector2(scale.z * TeleporterFieldUVScale, 0));


        tris.Add(2 + offset);
        tris.Add(1 + offset);
        tris.Add(0 + offset);

        tris.Add(0 + offset);
        tris.Add(3 + offset);
        tris.Add(2 + offset);

        offset = verts.Count;

        // X- wall
        verts.Add(new Vector3(-1, 0, 1));
        norms.Add(Vector3.left);
        uvs.Add(new Vector2(-scale.z * TeleporterFieldUVScale, 0));

        verts.Add(new Vector3(-1, 1, 1));
        norms.Add(Vector3.left);
        uvs.Add(new Vector2(-scale.z * TeleporterFieldUVScale, scale.y * TeleporterFieldUVScale));

        verts.Add(new Vector3(-1, 1, -1));
        norms.Add(Vector3.left);
        uvs.Add(new Vector2(scale.z * TeleporterFieldUVScale, scale.y * TeleporterFieldUVScale));

        verts.Add(new Vector3(-1, 0, -1));
        norms.Add(Vector3.left);
        uvs.Add(new Vector2(scale.z * TeleporterFieldUVScale, 0));


        tris.Add(0 + offset);
        tris.Add(1 + offset);
        tris.Add(2 + offset);

        tris.Add(2 + offset);
        tris.Add(3 + offset);
        tris.Add(0 + offset);

        offset = verts.Count;


        // add our hard work
        mesh.vertices  = verts.ToArray();
        mesh.uv        = uvs.ToArray();
        mesh.normals   = norms.ToArray();
        mesh.triangles = tris.ToArray();

        filter.sharedMesh = mesh;

        MeshRenderer render = obj.AddComponent <MeshRenderer>() as MeshRenderer;

        render.sharedMaterial = (Material)AssetDatabase.LoadAssetAtPath("Assets/BZWTools/StandardAssets/Textures/telelink.mat", typeof(Material));
        MeshCollider collider = obj.AddComponent <MeshCollider>() as MeshCollider;

        collider.sharedMesh = mesh;
        obj.isStatic        = true;
    }