Unity 无限地形生成及玩家控制

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

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

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

一、实验要求

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

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

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

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

Unity 无限地形生成及玩家控制_第1张图片
同时给人物添加状态动画的切换,给人物添加了空格跳跃的功能:
Unity 无限地形生成及玩家控制_第2张图片
实现部分核心代码:
Unity 无限地形生成及玩家控制_第3张图片

**中途遇见了一个比较琐碎的问题:**character controllor刚好与人物贴合(正好包裹人物),但是运行以后角色却总是飘浮在空中。
Unity 无限地形生成及玩家控制_第4张图片
Unity 无限地形生成及玩家控制_第5张图片
Unity 无限地形生成及玩家控制_第6张图片
为了效果我把character controller的center位置调高了一点,然后又对Height进行了调节,这个地方我还是有点不懂,center既然是胶囊碰撞体与游戏对象的相对位置,为什么center位置明显调高后player才能正常落地呢?唯一的解释是player本身的位置就偏高了,但是我设置了重力,人物应该会落下….我有点搞不懂这是为什么,但是还是这样解决了。

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

Unity 无限地形生成及玩家控制_第7张图片
实现部分核心代码:
Unity 无限地形生成及玩家控制_第8张图片

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

1)给当前scene添加一个天空盒,我在asset store下载了一些资源,然后直接把天空盒资源添加到了当前scene当中,效果如下所示。
Unity 无限地形生成及玩家控制_第9张图片
下一个地形资源,稍微做一下美化。
用Terrain自带的笔刷把地形稍微刷一刷,方便测试。
Unity 无限地形生成及玩家控制_第10张图片
设置雾区。
雾区可以再菜单栏Windows–>Rendering–>light settings中设置,如下图所示:
Unity 无限地形生成及玩家控制_第11张图片
然后给导进去的资源添加MoveTerrain代码,使其随人物的移动而移动。
在这里插入图片描述
以上完成后效果如下:
Unity 无限地形生成及玩家控制_第12张图片
(2)设置无限地形的生成:
关于怎么实现让人物在地面上跑一分钟,我想到两种方法:
a. 实现思路1:
让地形跟随着人物移动。检测到人物从地形中心移动超过地形宽度一半时,将整个地形也向前移动总宽度一半的距离。
Unity 无限地形生成及玩家控制_第13张图片
实现思路核心代码:
首先对地形当前的位置及地形中心位置进行初始化,Terrain地形中心点的位置与其position中的位置有所不同,需要稍微简单算一下:
Unity 无限地形生成及玩家控制_第14张图片
先查看一下地形的长度和宽度:
Unity 无限地形生成及玩家控制_第15张图片
然后完成功能需要设置的变量:
在这里插入图片描述
在界面中把地形要检测的玩家进行绑定:
在这里插入图片描述
由于terrain的初始位置和中心位置是不一样的,我们用两个变量来分别记录他们。
Unity 无限地形生成及玩家控制_第16张图片
检测玩家的位置,并计算玩家与地形正中心的相对距离:
Unity 无限地形生成及玩家控制_第17张图片
实现思路2:
检测人物在当前地形中的位置,当玩家位置里地形块中心位置距离超过地形快总长的1/2时,新生成地形块,新地形块的位置相较于原地形向前了1/2个总长。
上面提到的方法1有个漏洞:就是我只能沿着一个方向上跑1分钟。
而现在这个方法可以让我在各个方向上跑不到头。

首先把地形设置为预设体prefab Terrain。
Unity 无限地形生成及玩家控制_第18张图片
在代码里面添加:
在这里插入图片描述
既然要在场景中生成游戏物体,这句话的意思就是要获得要生成游戏物体myTerrain的引用。所以我们在预设里面绑定引用。
在这里插入图片描述
现在开始我的代码实现,因为我只让触发条件时新生成一个预设实例,所以我用了一个deltaNx,deltaNz来记录变换量。(不用的话它就疯狂生成实例,然后卡死….)
Unity 无限地形生成及玩家控制_第19张图片
在初始的时候我的地形块是这样的:
Unity 无限地形生成及玩家控制_第20张图片
我横着跑(沿着x轴跑,之前只能沿着z轴)成功clone以后如下图所示!
Unity 无限地形生成及玩家控制_第21张图片
边界处的效果:
Unity 无限地形生成及玩家控制_第22张图片

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

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

效果截图(部分):

Unity 无限地形生成及玩家控制_第25张图片

四、实验心得

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

在这里插入图片描述

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

你可能感兴趣的:(游戏程序设计,游戏,游戏开发,unity)