【用unity实现100个游戏之18】从零开始制作一个类CSGO/CS2、CF第一人称FPS射击游戏——基础篇1(附项目源码)

本文主要是介绍【用unity实现100个游戏之18】从零开始制作一个类CSGO/CS2、CF第一人称FPS射击游戏——基础篇1(附项目源码),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 本节最终效果
  • 前言
  • 搭建环境
  • 玩家移动控制
  • 摄像机跟随和视角
  • 人物奔跑
  • 实现跳跃
  • 斜坡顿挫感
  • 人物卡墙问题
  • 源码
  • 完结

本节最终效果

在这里插入图片描述

前言

生存和射击游戏一直是我的最爱,说起3D最普遍的应该就是射击系统了,你可以在任何情况下加入射击功能,所以我写下了这篇FPS开发记录。希望对你有帮助。

在这个项目中,你将学习如何设计和实现射击系统、武器系统、玩家控制、场景设计等方面的内容。通过这个项目,你将深入了解游戏开发中的许多核心概念和技术,并且在实践中不断提升自己。

本项目将带你从零开始逐步实现一个完整的第一人称射击游戏,并且会逐步引入一些高级功能,如特效、声音等。无论你是新手还是有经验的开发者,这个项目都将为你提供有价值的经验和知识,帮助你迈出游戏开发的第一步或者进一步提升技能。

在这个系列中,我们将探索如何创建一个引人入胜的游戏体验,同时注重代码的模块化和可扩展性。我将引导你逐步完成每个环节,同时提供必要的代码示例和解释,以便让你更好地理解游戏开发的方方面面。

无论你是想要探索游戏开发的奥秘,还是寻求提升自己的技能,这个项目都将是一个绝佳的起点。让我们一起开始这个激动人心的游戏开发之旅吧!

注意,本篇只是基础篇,所以我都会选择使用最简单的方式实现。基础篇不会有太多复杂的内容,后续看情况我会考虑出更加复杂全面的第一人称或者第三人称射击游戏,甚至多人联机功能,可以期待一下。

本节就先实现基本的第一人称角色控制。

搭建环境

为了让场景更生动,我选择第一件事是搭建一个好看的环境

这里我找了个地图素材,你也可以选择用自己喜欢的:
https://sketchfab.com/3d-models/de-dust2-cs-map-056008d59eb849a29c0ab6884c0c3d87
在这里插入图片描述
效果
在这里插入图片描述

玩家移动控制

这里我选择使用Character Controller控制玩家移动,方便快捷。
Character Controller介绍:https://docs.unity.cn/cn/2021.3/Manual/class-CharacterController.html

其实实现玩家的控制方法有很多,想了解更多的可以看我之前的介绍:
零基础带你从小白到超神16——四种方法控制人物移动之角色控制器

我们新增一个胶囊体,指代玩家,在玩家新增Character Controller组件,先保持默认参数配置即可,后面有需要我们再来调
在这里插入图片描述
新增PlayerController

private CharacterController characterController; // 角色控制器
public float speed;
public Vector3 moveDirection; // 移动方向private void Start()
{characterController = GetComponent<CharacterController>();
}private void Update()
{Move();
}// 移动
public void Move()
{float h = Input.GetAxis("Horizontal"); // 获取水平输入float v = Input.GetAxis("Vertical"); // 获取垂直输入moveDirection = transform.right * h + transform.forward * v; // 计算移动方向moveDirection = moveDirection.normalized; // 归一化移动方向,避免斜向移动速度过快characterController.Move(moveDirection * speed * Time.deltaTime); // 移动角色控制器
}

效果
在这里插入图片描述

摄像机跟随和视角

拖入摄像机为玩家的子集即可
在这里插入图片描述
控制摄像机视角,我们可以通过控制摄像机x轴实现人物上下看,玩家旋转左右看
在这里插入图片描述
新增MouseLook,挂载在摄像机,控制摄像机的旋转

public class MouseLook : MonoBehaviour
{// 鼠标灵敏度public float mouseSensitivity = 1000f;// 玩家的身体Transform组件,用于旋转public Transform playerBody;// x轴的旋转角度float xRotation = 0f;// Update在每一帧调用void Update(){// 执行自由视角查看功能FreeLook();}// 自由视角查看功能的实现void FreeLook(){// 获取鼠标X轴和Y轴的移动量,乘以灵敏度和时间,得到平滑的移动速率float mouseX = Input.GetAxis("Mouse X") * mouseSensitivity * Time.deltaTime;float mouseY = Input.GetAxis("Mouse Y") * mouseSensitivity * Time.deltaTime;// 累计x轴上的旋转量xRotation -= mouseY;// 应用摄像头的x轴旋转transform.localRotation = Quaternion.Euler(xRotation, 0f, 0f);// 应用玩家身体的y轴旋转playerBody.Rotate(Vector3.up * mouseX);}
}

效果
在这里插入图片描述
限制相机上下旋转角度

//限制旋转角度在-90到90度之间,防止过度翻转
xRotation = Mathf.Clamp(xRotation, -90f, 90f);

隐藏鼠标光标

void Start()
{// 锁定光标到屏幕中心,并隐藏光标Cursor.lockState = CursorLockMode.Locked;
}

效果
在这里插入图片描述

人物奔跑

public float walkSpeed = 10f; // 移动速度
public float runSpeed = 15f; // 奔跑速度
public float speed;
public bool isRun;//是否在奔跑// 移动
public void Move()
{//。。。isRun = Input.GetKey(KeyCode.LeftShift);speed = isRun ? runSpeed : walkSpeed;//。。。
}

效果
在这里插入图片描述

实现跳跃

前面我们使用move控制角色移动,是不带重力的,所以我们需要实现自己定义重力效果,并进行地面检测,常规的地面检测肯定是在角色脚底生成一个检测区域,但是好在CharacterController 已经为我们提供了地面检测方法.isGrounded,直接调用就行,注意:isGrounded解释是在上一步移动中控制器是否触地,也就是说只有人物调用了Move才会进行地面检测

下落速度计算原理:
1.加速度 a = Δv / Δt, 所以 Δv = a * Δt;
2.换成代码中的变量,为: velocity.y(当前帧)- velocity.y(上一帧)= gravity * Time.deltaTime;
2.简化一下,即:velocity.y += gravity * Time.deltaTime。

private bool isGround; // 判断是否在地面上
public float jumpHeight = 3f; // 跳跃高度
public Vector3 velocity; // 设置玩家Y轴的一个冲量变化(力)
public float gravity = -50f; // 设置重力
private bool isJump; // 判断是否在跳跃private void Update()
{ isGround = characterController.isGrounded; // 判断是否在地面上//模拟重力if (!isGround) velocity.y += gravity * Time.deltaTime; // 根据重力计算Y轴的速度变化Move();Jump();
}// 跳跃
public void Jump()
{isJump = Input.GetKeyDown(KeyCode.Space); // 检测是否按下跳跃键if (isJump && isGround){velocity.y = Mathf.Sqrt(jumpHeight * -2f * gravity); // 根据跳跃力度和重力计算跳跃速度}characterController.Move(velocity * Time.deltaTime);
}

效果
在这里插入图片描述

斜坡顿挫感

你的人物在下斜坡时可能会出现一个问题,人物下坡出现抖动(当然我这里没有出现,但是我这里也顺带说一下),具体的处理思路就是当我们判断在斜面时,给人物一个向下的压力,让人物没那么容易离地,而判断在斜面的方法就从人物向下打一条射线,判断射线和地面的法线如果非90度就是在斜面了

[SerializeField] private float slopeForce = 6.0f;//走斜坡时施加的力度[SerializeField] private float slopeForceRayLength = 2.0f;//斜坡射线长度(自定义量)private void Update()
{//如果处于斜坡移动if (OnSlope()){//向下增加力moveDirection.y = characterController.height / 2 * slopeForceRayLength; characterController.Move(Vector3.down * characterController.height / 2 * slopeForce * Time.deltaTime);}
}//判断是否在斜面
public bool OnSlope()
{// 如果正在跳跃,则不考虑斜坡if (isJump) return false;RaycastHit hit;Debug.DrawRay(transform.position, Vector3.down * characterController.height / 2 * slopeForceRayLength, Color.red);// 向下打出射线(检测是否在斜坡上)if (Physics.Raycast(transform.position, Vector3.down, out hit, characterController.height / 2 * slopeForceRayLength)){// 如果接触到的点的法线,不在(0,1,0)的方向上,那么人物就在斜坡上if (hit.normal != Vector3.up)return true;}return false;
}

效果
在这里插入图片描述

人物卡墙问题

如果不做任何处理,碰撞器之间是存在摩擦力的,当你的人物靠近墙面移动是,会发现人物很难移动或者被卡住,我们需要新增一个物理材质,将摩檫力设置为0
在这里插入图片描述
在这里插入图片描述
然后赋值给玩家
在这里插入图片描述

源码

源码在最后一节

完结

赠人玫瑰,手有余香!如果文章内容对你有所帮助,请不要吝啬你的点赞评论和关注,以便我第一时间收到反馈,你的每一次支持都是我不断创作的最大动力。当然如果你发现了文章中存在错误或者有更好的解决方法,也欢迎评论私信告诉我哦!

好了,我是向宇,https://xiangyu.blog.csdn.net

一位在小公司默默奋斗的开发者,出于兴趣爱好,于是最近才开始自习unity。如果你遇到任何问题,也欢迎你评论私信找我, 虽然有些问题我可能也不一定会,但是我会查阅各方资料,争取给出最好的建议,希望可以帮助更多想学编程的人,共勉~
在这里插入图片描述

这篇关于【用unity实现100个游戏之18】从零开始制作一个类CSGO/CS2、CF第一人称FPS射击游戏——基础篇1(附项目源码)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/641086

相关文章

Python如何使用__slots__实现节省内存和性能优化

《Python如何使用__slots__实现节省内存和性能优化》你有想过,一个小小的__slots__能让你的Python类内存消耗直接减半吗,没错,今天咱们要聊的就是这个让人眼前一亮的技巧,感兴趣的... 目录背景:内存吃得满满的类__slots__:你的内存管理小助手举个大概的例子:看看效果如何?1.

Python+PyQt5实现多屏幕协同播放功能

《Python+PyQt5实现多屏幕协同播放功能》在现代会议展示、数字广告、展览展示等场景中,多屏幕协同播放已成为刚需,下面我们就来看看如何利用Python和PyQt5开发一套功能强大的跨屏播控系统吧... 目录一、项目概述:突破传统播放限制二、核心技术解析2.1 多屏管理机制2.2 播放引擎设计2.3 专

Python实现无痛修改第三方库源码的方法详解

《Python实现无痛修改第三方库源码的方法详解》很多时候,我们下载的第三方库是不会有需求不满足的情况,但也有极少的情况,第三方库没有兼顾到需求,本文将介绍几个修改源码的操作,大家可以根据需求进行选择... 目录需求不符合模拟示例 1. 修改源文件2. 继承修改3. 猴子补丁4. 追踪局部变量需求不符合很

一文教你如何将maven项目转成web项目

《一文教你如何将maven项目转成web项目》在软件开发过程中,有时我们需要将一个普通的Maven项目转换为Web项目,以便能够部署到Web容器中运行,本文将详细介绍如何通过简单的步骤完成这一转换过程... 目录准备工作步骤一:修改​​pom.XML​​1.1 添加​​packaging​​标签1.2 添加

idea中创建新类时自动添加注释的实现

《idea中创建新类时自动添加注释的实现》在每次使用idea创建一个新类时,过了一段时间发现看不懂这个类是用来干嘛的,为了解决这个问题,我们可以设置在创建一个新类时自动添加注释,帮助我们理解这个类的用... 目录前言:详细操作:步骤一:点击上方的 文件(File),点击&nbmyHIgsp;设置(Setti

SpringBoot实现MD5加盐算法的示例代码

《SpringBoot实现MD5加盐算法的示例代码》加盐算法是一种用于增强密码安全性的技术,本文主要介绍了SpringBoot实现MD5加盐算法的示例代码,文中通过示例代码介绍的非常详细,对大家的学习... 目录一、什么是加盐算法二、如何实现加盐算法2.1 加盐算法代码实现2.2 注册页面中进行密码加盐2.

MySQL大表数据的分区与分库分表的实现

《MySQL大表数据的分区与分库分表的实现》数据库的分区和分库分表是两种常用的技术方案,本文主要介绍了MySQL大表数据的分区与分库分表的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有... 目录1. mysql大表数据的分区1.1 什么是分区?1.2 分区的类型1.3 分区的优点1.4 分

一文详解如何从零构建Spring Boot Starter并实现整合

《一文详解如何从零构建SpringBootStarter并实现整合》SpringBoot是一个开源的Java基础框架,用于创建独立、生产级的基于Spring框架的应用程序,:本文主要介绍如何从... 目录一、Spring Boot Starter的核心价值二、Starter项目创建全流程2.1 项目初始化(

Mysql删除几亿条数据表中的部分数据的方法实现

《Mysql删除几亿条数据表中的部分数据的方法实现》在MySQL中删除一个大表中的数据时,需要特别注意操作的性能和对系统的影响,本文主要介绍了Mysql删除几亿条数据表中的部分数据的方法实现,具有一定... 目录1、需求2、方案1. 使用 DELETE 语句分批删除2. 使用 INPLACE ALTER T

tomcat多实例部署的项目实践

《tomcat多实例部署的项目实践》Tomcat多实例是指在一台设备上运行多个Tomcat服务,这些Tomcat相互独立,本文主要介绍了tomcat多实例部署的项目实践,具有一定的参考价值,感兴趣的可... 目录1.创建项目目录,测试文China编程件2js.创建实例的安装目录3.准备实例的配置文件4.编辑实例的