Unity官方FPS教程解析(四)

         这次我们不会讲Player Weapons Manager脚本,虽然同上一期分析的脚本属于一个Manager文件夹,但是其实没有必要连在一起,因为我写这个系列也主要是为了那些像我一样的新手甚至刚入门的各位的,这个时候就要考虑脚本的实际作用的联系而不是层次上的联系了,个人认为武器属于FPS的核心但是也是同时次要的,在开发中我们设计的时候必须逐步完善一个个问题,所以说了这么多废话,当下的意思就是把整个角色本体控制讲完之后,敌人讲完之后我们在来了解武器交互。

        回归正文,这次我们要说的是这个脚本Player Character Controller

通过观察这张图大家也可以大致了解这个脚本的功能,角色控制的具体实现就在这里面了。

同样的,先看函数集合

除了三个处理流程的官方函数以外,还剩下9个函数,我们先讲解这9个函数之后再返回来解析处理流程。

1.OnDie() //角色死亡预处理

 这里可以看出是角色死亡的时候首先将一个死亡状态布尔值给赋值为true,下面一句其实英文注释已经说明了,就是禁止死亡后角色还能切换武器(通过将武器列表置为空),然后广播一个事件,PlayerDeathEvent,后面会有函数专门接收这个事件并处理(广播的话,类似于你站在广场上叫爸爸,你没有说明谁是你爸爸,但是如果有人回头答应的就是接收信息,你和他打起来就是处理信息),所以这个函数主要就是在角色死的时候做一个目击者,然后大喊撒日朗,等管理者处理剩下的事。

2.GroundCheck() //地面检测

这个函数名字大家应该不陌生,刚开始接触unity时中文教程里面有过相应的实现教导,地面检测的话,是一个重要的条件,此处先是创建一个临时浮点变量choseGroundCheckDistance取一个二元运算值,通过判断当前是否在地面上来取对应的距离值(地面上取前一个值,否则取后面一个值)。将bool值IsGrounded置为false,以此重新判断当前是否在地面,m_GroundNormal是一个法线向量(垂直与地面的方向)。

3.HandleCharacterMovement() //角色移动处理

这个函数体可以说是整个脚本的重心,100多行结合了角色移动与视角,音效的调用,由于其中已经分类功能,所以我们分开细说

  3.1 Part1 - 角色的上下左右旋转

 第一部分,加括号这里个人认为是为了在视觉上分离各个功能区块,实际执行不影响顺序,transform.Rotate()函数,旋转控制,此处为创建一个三维向量作为角色的新的视角角度(vector3),此处就调用到了我们上一期讲到的角色输入的预处理脚本,m_InputHandler是其一个实例对象,我们转到这个函数的实现,我们就可以看到,的确是其功能调用,具体功能可以看上一期的解析,如图。

 因为此处只处理水平轴旋转,所以新的Vector3其实只有一个获取角色输入的水平轴的值在乘以定义的一个旋转速度变量以及一个旋转系数,其结果值作为角色水平轴变化时的变化量,Space.self 是指定角色的旋转一定是围绕当前角色的局部坐标的水平轴来变换的。

第二部分, 垂直轴的变换控制,这里改摄像机的旋转角度是因为这个摄像机是绑定在角色头上的,水平旋转的时候,只需角色旋转就可以让摄像机跟着转,当时垂直旋转的时候角色只有头会转,甚至如果为第一人称摄像机就是头,这里也一样,摄像机就是头,第一行功能与水平轴一致,只不过赋值对象不同罢了。第二行就是垂直旋转的角度限制,因为水平旋转是可以一周的,但是头显然做不到垂直旋转一周,最多旋转到看到自己的脚就可以了,除非角色是生化危机里面的开花头丧尸(它似乎也不行),第三句就是将加以限制之后的旋转值赋值给角色第一人称相机。其实就这么点功能,我这儿有点废话了。

3.2 Part2 -

 此处主要就是处理角色的移动与碰撞问题,如果要实现一个比较合理的移动的话,光是调用几个函数是不够的,应该考虑到各种限制与模拟问题。此处的脚本实现很细致,我们在自己理解的时候最好也想一下自己以后做的时候调优的时候用得到吗,当然现在处于摸索初期,大可不必学到就用。第一句,bool值 isSprinting 先判断当前角色是否在冲刺状态,返回的状态值存储起来为后面速度调整备用。第二句,判断当前如果角色处于冲刺状态,则设置角色下蹲后状态自动切换返回(实践出来的现象,不一定准确),函数实现如图

 其中两个形参作用为 1.crouched  角色是否蹲下了。2.ignoreObstructions  是否忽略障碍物

第一句,如果角色下蹲了,就调整角色高度(此处调整的是角色胶囊体的高)

第二句,在不忽略障碍物的条件下进行碰撞体检测,foreach循环判断是否存在

函数及形参:Collider[] OverlapCapsule(Vector3 point0(胶囊体底部中心点), Vector3 point1(胶囊体顶部中心点), float radius(胶囊体半径), int layerMask(属于哪个层));

 foreach循环检查与角色胶囊体碰撞的所有collider,有本身之外的碰撞体时,状态不可改变,类似于下图这种情况(当然也有可能本人理解错误)

 否则的话就调整下蹲或者站立高度

所以这个函数的状态分为:

1.bool crouched  为  true, bool ignoreObstructionstrue          ------>蹲下站立自由切换

2.bool crouched  为  true, bool ignoreObstructions false        ------->可以蹲下,但是无法站立

3.bool crouched  为  false, bool ignoreObstructions true        ------->可以恢复站立

4.bool crouched  为  false, bool ignoreObstructions false      ------->切换状态后自动切换回当前状态

所以经过我们分析之后发现SetCrouchingState函数的作用就是根据角色站立或蹲下不同状态做相应操作限制,并且调整不同状态的高度显示。

由于这里间隔上一个语句较远了所以我们重新贴一下图片:

 

 

float  speedModifier 判断当前是否为冲刺状态然后根据状态赋予不同速度值

Vector3 worldspaceMoveInput 是根据角色输入的移动以及方向,将其变量转换为世界坐标下的向量

第一部分,处理角色在地面上的移动,所以整个代码块必须在IsGrounded成立的基础上才会执行。

①通过上面的转换后的世界向量以及声明的速度相关变量计算一个预期角色速度

②将角色速率做一个线性插值,将状态转换时的速度切换平滑处理

第二部分(④),处理角色跳跃,条件限制为当前角色在地面上并且按下了跳跃键

        4.1当角色状态无变化并且无外部障碍物限制时,首先将水平速度提出单独计算赋值。

然后向角色上方施加一个力作为角色跳跃的速率。

播放跳跃的音效。

记录上次跳跃时间,防止持续高频响应跳跃。

将地面判断置为false

第三部分(⑤),处理角色移动时的脚步音效

        float chosenFootstepSfxFrequency 取值为根据角色是否为冲刺状态选择对应的音效播放频率

        当步数频率过高时播放对应的冲刺音效,将步频记录清零直到下一次状态切换。

        当步数频率正常时,持续记录步频数

第四部分(⑧),实现角色在空中的加速度变化以及速度限制,实现重力牵引

没什么难点,而且大家看英文注释就明白了,以上的几个部分就是角色在不同状态的数值设置,每一个部分都有英文注释,我这里写的很乱属于是神志不清了,接下来的三步就是将最终计算结果赋值到角色。

 最后一个部分是根据胶囊体指定范围探测障碍物并且据此调整速度

其胶囊体探测函数参数如图:

 此处仅贴一张其中函数的调用:

4.IsNormalUnderSlopeLimit //判断当前坡度,角色能否直接移动

        

 返回一个bool比较值,比较的是当前角色的局部垂直轴和接触平面的垂直轴的角度是否大于对角色上坡角度的最大限制角,即前方接触平面是可以走的坡还是高地。

5.GetCapsuleBottomHemisphere  //直译获取当前角色胶囊下半圆弧的中心点

当前胶囊体世界坐标即为胶囊体的中心坐标沿着垂直方向乘以一个半径距离即为胶囊体中心点

6. GetCapsuleTopHemisphere //获取上半圆弧的中心点

 需要注意此处不同于上一部分,传入了一个高度值,只是因为胶囊体的上半圆的中心点是会有变化的,这是基于将一个胶囊体看作一个角色,下半圆是下体,上半圆是上身包括头部,所以可以看作脖子长度以及头部扭动等导致角色的上半顶高度降低升高,所以需要传入当前角色的高度信息再获取中心点。

7.UpdateCharacterHeight //直译就是实时获取当前角色的高度

 根据实际情况决定是否更新角色高度

即时更新高度:跳过平滑更新,直接将高度修改到目标值,同时修改瞄准点于摄像机等关联物体高度,例如游戏初始化加载时

平滑更新高度:更多的是模拟角色控制时的高度变化于关联物体的协调流畅,这将运用于整局游戏中。

总结以下:这篇文章其实是去年11月上半旬就已经完成了,但是写完以后完了发送,今天看到了草稿里面有两个这个系列的文章,才发现的,所以我随便改了一点,对于这种文章个人认为已经没有写下去的必要了,毕竟个人理解浅薄难免带歪读者,现在的chatgpt以及相关镜像等等大家都可以搜索使用,放一段代码上去解释很全面,相信用过的都知道,所以这个水文系列就此打住了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/19872.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python3 连接钉钉API接口自动发送消息到钉钉群

Python脚本以及消息发生相关设置 机器人的webhook在机器人设置里面即可查看,详细的使用教程可以到点击下面链接: 钉钉开发文档的自定义机器人 # url为机器人的webhookurl "https://oapi.dingtalk.com/robot/send?access_tokenaf22959df71e0fc1…

办公利器:用Python向钉钉发送消息

钉钉作为目前最热门的办公软件,在工作中大多数时间都在与他打交道。今天和大家分享一下如何用Python向钉钉发送消息,最终达到每日自动向指定群中发送销售日报。 新建群机器人 首先打开群设置,点击智能群助手。 选择添加自定义机器人 然后…

调用钉钉接口实现机器人推送消息

调用钉钉接口实现机器人推送消息 文章目录 调用钉钉接口实现机器人推送消息0 内容简介1 钉钉群设置2 创建自定机器人3 API开发3.1 RDS(MySQL)数据库对象类3.2 钉钉自定义机器人对象类3.3 时间调度与执行主类 0 内容简介 ​ 钉钉群机器人是一个高级扩展功能,只要有一…

钉钉企业通知消息接口(一)

车辆管理系统需要及时发送通知给钉钉用户,实现和钉钉的对接。 接口调用采用平台: GET和POST测试 目前采用的是 发送企业通知消息 - 企业通知消息发送主体是企业,体现在接收方手机上的联系人是你填写的agentid对应的微应用。 调用接口时&…

调用钉钉接口--发送工作通知消息

前言 钉钉目前是管理公司比较常用的软件,为了完善公司的管理制度,为了加强公司的管理模式,所以现在需要调用钉钉的发送消息的接口,进行企业通知消息的发送. 叙述 准备工作 获取appKey和appSecret 登入oa管理后台,点击“工作台”,点击“自…

钉钉机器人推送和抓取钉钉群消息

前言 1.钉钉机器人能干什么? 摘抄: 群机器人是钉钉群的高级扩展功能。群机器人可以将第三方服务的信息聚合到群聊中,实现自动化的信息同步。目前,大部分机器人在添加后,还需要进行Webhook配置,才可正常使…

【办公自动化】Python自动向钉钉群组发送文件

场景:定期将号码标记信息以文件形式返回给不同的供应商群组。那么,对于本地文件(图片或excel、csv等),如何实现自动发送到特定群组?本文将通过Python钉钉小程序实现该功能。 目录 1.创建钉钉小程序并配置…

【分享】零代码连接钉钉宜搭与钉钉智能人事,轻松管理员工信息

客户介绍 烟台某知名食品有限公司是中国海洋水产企业,专注海洋水产品贸易、深加工30余年,集海洋食品的科研开发、生产、全球销售一体的现代化企业集团旗下的一家子公司。成立于1992年,位于美丽的芝罘岛,占地面积约4万平方米&…

调用钉钉API发送消息通知给个人或部门

先让公司行政将你设置为管理员: 需要拥有的权限为:工作台管理,开发者权限。 登录钉钉管理后台: https://oa.dingtalk.com 首先,在开发者账号管理中添加ip白名单 https://open-dev.dingtalk.com/ 开发者信息》开发者账号管理…

接口自动化发送钉钉群消息

一,新建钉钉机器人 1.钉钉群右上角点击群设置,选择智能群助手,点击添加机器人,选择自定义机器人; 2.给机器人起个名字,消息推送开启,复制出webhook,后面会用到,勾选自定义关键词&am…

钉钉考勤对接

一、钉钉依赖包引用 <!--钉钉依赖--><dependency><groupId>com.aliyun</groupId><artifactId>alibaba-dingtalk-service-sdk</artifactId><version>2.0.0</version></dependency>二、创建应用 三、获取应用凭证 四、…

python发送钉钉消息

大家在工作中经常需要采集测试结果或生产告警&#xff0c;然后将信息处理后&#xff0c;通过自定义机器人来发送消息并到对应的人&#xff0c;让他们进行后续的处理&#xff1b; 今天我们就来把如何创建机器人&#xff0c;如何去发送消息&#xff0c;这个简单的流程给手把手的…

python实现发送钉钉消息

需求&#xff1a;企业部门本地部署的缺陷管理工具&#xff0c;企业内部使用钉钉进行工作交流&#xff0c;老板想让每天汇报项目的测试情况&#xff1b; 设计思路&#xff1a; 1、创建钉钉群机器人&#xff0c;每天发送项目测试信息&#xff08;缺陷数量、关闭数量、修复数量、…

Tio实现检测客户端是否在线发送钉钉群消息

文章目录 1.背景2.服务端实现2.1 服务端pom依赖和yml配置2.2 tio服务端WsMsgHandlerServer2.3 xxl-job定时任务扫描客户端是否在线然后发钉钉群告警消息 3.客户端实现3.1 客户端的pom依赖和yml配置3.2 客户端重试和心跳实现 4.客户端和服务端的demo分享 1.背景 Tio的官网 http…

接入钉钉API发送企业消息

工作中有个需求&#xff0c;是要把录入的销售机会由系统自动分配给销售&#xff0c;然后对接钉钉给销售人员发送企业消息&#xff0c;通知他进行跟单。 1. 获取Access_Token Access_Token是企业访问钉钉开放平台全局接口的唯一凭证&#xff0c;即调用接口时需携带Access_Token…

钉钉通知-调用钉钉发送企业内部消息开发

首先&#xff0c;我们要明确需求&#xff1a;自己的系统需要发送通知消息到用户&#xff0c;接收消息用户为同一企业内的人员&#xff0c;选用短信可能涉及到费用问题&#xff0c;故可以选用钉钉或者企业微信&#xff0c;在此我使用钉钉进行发送消息。 调用钉钉发送企业内部消…

Prometheus+Alertmanager+webhook-dingtalk实现钉钉告警

文章目录 一、前提准备及规划二、安装及启动2.1 Prometheus安装启动2.2 Node_export安装启动2.3 Alertmanager安装启动2.4 Webhook-dingtalk安装启动 三、配置及测试3.1 Webhook-dingtalk配置钉钉webhook地址3.2 Alertmanager配置钉钉告警3.3 Prometheus集成Alertmanager及告警…

和chatgpt学架构02-环境搭建

目录 1 安装vs code2 vs code功能介绍3 安装nodejs4 安装vue5 在vs code打开工程总结 我们在上一篇 技术选型 里咨询了chatgpt前后端的框架选择和数据库的选择。有了框架之后就需要选择合适的开发工具了&#xff0c;继续咨询一下chatgpt 我现在选型&#xff0c;前端使用vue&am…

〖编程初学者的自我修养 - 职业规划篇①〗- 大学生选择职业前的自我认知与剖析

历时18个月&#xff0c;采访 850 得到的需求。 不管你是在校大学生、研究生、还是在职的小伙伴&#xff0c;该专栏有你想要的职业规划、简历、面试的答案。说明&#xff1a;该文属于 编程初学者的自我修养 专栏&#xff0c;购买任意白宝书体系化专栏可加入易编程社区&#xff0…

谷歌Bard被曝剽窃ChatGPT?BERT一作跳槽OpenAI,揭惊天内幕

【导读】谷歌有大麻烦了&#xff01;外媒爆料说&#xff0c;Bard的训练数据部分来自ChatGPT。谷歌可能跳到黄河里也洗不清了。 3月29日&#xff0c;外媒The Information曝出了一个惊天大瓜&#xff01; 谷歌的离职员工、已跳槽OpenAI的顶级研究员竟然曝出——Bard竟是用ChatG…