博客
关于我
Unity 无限地形生成及玩家控制
阅读量:376 次
发布时间:2019-03-04

本文共 1922 字,大约阅读时间需要 6 分钟。

实验5.Unity 无限地形生成及玩家控制

这次实验主要实现了无限地形的生成和很常见的玩家控制相机跟随雾区设置unity简单计时器的制作

素材都是直接在unity asset store 免费下载的。

一、实验要求

目的:户外场景构建。

要求:构建一个户外开放世界游戏,为该游戏添加天空,地形,植物,并支持场景里自由漫游。
沿着任意方向持续行走1分钟,不能跑到边界。

二、软件核心代码(算法+代码文本)

对于这次实验,我主要实现了 3个部分的内容,

1.脚本设置玩家的基本移动:

在这里插入图片描述

同时给人物添加状态动画的切换,给人物添加了空格跳跃的功能:
在这里插入图片描述
实现部分核心代码:
在这里插入图片描述

**中途遇见了一个比较琐碎的问题:**character controllor刚好与人物贴合(正好包裹人物),但是运行以后角色却总是飘浮在空中。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
为了效果我把character controller的center位置调高了一点,然后又对Height进行了调节,这个地方我还是有点不懂,center既然是胶囊碰撞体与游戏对象的相对位置,为什么center位置明显调高后player才能正常落地呢?唯一的解释是player本身的位置就偏高了,但是我设置了重力,人物应该会落下….我有点搞不懂这是为什么,但是还是这样解决了。

2.设置相机平缓跟随人物移动:

在这里插入图片描述

实现部分核心代码:
在这里插入图片描述

3. 构建一个户外开放世界(天空盒,雾区,无限地形)

1)给当前scene添加一个天空盒,我在asset store下载了一些资源,然后直接把天空盒资源添加到了当前scene当中,效果如下所示。

在这里插入图片描述
下一个地形资源,稍微做一下美化。
用Terrain自带的笔刷把地形稍微刷一刷,方便测试。
在这里插入图片描述
设置雾区。
雾区可以再菜单栏Windows–>Rendering–>light settings中设置,如下图所示:
在这里插入图片描述
然后给导进去的资源添加MoveTerrain代码,使其随人物的移动而移动。
在这里插入图片描述
以上完成后效果如下:
在这里插入图片描述
(2)设置无限地形的生成:
关于怎么实现让人物在地面上跑一分钟,我想到两种方法:
a. 实现思路1:
让地形跟随着人物移动。检测到人物从地形中心移动超过地形宽度一半时,将整个地形也向前移动总宽度一半的距离。
在这里插入图片描述
实现思路核心代码:
首先对地形当前的位置及地形中心位置进行初始化,Terrain地形中心点的位置与其position中的位置有所不同,需要稍微简单算一下:
在这里插入图片描述
先查看一下地形的长度和宽度:
在这里插入图片描述
然后完成功能需要设置的变量:
在这里插入图片描述
在界面中把地形要检测的玩家进行绑定:
在这里插入图片描述
由于terrain的初始位置和中心位置是不一样的,我们用两个变量来分别记录他们。
在这里插入图片描述
检测玩家的位置,并计算玩家与地形正中心的相对距离:
在这里插入图片描述
实现思路2:
检测人物在当前地形中的位置,当玩家位置里地形块中心位置距离超过地形快总长的1/2时,新生成地形块,新地形块的位置相较于原地形向前了1/2个总长。
上面提到的方法1有个漏洞:就是我只能沿着一个方向上跑1分钟。
而现在这个方法可以让我在各个方向上跑不到头。
首先把地形设置为预设体prefab Terrain。
在这里插入图片描述
在代码里面添加:
在这里插入图片描述
既然要在场景中生成游戏物体,这句话的意思就是要获得要生成游戏物体myTerrain的引用。所以我们在预设里面绑定引用。
在这里插入图片描述
现在开始我的代码实现,因为我只让触发条件时新生成一个预设实例,所以我用了一个deltaNx,deltaNz来记录变换量。(不用的话它就疯狂生成实例,然后卡死….)
在这里插入图片描述
在初始的时候我的地形块是这样的:
在这里插入图片描述
我横着跑(沿着x轴跑,之前只能沿着z轴)成功clone以后如下图所示!
在这里插入图片描述
边界处的效果:
在这里插入图片描述

(3)Unity 简易计时器的制作:

上课刚讲到UGUI。我就试着自己做一个简单的计时器练一练手。
首先在scene里create选择UI,新建画布canvas,然后在canvas下新建Text 文本物体。
在这里插入图片描述
关于文本Text的位置有下面的一点要注意,因为我的Terrain和player全部都在下面,我最开始时惯性思维把它放在左下角了,后来发现位置有问题:
在这里插入图片描述
下面来给我的计时器添加代码,实现计时的功能:
实现很基础,稍微声明一下时分秒变量,绑定游戏中的text,写一下进位法则即可,实现代码如下所示:
在这里插入图片描述
关于Time.deltaTime的理解:
Time.deltaTime 表示从上一帧到当前帧时间,以秒为单位。比如说每秒60帧,那么Time.deltaTime就是1/60秒。

三、游戏运行效果(截图)

效果截图(部分):

四、实验心得

做实例化的时候出现了这个错误。

在这里插入图片描述

我查了一个小时,最后发现变量名敲错了,Terrain敲成Terrian了,被自己蠢哭。

转载地址:http://znyg.baihongyu.com/

你可能感兴趣的文章
NodeJS实现跨域的方法( 4种 )
查看>>
nodejs封装http请求
查看>>
nodejs常用组件
查看>>
nodejs开发公众号报错 40164,白名单配置找不到,竟然是这个原因
查看>>
Nodejs异步回调的处理方法总结
查看>>
NodeJS报错 Fatal error: ENOSPC: System limit for number of file watchers reached, watch ‘...path...‘
查看>>
nodejs支持ssi实现include shtml页面
查看>>
Nodejs教程09:实现一个带接口请求的简单服务器
查看>>
nodejs服务端实现post请求
查看>>
nodejs框架,原理,组件,核心,跟npm和vue的关系
查看>>
Nodejs概览: 思维导图、核心技术、应用场景
查看>>
nodejs模块——fs模块
查看>>
Nodejs模块、自定义模块、CommonJs的概念和使用
查看>>
nodejs生成多层目录和生成文件的通用方法
查看>>
nodejs端口被占用原因及解决方案
查看>>
Nodejs简介以及Windows上安装Nodejs
查看>>
nodejs系列之express
查看>>
nodejs系列之Koa2
查看>>
Nodejs连接mysql
查看>>
nodejs连接mysql
查看>>