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

思路:菱形地形,我们肯定想到用方块生成。

1:用我们自己的模型,而不是标准边长为1的模型,生成地板。  
  

     会发现,它和我们摄像机的位置不对,是竖着的。图1。

                         Unity中用自己做的方块(非标准cube)构建菱形地面_第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().material.color = color1;
                go.transform.FindChild("normal_a2").GetComponent().material.color = color1;
                go.transform.SetParent(parent);
            }

图2。

                             Unity中用自己做的方块(非标准cube)构建菱形地面_第2张图片

2:解决pos中j和j*0.254f之间的问题

        可以看到,这时的方块是分开的,原因很简单,是因为这些方块的边长并不是1,之前用标准cube就用Vector3 pos = new Vector3(j , 0, i );生成,是因为j和i的递增单位是1。标准cube也是1,所以生成的平面是紧挨着的。这时我们需要*一个数字改变这个比例,这数字的由来自己思考。图3.   
                                        Unity中用自己做的方块(非标准cube)构建菱形地面_第3张图片 
 
3:经过上面的操作,我们已经生成了一块平地。很不错!

     这时我们思考,将其旋转一下,来电菱形的样子呢?我们将rot改为:Vector3 rot = new Vector3(-90, 45, 0);图4.  有点意思,但方块之间有空隙,这是肯定的卅,平铺的方块旋转之后就会出现。

                     Unity中用自己做的方块(非标准cube)构建菱形地面_第4张图片


4:单面菱形生成


     已经上面的操作,已经有点意思了。我们在编辑界面对其进行这样的操作就更有意思了:图5。

           Unity中用自己做的方块(非标准cube)构建菱形地面_第5张图片

但这该怎么修改代码实现呢?通过数学知识我们了解到,相邻方块中心点之间的距离是方块对角线的长度。这样就有代码依据了。我们将pos进行这样的修改:Vector3 pos = new Vector3(j * bottom_math(), 0, i * bottom_math()); 结果图6.。有意思吧。其中:bottom_math()定义是:

          public float bottom_math()
    {
        return Mathf.Sqrt(2) * 0.254f;
    }     0.254是我们模型的边长。这里用到了,数学类。

          Unity中用自己做的方块(非标准cube)构建菱形地面_第6张图片


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().material.color = color2;
                go2.transform.FindChild("normal_a2").GetComponent().material.color = color2;
                go2.transform.SetParent(M2);
            }


结果图7.。这样菱形地面就生成了,嘿嘿,有意思吧。

最终结果:

                 Unity中用自己做的方块(非标准cube)构建菱形地面_第7张图片


总结:其实这个小案例很简单,无非是一些数学知识和一些API的运用。


你可能感兴趣的:(Unity,Game,Developing)