惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

V2EX - 技术
V2EX - 技术
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
宝玉的分享
宝玉的分享
F
Fortinet All Blogs
T
Tailwind CSS Blog
IT之家
IT之家
B
Blog
D
DataBreaches.Net
博客园 - 【当耐特】
G
Google Developers Blog
WordPress大学
WordPress大学
S
Securelist
A
Arctic Wolf
Project Zero
Project Zero
T
Tenable Blog
P
Privacy International News Feed
The GitHub Blog
The GitHub Blog
D
Darknet – Hacking Tools, Hacker News & Cyber Security
S
Schneier on Security
L
LINUX DO - 热门话题
T
Threat Research - Cisco Blogs
P
Privacy & Cybersecurity Law Blog
M
MIT News - Artificial intelligence
Scott Helme
Scott Helme
Google DeepMind News
Google DeepMind News
Simon Willison's Weblog
Simon Willison's Weblog
C
CERT Recently Published Vulnerability Notes
雷峰网
雷峰网
The Register - Security
The Register - Security
T
Threatpost
Recorded Future
Recorded Future
C
Cyber Attacks, Cyber Crime and Cyber Security
AWS News Blog
AWS News Blog
D
Docker
Cyberwarzone
Cyberwarzone
PCI Perspectives
PCI Perspectives
L
LangChain Blog
C
CXSECURITY Database RSS Feed - CXSecurity.com
腾讯CDC
T
The Exploit Database - CXSecurity.com
V
V2EX
S
Secure Thoughts
Hacker News - Newest:
Hacker News - Newest: "LLM"
AI
AI
阮一峰的网络日志
阮一峰的网络日志
Schneier on Security
Schneier on Security
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
B
Blog RSS Feed
J
Java Code Geeks
酷 壳 – CoolShell
酷 壳 – CoolShell

博客园 - 王传炜

Unity Networking API文档翻译(二):The High Level API Unity Networking API文档翻译(一):Networking概述 Unity3D独立游戏开发日记(二):摆放建筑物 如何申请TexturePacker 我的个人总结 《windowsPhone游戏开发实战》 如何在WP7上用XNA写2D游戏(六) 写在"CastleDefense"上市1周月之际 如何在WP7上用XNA写2D游戏(五) 如何在WP7上用XNA写2D游戏(四) 如何在WP7上用XNA写2D游戏(三) 如何在WP7上用XNA写2D游戏(二) 如何在WP7上用XNA写2D游戏(一) 我的2010年 Silverlight MMORPG WebGame游戏设计(七)-----IsolatedStorage,想说爱你不容易 Silverlight MMORPG WebGame游戏设计(六)-----Server和Client的婚后协议[附上完整15M游戏DEMO] Silverlight MMORPG WebGame游戏设计(五)-----Client的嫁妆 - 王传炜 Silverlight MMORPG WebGame游戏设计(四)-----Client:Server!房子啥时候装好?我急嫁人啊! Silverlight MMORPG WebGame游戏设计(三)-----Server和Client的暗号
Unity3D独立游戏开发日记(一):动态生成树木
王传炜 · 2015-11-27 · via 博客园 - 王传炜

目前写的独立游戏是一个沙盒类型的游戏。游戏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