Unity——第一人称控制器的实现

一、功能描述

在一个场景中实现人物的前后左右移动和跳跃功能;其中前后左右移动通过W、A、S、D方向键实现,跳跃功能通过空格键实现,并且考虑到重力作用,来调节跳跃功能。

二、功能实现

2.1创建一个Character Controller

  1. 先创建一个新的GameObject,并重命名为Player

  2. 并为其添加一个Character Controller组件

  3. 在Player下,创建一个Cylinder物体(代替人物),并将场景中的主相机(Main Camera)放于Player下

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

2.2实现相机(第一人称视角的旋转,左右)的移动

相机的视角通过鼠标mouse进行控制

  1. Assets文件夹下创建Scripts文件夹,用来保存代码文件;并在Scripts文件夹下创建CameraMove的C#文件并打开;

  2. 直接放代码,相关解释在代码里:

    //所有代码如下:
    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轴旋转

    }
    }
     
  3. 注意:摄像机和物体Cylinder的y轴差距不要很大,很大的话会出现问题,尽量重合。

  4. 保存文件,并将Camera Move文件作为组件添加给主摄像机,并把Player拖入到Player Body上,如图:

  5. 运行并调试,摄像机可以根据鼠标运动而改变视野角度。

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);
} }
}

保存文件。

  1. 添加一个新的GameObject,重命名为GroundCheck;并调整其位置于物体最下方。

  2. 为Player添加Player Movement组件,如图将各个变量加入进去

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

到此,基本功能就可以实现。

本文为博主自己根据b站上的视频学习总结,如有疑问,可以参考b站原视频:

https://www.bilibili.com/video/BV1nE411b7X8?t=1407

Unity——第一人称控制器的实现的更多相关文章

  1. 开发一个最简单的Cardboard虚拟现实应用(四)做一个Cardboard第一人称控制器

    [开源互助-原创文章,转载请说明出处]第三帖中已经创建了一个cardboard自带的demo应用,但它是不能移动的,玩家只能站在原地,通过头部转动来观察四周,除此之外,玩家并没有更多的手段与游戏场景进 ...

  2. 改造u3d第一人称控制器,使之适合Cardboard+蓝牙手柄控制

    一.在u3d编辑器中删除FPSController游戏对像中自带的Camera: 二.在u3d编辑器中将CardBoardMain游戏对像添加到FPSController的子物体: 三.修改脚本: 1 ...

  3. Unity3D 第一人称控制器 C#脚本

    CharacterMotor.cs using UnityEngine; using System.Collections; /** * @Author : www.xuanyusong.com */ ...

  4. unity第一人称如何设置

    关系图 红色菱形:脚本 白色矩形:组件 移动代码 //移动代码 public CharacterController controller;//角色控制器 public float speed = 1 ...

  5. unity中制作模拟第一人称视角下的指南针

    private int zRotation; public GameObject obj; public void Update() { //obj = GameObject.Find("C ...

  6. 【Unity3D】Unity自带组件—完成第一人称人物控制

    1.导入unity自带的Character Controllers包 2.可以看到First Person Controller组件的构成 Mouse Look() : 随鼠标的移动而使所属物体发生旋 ...

  7. 关于Unity中FPS第一人称射击类游戏制作(专题十)

    当前Unity最新版本5.6.3f1,我使用的是5.5.1f1 场景搭建 1: 导入人物模型, 手持一把枪;2: 导入碎片模型;3: 创建一个平面;4: 创建一个障碍物;5: 导入人物模型;6: 配置 ...

  8. unity中自制模拟第一人称视角

    public float sensitivityX = 5f; public float sensitivityY = 5f; public float sensitivetyKeyBoard = 0 ...

  9. unity——使用角色控制器组件+射线移动

    首先要导入unity标准资源包Character Controllers 这个标准资源包,为了方便,还添加了两外一个资源包Scripts,后者包含了一些基本的脚本个摄像机脚本. 没错,这次我们要使用其 ...

随机推荐

  1. ADO.NET数据库开发

    ADO.NET博客  ADO.NET - 张果 - 博客园 (cnblogs.com) ADO.NET官方 ADO.NET | Microsoft Docs EntityFrameWork 开始使用 ...

  2. “判断性别”Demo需求分析和初步设计(中)

    大家好~我开设了"深度学习基础班"的线上课程,带领同学从0开始学习全连接和卷积神经网络,进行数学推导,并且实现可以运行的Demo程序 线上课程资料: 本节课录像回放 加QQ群,获得 ...

  3. C#基础_枚举

    一.在学习枚举之前,首先来听听枚举的优点. 1.枚举能够使代码更加清晰,它允许使用描述性的名称表示整数值. 2.枚举使代码更易于维护,有助于确保给变量指定合法的.期望的值. 3.枚举使代码更易输入. ...

  4. linux中awk命令详解(最全面秒懂)

    一:linux中awk命令 1.awk命令简介 AWK 是一种处理文本文件的语言,是一个强大的文本分析工具. 之所以叫 AWK 是因为其取了三位创始人 Alfred Aho,Peter Weinber ...

  5. KingbaseES 全局索引

    概述:在分区表上创建的索引可分为全局索引和本地索引.全局索引包括全局非分区索引(Global Nonpartitioned Indexes)和全局分区索引(Global Partitioned Ind ...

  6. 华南理工大学 Python第1章课后小测

    1.(单选)计算机有两个基本特性:功能性和()性.(本题分数:5)A) 可存储B) 可计算C) 可通信D) 可编程您的答案:D  正确率:100%2.(单选)计算机硬件可以直接识别和执行的程序设计语言 ...

  7. VSCODE 配置远程调试环境

    以下内容为本人的著作,如需要转载,请声明原文链接微信公众号「englyf」https://www.cnblogs.com/englyf/p/16691460.html 我的需求是,在Windows桌面 ...

  8. [开源]React/Vue通用的状态管理框架,不好用你来打我👀

    为了防止被打,有请"燕双鹰"镇楼️‍♀️️‍️‍...o... 话说新冠3年,"状态管理框架"豪杰并起.群雄逐鹿,ReduxToolkit.Mobx.Vuex. ...

  9. WSUS无法发现客户端

    这几天遇到一个问题,刚装好的WSUS服务器同步完补丁后,打算上线使用.挑了几个客户端,使用注册表配置了WSUS,但是迟迟无法在控制台上看到这些客户端.由于部分客户端不在域中,无法使用组策略配置,就写了 ...

  10. 转载---Beats:如何使用Filebeat将MySQL日志发送到Elasticsearch

    在今天的文章中,我们来详细地描述如果使用Filebeat把MySQL的日志信息传输到Elasticsearch中.为了说明问题的方便,我们的测试系统的配置是这样的: 我有一台MacOS机器.在上面我安 ...