• 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

  • 相关阅读:
    C# winform中使用contextMenuStrip作为右键菜单时,菜单项失效的问题
    Helix 3D toolkit初尝试
    Image.save引发的“GDI+发生一般性错误”
    WPF浏览器程序的发布问题
    SVN checksum mismatch
    Fedora 13 nVidia家的显卡也有开源3D驱动了
    关于package 'Visual Web Developer HTML Source Editor Package' has failed to load
    MongoDB .NET Driver 1.1 Bug导致MongoDB拒绝连接
    Nginx导致页面发送给错误的用户
    ArchLinux的一些知识
  • 原文地址:https://www.cnblogs.com/wangergo/p/5001786.html
Copyright © 2020-2023  润新知