Unity——第一人称控制器的实现
Unity——第一人称控制器的实现
一、功能描述
在一个场景中实现人物的前后左右移动和跳跃功能;其中前后左右移动通过W、A、S、D方向键实现,跳跃功能通过空格键实现,并且考虑到重力作用,来调节跳跃功能。
二、功能实现
2.1创建一个Character Controller
先创建一个新的GameObject,并重命名为Player
并为其添加一个Character Controller组件
在Player下,创建一个Cylinder物体(代替人物),并将场景中的主相机(Main Camera)放于Player下


将Cylinder物体中的Capsule Collider组件删除,解决碰撞问题。

2.2实现相机(第一人称视角的旋转,左右)的移动
相机的视角通过鼠标mouse进行控制
Assets文件夹下创建Scripts文件夹,用来保存代码文件;并在Scripts文件夹下创建CameraMove的C#文件并打开;
直接放代码,相关解释在代码里:
//所有代码如下:
public class CameraMove : MonoBehaviour
{
//定义鼠标移动速度
public float mouseSpeed = 100f; public Transform playerBody;
float xRotation = 0f;
// Start is called before the first frame update
void Start()
{
//将鼠标隐藏
Cursor.lockState = CursorLockMode.Locked;
}
// Update is called once per frame
void Update()
{
float mouseX = Input.GetAxisRaw("Mouse X") * mouseSpeed * Time.deltaTime;
float mouseY = Input.GetAxisRaw("Mouse Y") * mouseSpeed * Time.deltaTime;
//这里的Mouse X和Mouse Y是鼠标所控制的X,Y,这里在前面新定义了一个鼠标移动的速度mouseSpeed,用来控制鼠标移动速度,Time.deltaTime是为了解决帧率问题
xRotation -= mouseY;//不能为+=,会让鼠标控制的摄像机方向颠倒
xRotation = Mathf.Clamp(xRotation, -90f, 90f);//将摄像机上下可调节范围控制在-90到90度之间
transform.localRotation = Quaternion.Euler(xRotation, 0f, 0f);
playerBody.Rotate(Vector3.up * mouseX);//绕着y轴旋转
}
}注意:摄像机和物体Cylinder的y轴差距不要很大,很大的话会出现问题,尽量重合。
保存文件,并将Camera Move文件作为组件添加给主摄像机,并把Player拖入到Player Body上,如图:

运行并调试,摄像机可以根据鼠标运动而改变视野角度。
2.3人物左右移动和跳跃
同上,在Assets文件夹下创建Scripts文件夹,用来保存代码文件;并在Scripts文件夹下创建Player Movement的C#文件并打开
直接上代码:
public class PlayerMovement : MonoBehaviour
{
public CharacterController controller; //这里是人物行走时的速度
public float walkSpeed = 5f; //人物跑动时的速度
public float runSpeed = 6f; //重力
public float gravity = -9.81f; //三维向量组x,y,z
Vector3 velocity;
public Transform groundCheck; //检测人物是否与地面碰撞的半径
public float groundDistance = 0.4f;
public LayerMask groundMask; //人物是否在地面上
bool isGrounded;
public float jumpHeight = 2f; // Start is called before the first frame update
void Start()
{ }
// Update is called once per frame
void Update()
{
//物理检测,是否在地面上
isGrounded = Physics.CheckSphere(groundCheck.position, groundDistance, groundMask); if(isGrounded && velocity.y < 0)
{
velocity.y = -2f;//正好在地面上,可以为0f,但-2f更好一些
} //跳跃 这里默认空格键是跳跃按键
if (Input.GetButtonDown("Jump") && isGrounded)
{
velocity.y = Mathf.Sqrt(jumpHeight * -2f * gravity);
} //这里在unity中默认“W”为向前,“D”向右,即通过控制x轴方向来控制物体在水平方向的运动;控制z轴,来控制物体前后移动
float x = Input.GetAxis("Horizontal");
float z = Input.GetAxis("Vertical");
Vector3 move = transform.right * x + transform.forward * z; //将控制的方向与速度相乘,就能实现物体的运动,同样,这里的Time.deltaTime也是解决帧率问题
controller.Move(move * walkSpeed * Time.deltaTime); //三维向量组中的y y=1/2*g*t*t
//重力在每一帧的变化
velocity.y += gravity * Time.deltaTime;
controller.Move(velocity * Time.deltaTime); //当同时按下键盘上的“W”和“Q”键,进入跑步
if(Input.GetKey(KeyCode.W)&& Input.GetKey(KeyCode.Q))
{
controller.Move(move * runSpeed * Time.deltaTime);
} }
}
保存文件。
添加一个新的GameObject,重命名为GroundCheck;并调整其位置于物体最下方。
为Player添加Player Movement组件,如图将各个变量加入进去

注意:如果没有Ground这个选项,可以在最上方的Layers中新建一个,并将点击场景修改图层为Ground。


到此,基本功能就可以实现。
本文为博主自己根据b站上的视频学习总结,如有疑问,可以参考b站原视频:
https://www.bilibili.com/video/BV1nE411b7X8?t=1407
Unity——第一人称控制器的实现的更多相关文章
- 开发一个最简单的Cardboard虚拟现实应用(四)做一个Cardboard第一人称控制器
[开源互助-原创文章,转载请说明出处]第三帖中已经创建了一个cardboard自带的demo应用,但它是不能移动的,玩家只能站在原地,通过头部转动来观察四周,除此之外,玩家并没有更多的手段与游戏场景进 ...
- 改造u3d第一人称控制器,使之适合Cardboard+蓝牙手柄控制
一.在u3d编辑器中删除FPSController游戏对像中自带的Camera: 二.在u3d编辑器中将CardBoardMain游戏对像添加到FPSController的子物体: 三.修改脚本: 1 ...
- Unity3D 第一人称控制器 C#脚本
CharacterMotor.cs using UnityEngine; using System.Collections; /** * @Author : www.xuanyusong.com */ ...
- unity第一人称如何设置
关系图 红色菱形:脚本 白色矩形:组件 移动代码 //移动代码 public CharacterController controller;//角色控制器 public float speed = 1 ...
- unity中制作模拟第一人称视角下的指南针
private int zRotation; public GameObject obj; public void Update() { //obj = GameObject.Find("C ...
- 【Unity3D】Unity自带组件—完成第一人称人物控制
1.导入unity自带的Character Controllers包 2.可以看到First Person Controller组件的构成 Mouse Look() : 随鼠标的移动而使所属物体发生旋 ...
- 关于Unity中FPS第一人称射击类游戏制作(专题十)
当前Unity最新版本5.6.3f1,我使用的是5.5.1f1 场景搭建 1: 导入人物模型, 手持一把枪;2: 导入碎片模型;3: 创建一个平面;4: 创建一个障碍物;5: 导入人物模型;6: 配置 ...
- unity中自制模拟第一人称视角
public float sensitivityX = 5f; public float sensitivityY = 5f; public float sensitivetyKeyBoard = 0 ...
- unity——使用角色控制器组件+射线移动
首先要导入unity标准资源包Character Controllers 这个标准资源包,为了方便,还添加了两外一个资源包Scripts,后者包含了一些基本的脚本个摄像机脚本. 没错,这次我们要使用其 ...
随机推荐
- Two---python循环语句/迭代器生成器/yield与return/自定义函数与匿名函数/参数传递
python基础02 条件控制 python条件语句是通过一条或多条语句的执行结果(Ture或者False)来执行的代码块 python中用elif代替了else if,所以if语句的关键字为:if- ...
- java学习第一天.day05
jvm的内存 栈:类方法使用后自动销毁,销毁的好处是释放内存 java方法执行时,在栈区执行 堆: 线程共享的一块内存区域 所有的对象实例以及 数组 都要在堆上分配 每次使用new ...
- Word 脚注和尾注是什么?怎么设置?
描述 脚注一般位于页面的底部,作为文档某处内容的注释.尾注一般位于文档的末尾,列出引文的出处等. 设置脚注和尾注 将光标移动到要插入脚注或尾注的地方,然后点击"引用"选项卡. 左边 ...
- linux 旁路掉协议栈的处理点
对于协议栈的发展,目前有三种处理趋势,一种是类似于使用dpdk的方式,然后将协议栈放到用户态来做,做得比较好的一般都是以bsd的协议栈为底子,可以参考的是腾讯开源的的方案,另外一种是,继续放在内核,但 ...
- 【面试题】如何去掉vue的url地址中的#号?及其原理?
如何去掉vue的url地址中的#号?及其原理? 点击打开视频讲解更加详细 如何去掉vue的url地址中的#号? import Vue from 'vue'; import VueRouter from ...
- Python入门系列(四)别再傻傻分不清:列表、元组、字典、集合的区别
总结分析列表.元组.字典.集合的相同与区别之处,只有彻底分清之后,就会在应用的时候,得心应手. 四句话总结 列表是一个有序且可更改的集合,允许重复成员. 元组是一个有序且不可更改的集合,允许重复成员. ...
- CF-1453B
Problem - 1453B - Codeforces 题意: 一个数组,每次可以选择一个后缀,将其加一或者减一,开始的时候可以免费改变一个数的数值,判断让所有数字相等所需要的最小操作数. 题解: ...
- ar9485 win10 笔记本电脑 无线网间歇性掉线
问题 新安装了系统,刚开始上网正常,下载东西或者待机一段时间后掉线了. wifi都能搜到,就是连不上,重启电脑可以解决,但是每次重启很麻烦,必须找到治本的方法. 排除问题 1.手机连接没有问题,排除 ...
- KingbaseES V8R6C5禁用root用户ssh登录图形化部署集群案例
案例说明: 对于KingbaseES V8R6C5版本在部集群时,需要建立kingbase.root用户在节点间的ssh互信,如果在生产环境禁用root用户ssh登录,则通过ssh部署会失败:在图形化 ...
- Golang实现set
背景 Golang语言本身未实现set,但是实现了map golang的map是一种无序的键值对的集合,其中键是唯一的 而set是键的不重复的集合,因此可以用map来实现set Empty 由于map ...