Unity3D独立游戏开发日记(一):动态生成树木
目前写的独立游戏是一个沙盒类型的游戏。游戏DEMO视频如下:
提到沙盒类型的游戏,就有人给出了这样的定义:
游戏世界离现实世界越近,自由度、随机度越高才叫沙盒游戏。所谓自由度,就是你在游戏里想干啥就干啥,想开车就开车,想走路就走路。想盖房子就盖房子,没有城管来找你麻烦。那么随机度,就是每天发生的事情不能一样,做的任务也不会就一条线路可走。
在我的沙盒游戏里,地形上的树木,岩石等都是随机生成的,这样不同的人玩的地图都会不一样。当然如果最后能做到地形也随机生成那就更完美了。
下面我就讲下树木随机生成在地图上的原理。
在unity3d里要想动态生成一个GameObject,那需要使用Instantiate函数加载树木的模型组件到指定的坐标位置上。
我们的实现步骤如下:
1.在unity3d里的Assets目录下创建Prefabs文件夹,然后在其中创建Resources(重要:不然无法用代码动态加载)子文件夹,再把树木的模型预制件放入其中。
2.使用Instantiate函数动态加载树木预制件
var itemResource = Resources.Load("Tree"+i); //I是可变随机数
GameObject itemObj = Instantiate(itemResource, new Vector3(X, Y, Z), Quaternion.identity) as GameObject;
3.使用循环改变i的值,以及改变X,Y,Z的值。
要注意的是i的值范围,要和树木预制件的编号匹配。X,Y,Z的值也要控制在地图地形空间范围内。
按照这样的思路,我们很快就能随机生成树木了。但是仔细想想这样就可以了么?我们的X,Y,Z是随机的坐标值,其中Y的值是游戏世界里的高度值。如果Y的值随机出来的值过大或者过小(相对于地表高度而言),那么就悲剧了,树木不是长在天上,就是长在地底下。
怎么才能让树木刚好长在地表高度上呢?这是我们遇到的难点问题。如果有一个函数刚好能找到随机出的坐标位对应的Y轴线和地标相交接的那个点的Y的值就好了。通俗的讲,就是要获取,方位在X,Z时,地表所在的Y值。
按照这个思路我们就找到了一个函数,求指定坐标对应地面高度的函数:Terrain.activeTerrain.SampleHeight(position)。
这样我们就得到地表对应的Y的值了:Y=Terrain.activeTerrain.SampleHeight(new Vector3(X,Y,Z))。
剩下的时间就是码代码的时间了,把核心难题解决了,后面的就简单了。不过需要注意的是,如果地形不是用Terrain组件来创建的,而是用的美工模型的话,就需要使用射线(Ray)来找到射线和地标相交的点。
PS:游戏DEMO试玩群:198035671 Unity3d技术交流群:308185833 斗鱼游戏开发直播地址:www.douyutv.com/unity3d