Unity中用自己做的方块(非标准cube)构建菱形地面

发表于2018-02-28
评论0 5.1k浏览
思路:菱形地形,我们肯定想到用方块生成。

1、用我们自己的模型,而不是标准边长为1的模型,生成地板。
会发现,它和我们摄像机的位置不对,是竖着的。

这时我们需要在代码中将其旋转90,在那个维度,向正还是向负旋转自己仔细观察。但在ins函数中第三个参数旋转并不接受,vector3向量,这是我们需要使Quaternion.Euler

将3维向量转换为四元数欧拉角。
代码如下:
 Vector3 rot = new Vector3(-90, 0, 0);
        for(int i=0;i<10;i++)
        {
            //第一排
            for(int j=0;j<6;j++)
            {
                //为什么要*0.254呢?是因为砖之间的缝隙只有0.254,而不*的话,物体是按间距1来隔开的
                Vector3 pos = new Vector3(j , 0, i );//可以将mathf提取出来进行代码优化
                GameObject go = GameObject.Instantiate(m_prefab_tile, pos, Quaternion.Euler(rot)) as GameObject;
                //修改父物体的颜色之后,还要修改子物体的颜色
                go.GetComponent<MeshRenderer>().material.color = color1;
                go.transform.FindChild("normal_a2").GetComponent<MeshRenderer>().material.color = color1;
                go.transform.SetParent(parent);
            }

2、解决pos中j和j*0.254f之间的问题
可以看到,这时的方块是分开的,原因很简单,是因为这些方块的边长并不是1,之前用标准cube就用Vector3 pos = new Vector3(j , 0, i );生成,是因为j和i的递增单位是1。标准cube也是1,所以生成的平面是紧挨着的。这时我们需要*一个数字改变这个比例,这数字的由来自己思考。

3、经过上面的操作,我们已经生成了一块平地。
这时我们思考,将其旋转一下,来电菱形的样子呢?我们将rot改为:Vector3 rot = new Vector3(-90, 45, 0); 有点意思,但方块之间有空隙,这是肯定的卅,平铺的方块旋转之后就会出现。

4、单面菱形生成
已经上面的操作,已经有点意思了。我们在编辑界面对其进行这样的操作就更有意思了。
但这该怎么修改代码实现呢?通过数学知识我们了解到,相邻方块中心点之间的距离是方块对角线的长度。这样就有代码依据了。我们将pos进行这样的修改:Vector3 pos = new Vector3(j * bottom_math(), 0, i * bottom_math());其中:bottom_math()定义是:
          public float bottom_math()
    {
        return Mathf.Sqrt(2) * 0.254f;
    }     0.254是我们模型的边长。这里用到了,数学类。

5、第二面菱形最终生成
通过第4步的操作,我们已经生成了有间距的菱形了。接下来我们直接将空白地方额用菱形填满,就使得整个地形为菱形模样了!
第二排代码:
for (int j = 0; j < 5; j++)
            {
                //第二排,注意是*bottom_math(),而不是*0.5f
                Vector3 pos2 = new Vector3(j * bottom_math() + bottom_math() / 2, 0, i * bottom_math() + bottom_math() / 2);
                GameObject go2 = GameObject.Instantiate(m_prefab_tile, pos2, Quaternion.Euler(rot)) as GameObject;
                go2.GetComponent<MeshRenderer>().material.color = color2;
                go2.transform.FindChild("normal_a2").GetComponent<MeshRenderer>().material.color = color2;
                go2.transform.SetParent(M2);
            }

这样菱形地面就生成了。
最终结果:

总结:其实这个小案例很简单,无非是一些数学知识和一些API的运用。
来自:http://blog.csdn.net/qq_34078945/article/details/77103182

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引

0个评论