Unity3D独立游戏开发日记(一):动态生成树木

目前写的独立游戏是一个沙盒类型的游戏。游戏DEMO视频以下:php

 

提到沙盒类型的游戏,就有人给出了这样的定义:app

游戏世界离现实世界越近,自由度、随机度越高才叫沙盒游戏。所谓自由度,就是你在游戏里想干啥就干啥,想开车就开车,想走路就走路。想盖房子就盖房子,没有城管来找你麻烦。那么随机度,就是天天发生的事情不能同样,作的任务也不会就一条线路可走。ide

在个人沙盒游戏里,地形上的树木,岩石等都是随机生成的,这样不一样的人玩的地图都会不同。固然若是最后能作到地形也随机生成那就更完美了。函数

下面我就讲下树木随机生成在地图上的原理。3d

在unity3d里要想动态生成一个GameObject,那须要使用Instantiate函数加载树木的模型组件到指定的坐标位置上。视频

咱们的实现步骤以下:blog

1.在unity3d里的Assets目录下建立Prefabs文件夹,而后在其中建立Resources(重要:否则没法用代码动态加载)子文件夹,再把树木的模型预制件放入其中。游戏

2.使用Instantiate函数动态加载树木预制件ip

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

相关文章
相关标签/搜索