在进行2D游戏开发时,跳跃是不可缺少的一个重要功能。但是我们在Unity开发时Unity本身的物理引擎并不能提供很好的的手感,下落的时候轻飘飘的,这操作起来显然非常不舒服。所以,我们需要自己对跳跃进行优化,以此来获得更好的手感。我们不难发现,在绝大多数2D游戏的跳跃中,下落的速度比上升的速度要快上很多,下落的用时是上升的一半左右。

提示,在优化跳跃时,将使用刚体组件

首先,我们需要对Unity物体跳跃阶段进行分析:

图中,跳跃共分为两个阶段,第一阶段就是跳起,人物上升阶段,第二阶段就是下落阶段

在第一阶段中,刚体向上速度为正,即velocity.y>0;第二阶段下落,物体的velocity.y<0,所以我们可以通过velocity.y的正负来确定物体所处哪一个阶段,进而对物体可以有更精确的操作。

接下来,我们就要对物体跳跃阶段进行操作,首先我们需要判定物体受否在面上,并且按下了W或其它跳跃按键,触发跳跃后,我们给物体的velocity.y赋一个初始值V,代表初始速度,那么最终跳跃高度的变化为h=Vt-1/2gt2(g为重力加速度,t为时间),物体速度velocity.y=V-gt,当velocity.y=0时,物体到达最高点,此时物体高度(最高点)H=(V2)/(2g)。

接下来,物体仍然受到重力加速度的作用,物体速度velocity.y的值继续减小,变为了负值,而这也标志着物体开始下落。从图中可以看出当物体只具有一个向上的初速度并且只受重力时,它的上升时间和下落时间是一样的,T=V/g。所以,我们为了确保下落用时是上升的一半,所以我们需要改变物体的重力加速度,使它变为原来的二倍,即修改Physics2D.gravity的值,使它的y的值乘2。

这样我们就完成了一个跳跃的优化。代码如下:

//提示!本代码使用射线检测物体是否位于地面
//提示!各变量含义
//rb 刚体组件
//jumpSpeed 跳跃初始速度
//fullSpeed 下落重力加速度倍数
//isGround 玩家是否在地面
//rayDistance 射线距离
//groundLayerMask 地面的图层
void Update()
{
Ground();
if (Input.GetKeyDown(KeyCode.W) && isGround)
{
Jump();
}
if (rb.velocity.y <= 0)
{
Full();
}
}
private void Jump()
{
rb.velocity = Vector2.up * jumpSpeed;
}
private void Full()
{
//重力加速度变为fullSpeed倍
Physics2D.gravity = new Vector2(0, -9.8f * fullSpeed);
}
//射线检测,是否在地面
private void Ground()
{
// 从物体下方投射一条射线,看它是否与地面碰撞
RaycastHit2D hit=
Physics2D.Raycast(transform.position,Vector2.down,rayDistance,groundLayerMask);
if (hit.collider != null)
{
isGround = true;
}
else
{
isGround = false;
}
}

Unity进阶提升-2D游戏跳跃手感优化(跳起下落)的更多相关文章

  1. Unity 横版2D移动跳跃问题——关于一段跳与二段跳

    1.初始条件: 1.角色只绑定一个碰撞体,移动时施加力或给予速度,用跳跃次数JumpTimes或者bool值OnGround判断是否在地面. 2.只用一个tilemap搭建2D场景,因此所有tilem ...

  2. Unity 3D制作2D游戏的几种方法

    1.使用本身UGUI. 2.把摄像机的投影改为正交投影,不考虑Z轴. 3.使用Untiy自身的2D模式. 4.使用2D TooKit插件.

  3. Unity 4.3 2D 教程:新手上路

    这篇文章译自 Christopher LaPollo 先生的 Unity 4.3 2D 教程的第一部分 Unity 4.3 2D Tutorial: Getting Started 感谢这套优秀教程的 ...

  4. 2d游戏和 3d游戏的区别

    2D游戏和3D游戏的主要区别 一.总结 一句话总结:2D中的单位就是贴图,3D中的单位还有高 1. 3D 和 2D 游戏的区别主要体现在呈现画面和文件体积上: 2. 借助 3D 引擎可以提升 2D 游 ...

  5. 海外开发者推荐:10个顶级2D游戏资源站

    转自:http://www.gamelook.com.cn/2015/12/239038 Gamelook报道/随着手游市场的持续增长,HTML5的发展以及大型发行商的支持,2D游戏的数量变得越来越多 ...

  6. Unity 2D游戏开发教程之游戏中精灵的跳跃状态

    Unity 2D游戏开发教程之游戏中精灵的跳跃状态 精灵的跳跃状态 为了让游戏中的精灵有更大的活动范围,上一节为游戏场景添加了多个地面,于是精灵可以从高的地面移动到低的地面处,如图2-14所示.但是却 ...

  7. 介绍用C#和VS2015开发基于Unity架构的2D、3D游戏的技术

    [Unity]13.3 Realtime GI示例 摘要: 分类:Unity.C#.VS2015 创建日期:2016-04-19 一.简介 使用简单示例而不是使用实际示例的好处是能让你快速理解光照贴图 ...

  8. 【使用Unity开发Windows Phone上的2D游戏】(1)千里之行始于足下

    写在前面的 其实这个名字起得不太欠当,Unity本身是很强大的工具,可以部署到很多个平台,而不仅仅是可以开发Windows Phone上的游戏. 只不过本人是Windows Phone 应用开发出身, ...

  9. Unity 2D游戏开发教程之精灵的死亡和重生

    Unity 2D游戏开发教程之精灵的死亡和重生 精灵的死亡和重生 目前为止,游戏项目里的精灵只有Idle和Walking这两种状态.也就是说,无论精灵在游戏里做什么,它都不会进入其它的状态,如死亡.于 ...

  10. Unity 2D游戏开发教程之摄像头追踪功能

    Unity 2D游戏开发教程之摄像头追踪功能 上一章,我们创建了一个简单的2D游戏.此游戏中的精灵有3个状态:idle.left和right.这看起来确实很酷!但是仅有的3个状态却限制了精灵的能力,以 ...

随机推荐

  1. PDF书签的编辑器,基于(python、Tkinter)

    使用 脚本 在github下载源码. 安装python3 安装必要的python包 pip install numpy pip install pandas pip install PyMuPDF p ...

  2. 2022级HAUT新生周赛题解汇总

    2022级HAUT新生周赛(零)题解@:前六题题解  G题比赛模拟题目题解 2022级HAUT新生周赛(一)题解@卞子骏:题解 2022级HAUT新生周赛(二)题解@武其轩:题解  题解2 2022级 ...

  3. linux下创建虚拟环境

    安装虚拟环境: 1 sudo apt-get install virtualenvwrapper 配置环境变量: 1.创建目录用于存放虚拟环境. 1 mkdir $HOME/.virtualenvs ...

  4. quarkus依赖注入之五:拦截器(Interceptor)

    欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 本文是<quarkus依赖注入> ...

  5. Redis从入门到放弃(7):主从复制

    1.概念 主从复制是Redis的一项重要特性,用于将一个Redis服务器(Master主节点)的数据复制到其他Redis服务器(Slave从节点),以实现数据的高可用性和读写分离.数据的复制是单向的, ...

  6. Avalonia 列表拖拽替换

    实现目标,在一个ListBox中选择一个子项进行拖拽到另一个ListBox中,拖拽到某一子项区域进行替换 下面是axaml代码 1 <ListBox 2 Name="consumabl ...

  7. noip2022保龄记

    第一次参加noip,写第一篇游记纪念一下 天还挺热,今天就穿了个秋衣加卫衣,本来还打算穿袄子来着,但是爸妈没让 到了八中才发现好像没带水,然后我的老父亲跑到不知道哪里去给买了一瓶(八中门口看不到有小卖 ...

  8. redux的三个概念与三大核心

    1.什么是redux?一个组件里可能会有很多的状态,比如控制某个内容显示的flag,从后端获取的展示数据,那么这些状态可以在自己的单个页面进行管理,也可以选择别的管理方式,redux就是是一种状态管理 ...

  9. .Net AsyncLocal介绍

    AsyncLocal的基本概念 AsyncLocal是一个在异步环境中存储和传递状态的类型.它允许你在线程或任务之间共享数据,而不会受到异步上下文切换的影响. 每一个异步的AsyncLocal的数据都 ...

  10. uniapp封装接口

    1 为什么需要封装接口 封装接口是为了提高开发效率.增加代码复用性和提升可维护性.下面对这些原因进行详细解释: 1.1 开发效率 开发效率:减少代码量,简化调用过程 通过封装接口,可以将一些常见的操作 ...