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

  • 一、实验要求
  • 二、软件核心代码(算法+代码文本)
  • **1.脚本设置玩家的基本移动:**
  • **2.设置相机平缓跟随人物移动:**
  • **3. 构建一个户外开放世界(天空盒,雾区,无限地形)**
  • 三、游戏运行效果(截图)
  • 四、实验心得


这次实验主要实现了无限地形的生成和很常见的玩家控制相机跟随雾区设置unity简单计时器的制作
素材都是直接在unity asset store 免费下载的。

一、实验要求

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

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

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

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

unity player不掉下地形 unity让地形下降_游戏开发


同时给人物添加状态动画的切换,给人物添加了空格跳跃的功能:

unity player不掉下地形 unity让地形下降_游戏_02


实现部分核心代码:

unity player不掉下地形 unity让地形下降_游戏开发_03

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

unity player不掉下地形 unity让地形下降_unity_04


unity player不掉下地形 unity让地形下降_游戏开发_05


unity player不掉下地形 unity让地形下降_游戏开发_06


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

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

unity player不掉下地形 unity让地形下降_unity player不掉下地形_07


实现部分核心代码:

unity player不掉下地形 unity让地形下降_Time_08

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

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

unity player不掉下地形 unity让地形下降_unity_09


下一个地形资源,稍微做一下美化。

用Terrain自带的笔刷把地形稍微刷一刷,方便测试。

unity player不掉下地形 unity让地形下降_unity player不掉下地形_10


设置雾区。

雾区可以再菜单栏Windows–>Rendering–>light settings中设置,如下图所示:

unity player不掉下地形 unity让地形下降_unity player不掉下地形_11


然后给导进去的资源添加MoveTerrain代码,使其随人物的移动而移动。

unity player不掉下地形 unity让地形下降_unity player不掉下地形_12


以上完成后效果如下:

unity player不掉下地形 unity让地形下降_unity player不掉下地形_13


(2)设置无限地形的生成:

关于怎么实现让人物在地面上跑一分钟,我想到两种方法:

a. 实现思路1:

让地形跟随着人物移动。检测到人物从地形中心移动超过地形宽度一半时,将整个地形也向前移动总宽度一半的距离。

unity player不掉下地形 unity让地形下降_unity_14


实现思路核心代码:

首先对地形当前的位置及地形中心位置进行初始化,Terrain地形中心点的位置与其position中的位置有所不同,需要稍微简单算一下:

unity player不掉下地形 unity让地形下降_unity_15


先查看一下地形的长度和宽度:

unity player不掉下地形 unity让地形下降_Time_16


然后完成功能需要设置的变量:

unity player不掉下地形 unity让地形下降_游戏开发_17


在界面中把地形要检测的玩家进行绑定:

unity player不掉下地形 unity让地形下降_unity_18


由于terrain的初始位置和中心位置是不一样的,我们用两个变量来分别记录他们。

unity player不掉下地形 unity让地形下降_unity player不掉下地形_19


检测玩家的位置,并计算玩家与地形正中心的相对距离:

unity player不掉下地形 unity让地形下降_unity_20


实现思路2:
检测人物在当前地形中的位置,当玩家位置里地形块中心位置距离超过地形快总长的1/2时,新生成地形块,新地形块的位置相较于原地形向前了1/2个总长。
上面提到的方法1有个:就是我只能沿着一个方向上跑1分钟。
而现在这个方法可以让我在各个方向上跑不到头。

首先把地形设置为预设体prefab Terrain。

unity player不掉下地形 unity让地形下降_unity_21


在代码里面添加:

unity player不掉下地形 unity让地形下降_游戏开发_22


既然要在场景中生成游戏物体,这句话的意思就是要获得要生成游戏物体myTerrain的引用。所以我们在预设里面绑定引用。

unity player不掉下地形 unity让地形下降_unity player不掉下地形_23


现在开始我的代码实现,因为我只让触发条件时新生成一个预设实例,所以我用了一个deltaNx,deltaNz来记录变换量。(不用的话它就疯狂生成实例,然后卡死….)

unity player不掉下地形 unity让地形下降_unity player不掉下地形_24


在初始的时候我的地形块是这样的:

unity player不掉下地形 unity让地形下降_游戏开发_25


我横着跑(沿着x轴跑,之前只能沿着z轴)成功clone以后如下图所示!

unity player不掉下地形 unity让地形下降_Time_26


边界处的效果:

unity player不掉下地形 unity让地形下降_unity player不掉下地形_27

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

上课刚讲到UGUI。我就试着自己做一个简单的计时器练一练手。

首先在scene里create选择UI,新建画布canvas,然后在canvas下新建Text 文本物体。

unity player不掉下地形 unity让地形下降_Time_28


关于文本Text的位置有下面的一点要注意,因为我的Terrain和player全部都在下面,我最开始时惯性思维把它放在左下角了,后来发现位置有问题:

unity player不掉下地形 unity让地形下降_unity_29


下面来给我的计时器添加代码,实现计时的功能:

实现很基础,稍微声明一下时分秒变量,绑定游戏中的text,写一下进位法则即可,实现代码如下所示:

unity player不掉下地形 unity让地形下降_游戏开发_30


关于Time.deltaTime的理解:

Time.deltaTime 表示从上一帧到当前帧时间,以秒为单位。比如说每秒60帧,那么Time.deltaTime就是1/60秒。

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

效果截图(部分):

unity player不掉下地形 unity让地形下降_Time_31

四、实验心得

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

unity player不掉下地形 unity让地形下降_游戏开发_32

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