实验5.Unity 无限地形生成及玩家控制
- 一、实验要求
- 二、软件核心代码(算法+代码文本)
- **1.脚本设置玩家的基本移动:**
- **2.设置相机平缓跟随人物移动:**
- **3. 构建一个户外开放世界(天空盒,雾区,无限地形)**
- 三、游戏运行效果(截图)
- 四、实验心得
这次实验主要实现了无限地形的生成和很常见的玩家控制,相机跟随,雾区设置,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了,被自己蠢哭。