【GAD翻译馆】VR100天教程:第八天在第一人称射击中创造一个角色

发表于2017-11-20
评论6 4.7k浏览
译者:刘鸿(lewis2012)     审校:王玥亭(玥亭)

这里我们在第8天!昨天我们 为简单的第一人称设计游戏创建了一个  非常简单的地图。
今天,我去看看如何在布景中移动角色。
这是我所得到的!

创造我们的角色

我首先想到的是谁是“角色”。在我们的游戏中,我们的主角是一个我们很熟悉的。
这里是:
 

这是它的主要相机!谁知道?
如果我们仔细想想,它确实是有意义的。
当我们运行游戏时,我们看到的是摄像机对象。在FPS游戏中,我们可以看到我们的角色所看到的。这意味着我们的相机必须是角色的一部分,特别是他们的眼睛。

设置我们的角色

我们要做的第一件事是创建一个空的游戏对象,我们将它称为player,然后我们将我们的主摄像机作为一个玩家的子对象。

我想当我们想要一个角色模型时,我们会让摄像机在模型面前,但现在,我们不需要。
确保摄像机设置在位置(0,1,0),玩家设置在位置(5,1,5)。

X和Z的位置是这样我们不会从地图的边缘开始下落,Y值会给我们角色一定的高度,否则角色将面朝地面。

接下来,我们需要在游戏对象中添加一个碰撞器,这样我们在开始游戏的时候就不会脱离游戏世界。

我制造了一个胶囊碰撞器(Capsule Collider),我把高度设为2,其余的都是一样的。
我还附上了一个刚体组件,因为稍后,当我们点击键盘时,我们将不得不编写一些代码来让我们的相机移动。

在这里,我们的玩家角色如下:
 
这是我们在玩的时候会看到的:

 
如果需要,您可以给我们的角色一个网格渲染器和网格过滤器,以便您可以在“场景”选项卡中看到我们的角色。我们也得到一个很好的小阴影!


为我们的角色创造运动

现在我们有了一个角色,接下来要做的就是移动它。
我发现在FPS控制下,Unity实际上提供了一些非常好的功能:如何在游戏中制作一个第一人称游戏角色。

如果你没有像在线程中那样的fps脚本,那么你可以使用 Assets > Import Package > Player来获得这些脚本。

下载后,你所要做的就是将脚本附加到玩家的游戏对象上。

然而,既然我这样做是为了学习,我将尝试编写我自己的脚本去做类似的事情。
我要做的第一件事是创建一个名为PlayerController的新脚本,它将用于根据用户的输入来控制我们玩家的位置。

实际上我花了很多时间在谷歌上面搜索这个,结果如下。
 
代码很简单,流程如下:

1)在Awake ()函数中我们得到我们的刚体,这样我们就可以移动我们的角色了。

2)在FixedUpdate()函数中,我们使用GetAxisRaw ()来得到我们的水平和垂直移动,这样我们就可以检测用户是否在向左/右移动和向上/向下移动。

3)在Move ()函数中我们得到运动方向。我们想要创建一个移动矢量,它捕捉用户所面对的方向,我们通过transform.forward和transform.right实现。通过将所有的东西相乘,我们就得到了玩家应该根据输入而移动的方向。

4)最后,我们使运动向量标准化,然后我们用新的向量来移动我们的位置。

需要注意的是,我们必须使用刚体来移动。

在我试图通过transform.Translate移动角色之前。我发现这个函数相当于传送。如果在玩家面前有障碍,我们的角色就会从他们旁边绕过。
我也想强调,我们使用  transform.forward  和  transform.right很重要,  特别是一旦我们开始尝试让相机跟随鼠标。

当我们开始旋转我们的角色来跟随鼠标时,我们的垂直和水平的值并没有给我们所面对的方向进行调整。

例如,如果我们按W,我们就会前进。然而,如果我们向右旋转90度,再次按W,这是并像你期望的那样向前移动,你就向左移动到本应该“前进”的位置。
transform.forward  给出了玩家面临的向量,然后我们乘以我们的  垂直  值,告诉我们我们是向前还是向后。我们对transform.right 和  horizontal做同样的事情  。

旋转我们的相机

下一个问题是,我们如何让相机跟随鼠标。
有很多答案,但我认为最好的解释来自于这个Youtube视频: 如何构建一个简单的第一人称控制器。

我只是拿了相机控制器的片段。
我创建了另一个类  MouseCameraController 并将其附加到我们的  主
相机。

这个脚本使我们能够在不移动角色的情况下使用相机上下查看,但是我们希望在水平方向上改变我们的玩家的旋转值。

这是代码:

 
这段代码有很多的数学知识需要理解,让我们来看看它们。
就像前面提到的,重要的是脚本是附加到相机上的而不是主角对象上。

当我们向右看的时候,我们想要旋转角色的身体,但是当我们向上看的时候,我们不想旋转身体。

1)在我们的Start()函数中,我们要获取父元素(Player Game Object),所以我们可以在我们转动的时候旋转它。

2)在Update()中,我们创建一个向量,它将代表我们的鼠标所在的位置,我们将通过使用我们的   Mouse X 和   Mouse Y  位置来确定我们的相机将面临的位置。

接下来,我们要乘以我们创建的2个变量(Sensitivity和Smoothing)的方向。

1. Sensitivity 用于确定我们的鼠标方向的矢量有多大。数字越高,我们的鼠标越敏感,允许我们更快地旋转。

2. Smoothing 用于帮助我们将相机从原始位置均匀地移动到鼠标位置的新位置。我们使用lerp来帮助我们逐步运动而不是一次大规模的运动

3)一旦我们计算我们面临到新的方向  smoothV,我们添加到我们的  mouseLook 变量,它是我们的角色将面向的。

4)我们确保控制y旋转,因为我们不希望能够从我们面前看到我们身后。它是不自然的人体解剖学。

5)最后,旋转。我们想旋转我们的相机的本地旋转(localRotation),这意味着我们相对于它的父节点旋转游戏对象。

例如,如果我们的玩家面对90度,如果我们将相机的旋转设置为90,那么我们将在90度,相同的位置。如果我们使用localRotation,我们的角色将从面向的90度再次旋转90度。

我们通过使用我们的y值创建我们的角度,并通过作为X轴的Vector3.right角度旋转。

6)我们最后的旋转是当我们想要旋转我们的角色而不是摄像机。我们不必使用localRotation,因为玩家没有父节点(这意味着它默认为游戏世界作为父节点),所以我们只能使用旋转,尽管两者都可以正常工作。

对于我们的旋转,我们通过我们的左右鼠标移动旋转我们的角色,Vector3.up是Y轴。

就是这样!玩游戏,你应该能够在游戏世界中移动你的角色,并在我们设置的环境中碰撞。

结论

与视频教程相比,这不是很短吗?
今天我们学到了如何在游戏画面中移动和旋转角色。
重要的是要知道,Unity提供了一个标准的资产,使我们的移动变得容易,但我确实认为能够理解代码的内部工作原理是有价值的。

不管怎样,在第9天的时候,我们希望能开始探索如何在我们的玩家上装备一支枪,甚至可以开始射击一些东西!


访问 VR挑战100天的内容表
【版权声明】
已经询问原文作者,并获取原文作者翻译许可,译文获得授权。
联系原文作者JoshChang

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引

标签: