unity中实现经典的2d横版单向跳跃平台

news2024/9/28 13:26:51

经常玩2d横版游戏的朋友们相信对这样的效果一定对这种单向跳跃平台很熟悉:我希望我的角色可以通过跳跃跳上平台,然后在平台之上按下键盘的下键后从平台上落下

那么想要实现这样的效果具体要怎么做呢?我们还是先将想要实现的效果进行一个逻辑上的拆分:

(1)单向平台,即平台只检测上方的碰撞而不检测下方;(2)角色在平台之上的情况下通过按下键盘的下键使得角色落下平台。

关于第一点,自己其实当时是苦恼了很久的。因为unity的Collider组件当时的自己只知道作为普通的碰撞器或是触发器来进行使用,一个很粗糙的想法是时刻比较当前平台与玩家的坐标,如果平台坐标在玩家之上就作为触发器,一旦坐标低于平台就要作为碰撞器。但这个想法实际上有很大的缺陷——咱们的平台肯定不止一个,会有很多很多物体,这么多物体实时获取咱们角色的坐标显然是一件重复且开销很大的事情

就算可以用一个管理类专门来获取角色的坐标然后通知给所有的平台以解决前一个问题,角色的轴心与平台的轴心设置仍旧会很麻烦。为了方便与地面的检测我们习惯角色都是以脚底为轴心的,而平台的轴心为了实现我们的效果也最好是用顶部作为轴心,这样只要角色的脚底在平台之上了就能让平台作为碰撞器发挥作用。但实际上这么一比较仍旧会出问题:如果我的角色从平台正下方跳到平台上确实可能做到,那么如果我们的角色是从平台的左右侧试图跳上平台呢?极大可能会出现角色脚底正好挨到平台边缘,而此时平台作为碰撞器会将玩家摊开,然后又因为玩家坐标低了变成触发器。

一开始我也查找了不少博客,从一些大佬们的实现方法中了解到了Collider组件还有一种由效果器触发的方式,而unity提供的组件中恰好就有一个叫Platform Effector 2D的组件,这个组件就是专门用来让碰撞器实现2D平台效果的。

 在这个组件中,我们只需要勾选使用单向,然后将表面弧度设置为90度(一般2D游戏的单向平台都是设置为90度),这样就实现了平台进行单向碰撞检测的效果。

解决了第一个问题,我们再来解决第二个问题:如何让角色处于平台之上后按下键盘的下键让角色落下平台呢?

想要让角色落下平台,无非就是暂时屏蔽角色与平台之间的碰撞,想要实现这一效果的途径理论上来说也有很多种,但自己初次实现这个效果的时候不仅想复杂了而且还并没有达到自己理想的效果。

一开始也是查阅了一些大佬的博客,有一位大佬的方法是通过代码调整上图Plaform Effector 2D中的碰撞器遮罩。碰撞器遮罩中实际上就是我们所有图层,默认为Everything,即检测所有图层的碰撞。

那位大佬的方法是为Platform专门写一个脚本,在脚本中获取到Player的图层序号,保存碰撞器遮罩中检测的所有序号,然后在Update中实时检测一旦按下了键盘的下键,就将碰撞器遮罩的图层中的Player图层暂时剔除掉,用一个计时器来短暂计时,超过这一时间后再将Player图层重新添加回去

自己一开始确实采用的这一方法(毕竟看上去问题其实还是挺大但确实暂时实现了自己想要的效果),但这一方法属于是最笨的方法,效果也并不是那么的好:首先关于计时器,你需要自己调整好一个时间不能太短,否则可能角色还没落下平台结果就恢复了对Player图层的碰撞检测,导致角色刚落下一半就又回到了平台上,而且如果有多种角色每个角色身高胖瘦各不相同,这样的检测显然是不行的;其次,只要检测到下键就会执行一次碰撞器遮罩剔除与恢复,这无疑会浪费性能,可能很多时候我们的角色并没有在平台上,在进行其他各种行动时我们都有可能按下键,这显然会导致很多无用的操作

后来经过一番思索与优化后,我发现了问题所在:我一直在想着怎么在给平台检测玩家单独写的这个脚本之中的代码进行优化检测,那么为什么不可以逆向一下,我在玩家的移动之中来检测平台呢?更何况玩家的移动方式之类的我全都是在玩家的脚本中检测的。

我的角色检测地面的方式是学习的麦扣老师《Robbie》教程中的Raycast射线检测方式(非常感谢麦扣老师持续产出的游戏项目课程,带给了我非常多的帮助!),那么既然都用射线检测地面了,为什么不可以用射线检测平台呢?我们只需要给平台加一个Tag就可以用同款的射线方式检测了。

if (Input.GetKeyDown(KeyCode.DownArrow))
            {
                RaycastHit2D leftCheck = Raycast(new Vector2(-footOffset, 0), Vector2.down, groundDistance, groundLayer);
                RaycastHit2D rightCheck = Raycast(new Vector2(footOffset, 0), Vector2.down, groundDistance, groundLayer);

                if (leftCheck.collider.CompareTag("Platform") || rightCheck.collider.CompareTag("Platform"))
                {
                    coll.enabled = false;
                }
            }

protected void PhysicsCheck()
    {
        RaycastHit2D leftCheck = Raycast(new Vector2(-footOffset,0), Vector2.down, groundDistance, groundLayer);
        RaycastHit2D rightCheck = Raycast(new Vector2(footOffset, 0), Vector2.down, groundDistance, groundLayer);
        if(leftCheck || rightCheck)
        {
            if(coll.enabled == false && (leftCheck.collider.CompareTag("Ground") || rightCheck.collider.CompareTag("Ground")))
            {
                coll.enabled = true;
            }
        }
    }

于是在玩家移动的代码中我额外加了上图部分,只要按下下键我就从左脚与右脚发出向下的射线进行检测,如果检测到了平台那么我就暂时关闭玩家的碰撞器,随后在玩家检测地面碰撞的时候如果检测到左脚或右脚接触地面,并且此时的碰撞器是关闭的,我们就将碰撞器重新开启即可。

至此,已经基本实现了我们想要的单向平台,并且玩家按下键盘下键后角色可以从平台上落下的效果。不过我的这种实现方式仍有待完善,目前已知的问题是偶尔不知道为什么会在按下下键的碰撞检测时报错(但实际上效果并未受到影响);然后目前必须得在玩家落下平台接触到地面后才会恢复碰撞体,如果存在一段连续向下且只有平台的关卡,那么这种方式就需要更改了,可能得结合一下前面的计时器思路手动加一个玩家碰撞体恢复的计时器。或者还可以在PhysicsCheck中关于恢复碰撞体的条件判断那里做一点文章,不过暂时也没想出来具体怎么更改。如果大佬们有更好的想法欢迎在评论区中进行讨论!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

微服务分布式搜索引擎 ElasticSearch 搜索结果处理 排序、分页与高亮

文章目录 ⛄引言一、排序⛅普通字段排序⚡地理坐标排序 二、分页⌚基本分页⏰深度分页 三、高亮⚡实现高亮 ⛵小结 ⛄引言 本文参考黑马 分布式Elastic search Elasticsearch是一款非常强大的开源搜索引擎,具备非常多强大功能,可以帮助我们从海量数据中…

python 实现模糊聚类

python模糊聚类细节与实现 前言数学逻辑代码框架Python实现数据预处理 preProcess获得相似矩阵 getSimilarityMatrix获取传递闭包 transitiveClosure模糊运算 fuzzMatrixProduct实现聚类 mergeProcess 实例演示 ![在这里插入图片描述](https://img-blog.csdnimg.cn/b062c59c282…

【Redis】持久化机制详解:从RDB到AOF,你需要知道的一切

本文目录 RDB(默认) 自动触发 🆚 手动触发 优点 缺点 何时会触发RDB快照 AOF 启用 AOF 配置路径 AOF 文件📃 AOF 的写回策略 AOF 的重写机制 优点 缺点 RDB & AOF 优先级 终极方案:RDB AOF 混合方…

城市轨道交通自动售检票系统

概述 城市轨道交通自动售检票系统(AFC)是基于计算机、通信、网络、自动控制等技术,实现轨道交通售票、检票、计费、收费、统计、清分、管理等全过程的自动化系统。可以提高轨道交通的运营效率,满足乘客的快速出行需求&#xff0c…

看完张一鸣近十年微博,我总结了这些成长特质

从程序员到 CEO 关注我的朋友,很多都是技术背景,之前在一个知乎回答里提到过,技术人在创业过程中并不占优势。 编程和创业是两个不同的体系,大部分技术工程师在工作中,解决的往往是一个限定的问题,而创业是…

【分享】ChatGPT的key,用key免费使用ChatGPT(每天更新)

1、ChatGPT用法总结: 自动化文本生成:可以用GPT生成文章、新闻、文本摘要,甚至小说、诗歌等文学作品。语音生成:结合语音合成技术,GPT可以生成自然流畅的语音,可以用于语音助手、交互式语音应用等。问答系统…

MobileViT神经网络模型

官方源码(Pytorch实现) : https://github.com/apple/ml-cvnets 原文链接:https://blog.csdn.net/qq_37541097/article/details/126715733 霹雳吧啦Wz从ml-evnets仓库中剥离的代码: deep-learning-for-image-processing/pytorch_classification/MobileViT at master…

AWE 2023:科技与艺术的结晶 三星展台亮点回顾

2023年4月27~30日,AWE 2023中国家电及消费电子博览会在上海新国际博览中心盛大举行。 作为全球三大消费电子展之一,每一年的AWE都汇聚了全球家电及消费电子领域最前沿、最尖端的科技和产品,因而向来都被业界人士视为整个行业的风向标。本届AW…

【读书笔记】《深入浅出数据分析》

我最大的收获 试想你在经历一场英语考试,还有两分钟就要交卷了,而你还没有开始写作文。此时,你会怎么做? 利用2分钟时间写出的第一段,还是只写关键句子,搭出文章的开头、过程、结尾? 后者更加明…

【LeetCode】91. 解码方法

91. 解码方法(中等) 思路 这其实是一道字符串类的动态规划题,不难发现对于字符串s的某个位置i而言,我们只关心「位置 i 自己能否形成独立 item」和「位置 i 能够与上一位置(i-1)能否形成item 」&#xff0c…

无人机测试二维码降落。

一、首先要做的就是让NX板卡驱动usb摄像头: 1. 下载usb_cam软件包 sudo apt install ros-melodic-usb-cam2. 启动相机节点: A. 查找摄像头接口 ls /dev/video*B. 在该路径下修改launch文件,换成你自己的摄像头接口 我这里的摄像头接口为…

PySpark基础入门(3):RDD持久化

RDD的持久化 RDD 的数据是过程数据,因此需要持久化存储; RDD之间进行相互迭代的计算,新的RDD的生成代表着旧的RDD的消失;这样的特性可以最大化地利用资源,老旧地RDD可以及时地从内存中清理,从而给后续地计…

电脑发挥极致,畅游永恒之塔sf

随着22寸显示器的普及,玩永恒之塔势必会对显示卡造成了很大负担。不要说效果全开,就连简洁的玩,都成了问题,那是不是就要重金把才买的显示卡又要拿掉呢? 最出众的解决办法,是超频。 主要就具有以下条件最佳…

Azure DevOps Server 数据还原方式三:增量还原

Contents 1. 概述2. 操作方式 2.1 创建共享文件夹,并将备份文件复制到共享文件夹中2.2 还原数据3 验证还原的数据库 3.1 方式一:核对工作项所在的表的数据3.2 方式二:将数据库配置到应用层,在应用中验证数据4. 常见问题&#xff1…

FAST协议解析1 通过输入输出逆解析

一、前言 FAST协议可以支持金融机构间高吞吐量、低延迟的数据通讯,目前我知道的应用领域是沪深交易所的Level-2行情传输。网络上无论是FAST协议本身,还是使用相关工具(openfast、quickfast)对FAST行情进行解析,相关的…

MC9S12G128开发板—解决小车九宫格方位移动功能实现遇到的一些问题

接着我的上一篇文章:MC9S12G128开发板—实现按键发送CAN报文指示小车移动功能。本篇文章主要记录下在实现小车九宫格方位移动功能过程中,遇到的一些程序问题以及解决措施。 1. 上位机小车响应开发板按键CAN报文指令的响应出错问题 问题现象描述&#x…

自动驾驶行业观察之2023上海车展-----车企发展趋势(1)

新势力发展趋势 小鹏汽车:发布新车G6(中型SUV),将于2023年年中上市 发布新车G6:车展上,小鹏G6正式首发亮相,定位中型SUV,对标Tesla Model Y,将于2023年年中上市并开始交…

基于web的商场商城后台管理系统

该系统用户分为两类:普通员工和管理员。普通员工是指当前系统中的需要对商品和客户的信息进行查询的人。此类用户只能查看自己的信息,以及对商品和客户的信息进行查看。管理员用户可以对自己和他人的信息进行维护,包括对商品入库、销售、库存…

Redis缓存过期淘汰策略

文章目录 1、如何设置 Redis 最大运行内存?2、过期删除策略3、内存淘汰策略 1、如何设置 Redis 最大运行内存? 在配置文件 redis.conf 中,可以通过参数 maxmemory 来设定最大运行内存,只有在 Redis 的运行内存达到了我们设置的最…

代码命名规范

日常编码中,代码的命名是个大的学问。能快速的看懂开源软件的代码结构和意图,也是一项必备的能力。那它们有什么规律呢? Java项目的代码结构,能够体现它的设计理念。Java采用长命名的方式来规范类的命名,能够自己表达…