【Unity手把手教程】一、第一/三人称控制器

您所在的位置:网站首页 unity第一人称视角移动 【Unity手把手教程】一、第一/三人称控制器

【Unity手把手教程】一、第一/三人称控制器

2024-07-11 10:24| 来源: 网络整理| 查看: 265

系列文章目录

文章目录 系列文章目录前言一、新建项目二、搭建一个简单的场景三、搭建相机结构这样做的好处 四、编写代码1.锁定鼠标2.相机跟随鼠标移动旋转3.整体跟随相机方向移动4.模型跟随相机方向和移动方向旋转5.相机拉近/拉远6.相机避障 总结

前言

本文将带你从零开始实现一个第一/三人称控制器,包括相机视角旋转,拉近拉远,缓动效果,相机避障,以及基础的角色控制。

一、新建项目

首先打开Unity Hub,点击右上角蓝色的新建按钮,在弹出来的窗口中选择“3D”模板,然后输入项目名称,选择项目位置,然后点击右下角蓝色创建按钮。这里我使用的Unity是2019.3.0f6版本,Unity Hub是2.4.11版本。(无需勾选启用xxx的复选框) 新建项目 然后等待Unity启动。

二、搭建一个简单的场景

unity启动好后我们可以看到一个空项目。 空项目 我们先创建一个地面。 右键层级面板中的空白位置——3D对象——平面 在这里插入图片描述 然后创建主角,这里使用自带的胶囊 右键层级面板中的空白位置——3D对象——胶囊 在这里插入图片描述 然后鼠标拖动绿色的Y轴将胶囊挪到地面以上。 在这里插入图片描述 在层级面板里的胶囊上右键——3D对象——立方体 在胶囊节点下创建一个立方体 在这里插入图片描述 在检查器中将立方体的Transform组件下的位置的z值改为1,将立方体移到胶囊的前面,方便我们观察模型的转向。当然你也可以适当调整立方体的缩放,使其美观一点。 在这里插入图片描述 右键层级面板中的空白位置——创建空对象 创建一个空对象并将其重命名为“Player”,当然不进行重命名也是可以的。 在这里插入图片描述 然后在层级面板中将胶囊节点拖到Player节点下 在这里插入图片描述 一个简单的场景就搭建好了,下面我们正式开始制作第一/三人称控制器。

三、搭建相机结构

在Player节点下创建一个空对象子节点,并重命名为“h”,用来控制相机的横向旋转。 在这里插入图片描述 在h节点下创建一个空对象子节点,并重命名为“v”,用来控制相机的纵向旋转。在这里插入图片描述 然后在层级面板中将场景里自带的Main Camera拖到v节点下。 在这里插入图片描述 适当修改h节点的Transform组件下的位置的y值,使相机注视胶囊的中上部。 至此,相机结构就搭建好了,接下来,我们将进行代码的编写。在实际环境中,你可以将胶囊节点替换为自己的模型,不过需要注意的是,胶囊是自带碰撞盒的,换成自己的模型需要手动添加碰撞盒组件。

这样做的好处 通过h和v两个节点分别控制相机横向和纵向的旋转,可以有效地避免万向节死锁。相机的localPosition的z值表示的就是相机的远近,可以通过调整该值达到拉近/拉远相机的效果。相机的localPosition的x值表示的就是相机左右偏移量,可以通过调整该值达到相机偏移的效果。相机偏移量为0时,将注视h节点,可以通过调整h节点的localPosition的y值达到调整相机高度的效果。通常人物模型的高度不是固定的,因此此效果将非常有效。 四、编写代码

在正式编写代码之前,我们先将要进行的工作整理为一个列表。

锁定鼠标 相机跟随鼠标移动旋转 整体跟随相机方向移动 模型跟随相机方向和移动方向旋转 相机拉近/拉远 相机避障 1.锁定鼠标

将下面的项目/控制台面板切换到项目标签。 右键空白区域——创建——文件夹,重命名为“Script”,用来存放我们即将编写的脚本。 双击进入Script文件夹。 右键空白区域——创建——C#脚本,重命名为“CursorLockHide”,意为鼠标锁定隐藏。 在这里插入图片描述 双击该文件,打开Visual Studio进行编辑。 我们需要实现的效果是,进入游戏自动锁定并隐藏鼠标,按住左alt键显示鼠标,松开左alt键再次锁定并隐藏鼠标。 所以我们在Start方法中输入以下代码:

Cursor.lockState = CursorLockMode.Locked;

这样即可实现进入游戏自动锁定并隐藏鼠标。 你也可以将你的Start方法改写成这样:

void Start() => Cursor.lockState = CursorLockMode.Locked;

下面我们来实现按住左alt键显示鼠标,松开左alt键再次锁定并隐藏鼠标的效果。 在Update方法中输入以下代码:

if(Input.GetKeyDown(KeyCode.LeftAlt)) { Cursor.lockState = CursorLockMode.None; } else if(Input.GetKeyUp(KeyCode.LeftAlt)) { Cursor.lockState = CursorLockMode.Locked; }

这样即可实现按住左alt键显示鼠标,松开左alt键再次锁定并隐藏鼠标的效果。 现在,我们可以将这个脚本拖到Player节点上,并点击运行测试一下。 完整的CursorLockHide脚本如下:

using System.Collections; using System.Collections.Generic; using UnityEngine; public class CursorLockHide : MonoBehaviour { void Start() { Cursor.lockState = CursorLockMode.Locked; } void Update() { if (Input.GetKeyDown(KeyCode.LeftAlt)) { Cursor.lockState = CursorLockMode.None; } else if (Input.GetKeyUp(KeyCode.LeftAlt)) { Cursor.lockState = CursorLockMode.Locked; } } } 2.相机跟随鼠标移动旋转

右键空白区域——创建——C#脚本,重命名为“CameraCtrl”,意为相机控制。 之前讲到,我们的相机旋转是通过控制h节点和v节点的旋转实现的,所以我们要先拿到这两个节点,我们将该脚本拖到Main Camera上,并双击编辑脚本。 要获取h节点和v节点,需要在Start方法前输入以下代码:

[Header("横向节点")] public GameObject hNode; [Header("纵向节点")] public GameObject vNode;

然后回到Unity中,点击Main Camera,将h节点和v节点拖到右侧检查器面板上Camera Ctrl脚本组件上的对应位置。在这里插入图片描述 这样我们就可以在脚本中通过代码的方式控制h节点和v节点了。 我们继续向Start方法前添加代码:

[Header("环绕速度")] public float xSpeed = 0.01f; [Header("垂直速度")] public float ySpeed = 0.01f; [Header("X向旋转")] public float rot_x = 0f; [Header("Y向旋转")] public float rot_y = 0f;

xSpeed代表横向旋转的速度,即环绕速度;ySpeed代表纵向旋转的速度,即垂直速度。 rot_x和rot_y代表了相机的初始旋转。 接着,我们向Start方法中添加代码:

// 初始化节点旋转 hNode.transform.localRotation = Quaternion.identity; vNode.transform.localRotation = Quaternion.identity; // 先横向旋转 hNode.transform.Rotate(0, rot_x, 0); // 再纵向旋转 vNode.transform.Rotate(rot_y, 0, 0);

这样相机将在进入游戏时按rot_x和rot_y进行旋转。 我们希望当鼠标为显示状态的时候,即左alt键按下的时候不进行对相机的控制,所以我们在Start方法前增加一个变量:

private bool showMouse = false;

并在Update方法中添加以下代码:

// 获得鼠标显示状态 if (Input.GetKeyDown(KeyCode.LeftAlt)) { showMouse = true; } else if (Input.GetKeyUp(KeyCode.LeftAlt)) { showMouse = false; }

然后,我们在Update后添加一个方法FixedUpdate:

void FixedUpdate() { }

这个方法将以固定时间间隔调用,所有对相机进行的操作都要写在这里,防止出现抖动的情况。 接下来,我们在FixedUpdate中输入以下代码:

if (!showMouse) { // 获取鼠标输入 float inputX = Input.GetAxis("Mouse X"); float inputY = Input.GetAxis("Mouse Y"); // 将鼠标输入乘以速度 float changeX = inputX * xSpeed; float changeY = -inputY * ySpeed; // 旋转控制节点 vNode.transform.Rotate(changeY, 0, 0); hNode.transform.Rotate(0, changeX, 0); }

现在,我们可以回到Unity中测试一下了。 你可能发现,运行游戏后鼠标的移动并不能控制相机的旋转,那是因为刚刚在代码中设置的环绕速度和垂直速度太小了,你可以在Main Camera的检查器面板中调整它们到一个合适的数值。这里,我将两个值均调成了7。 再次运行,可以看到,相机可以跟随鼠标进行360度全方位的旋转,不过,这不是我们希望看到的,因为当旋转到某个角度时将出现角色大头朝下的画面,并且此时横向的旋转与常理是反向的。因此,我们需要对相机的旋转做出一些限制。 回到CameraCtrl脚本,在Start方法前添加以下代码:

[Header("Y向旋转上限")] public float rotYMax = 70f; [Header("Y向旋转下限")] public float rotYMin = 290f;

我们希望通过这两个值来限制垂直方向的旋转。 接着,在FixedUpdate方法中旋转控制节点前添加以下代码:

// 获取v节点的本地旋转 Vector3 vRotation = vNode.transform.localEulerAngles; // 限制相机视角上下旋转 if (vRotation.x rotYMax) { changeY = rotYMax - vRotation.x; } else if (vRotation.x > 180 && vRotation.x + changeY 180 && vRotation.x + changeY 180 && vRotation.x + changeY


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3