Unity中用自己做的方块(非标准cube)构建菱形地面
发表于2018-02-28
思路:菱形地形,我们肯定想到用方块生成。
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
如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引