(转)收藏的帖子——跳跃设计
2015-12-20 18:42
190 查看
[align=left]《Cloud Critters》是一个跳跃类的游戏。我们的目的是将一些类似《几何大战》这种具有潜质的游戏同《Flappy Bird》和《Don’t Touch the Spikes》这些单点跳跃游戏进行细致的融合。[/align]
[align=left] [/align]
[align=left]在《Flappy Bird》中,用户每次点击都会使小鸟上升一个固定的高度。我们在游戏《Cloud Critters》开发前期就决定可以控制角色跳跃的高度,就和《超级玛丽》或者《密特罗德》一样。这样将会给玩家更多的操作空间。[/align]
[align=left] [/align]
[align=left]在进入如何实现这样一个可以正确控制跳跃高度的之前,我们先看一下这一段代码,之后的示例都将基于它。[/align]
[align=left] [/align]
[align=left]注意:这里为了示范方便,我们将在Update函数中启用跳跃协程(JumpRoutine)。[/align]
[align=left]void Update()[/align]
[align=left]{[/align]
[align=left] if(jumpButtonDown&& !jumping)[/align]
[align=left] {[/align]
[align=left] jumping= true;[/align]
[align=left] StartCoroutine(JumpRoutine());[/align]
[align=left] }[/align]
[align=left]}[/align]
[align=left]在实际的工程中,你最好在FixedUpdate中处理物理运动相关的行为。[/align]
[align=left] [/align]
[align=left] [/align]
[align=left]匀加速情况:[/align]
[align=left]IEnumeratorJumpRoutine()[/align]
[align=left]{[/align]
[align=left]rigidbody.velocity= Vector2.zero;[/align]
[align=left]floattimer = 0;[/align]
[align=left]while(jumpButtonPressed &&timer < jumpTime)[/align]
[align=left]{[/align]
[align=left]//Adda constant force every frame of the jump[/align]
[align=left]rigidbody.AddForce(jumpVector);[/align]
[align=left]timer+= Time.deltaTime;[/align]
[align=left]yieldreturn null;[/align]
[align=left]}[/align]
[align=left]jumping= false;[/align]
[align=left]}[/align]
[align=left]优点:[/align]
[align=left]跳跃高度的最小最大值差距较大,玩家可以更好的控制角色跳跃的高度和距离。[/align]
[align=left]缺点:[/align]
[align=left]每一帧都给角色施以一个固定的外力,导致角色在竖直方向上的速度会越来越快,就像背着一个喷气装置。[/align]
[align=left] [/align]
[align=left] [/align]
[align=left]类抛物情况:[/align]
[align=left]IEnumeratorJumpRoutine()[/align]
[align=left]{[/align]
[align=left]//Setthe gravity to zero and apply the force once[/align]
[align=left]floatstartGravity = rigidbody.gravityScale;[/align]
[align=left]rigidbody.gravityScale= 0;[/align]
[align=left]rigidbody.velocity= jumpVector;[/align]
[align=left]floattimer = 0f;[/align]
[align=left]while(jumpButtonPressed&& timer < jumpTime)[/align]
[align=left]{[/align]
[align=left]timer+= Time.deltaTime;[/align]
[align=left]yieldreturn null;[/align]
[align=left]}[/align]
[align=left]//Setgravity back to normal at the end of the jump[/align]
[align=left]rigidbody.gravityScale= startGravity;[/align]
[align=left]jumping= false;[/align]
[align=left]}[/align]
[align=left]优点:[/align]
[align=left]在跳起的过程中不会一直加速。在开始跳跃的那一刻,角色就会获得最大的跳跃速度,当用户松开按键或者达到跳跃最大高度后,便落下。这种跳跃形式和《超级玛丽》 比较接近。[/align]
[align=left] [/align]
[align=left] [/align]
[align=left]缺点:[/align]
[align=left]在玩家松开跳跃键后,角色还会持续几帧跳跃动画,继续上升直到向上的速度降为零才下落。这意味着即使你只是快速按一下跳跃键,角色也会跳起相当高的一端距离。[/align]
[align=left] [/align]
[align=left] [/align]
[align=left] [/align]
[align=left]类抛物情况改进版:[/align]
[align=left]IEnumeratorJumpRoutine()[/align]
[align=left]{[/align]
[align=left]//Addforce on the first frame of the jump[/align]
[align=left]rigidbody.velocity= Vector2.zero;[/align]
[align=left]rigidbody.AddForce(jumpVector,ForceMode2D.Impulse);[/align]
[align=left]//Waitwhile the character's y-velocity is positive (the character is going[/align]
[align=left]//up)[/align]
[align=left]while(jumpButtonPressed&& rigidbody.velocity.y > 0)[/align]
[align=left]{[/align]
[align=left]yieldreturn null;[/align]
[align=left]}[/align]
[align=left]//Ifthe jumpButton is released but the character's y-velocity is still[/align]
[align=left]//positive...[/align]
[align=left]if(rigidbody.velocity.y> 0)[/align]
[align=left]{[/align]
[align=left]//...setthe character's y-velocity to 0;[/align]
[align=left]rigidbody.velocity= new Vector2(rigidbody.velocity.x, 0);[/align]
[align=left]}[/align]
[align=left]jumping= false;[/align]
[align=left]}[/align]
[align=left]优点:[/align]
[align=left]能很精确地控制跳跃的最高点,当跳跃按钮松开时,角色即刻下落。[/align]
[align=left] [/align]
[align=left]缺点:[/align]
[align=left]尽管说此种跳跃达到最远跳跃距离时,角色的运动轨迹是一条平滑的弧线,可是当我们没有跳到最远距离时,这条运动轨迹就会出现较为明显的波动。[/align]
[align=left] [/align]
[align=left] [/align]
[align=left] [/align]
[align=left] [/align]
[align=left]终极版本:[/align]
[align=left]IEnumerator JumpRoutine()[/align]
[align=left]{[/align]
[align=left] rigidbody.velocity= Vector2.zero;[/align]
[align=left] float timer = 0;[/align]
[align=left] while(jumpButtonPressed&& timer < jumpTime)[/align]
[align=left] {[/align]
[align=left] //Calculatehow far through the jump we are as a percentage[/align]
[align=left] //applythe full jump force on the first frame, then apply less force[/align]
[align=left] //eachconsecutive frame[/align]
[align=left] float proportionCompleted = timer / jumpTime;[/align]
[align=left] Vector2 thisFrameJumpVector = Vector2.Lerp(jumpVector, Vector2.zero,proportionCompleted);[/align]
[align=left] rigidbody.AddForce(thisFrameJumpVector);[/align]
[align=left] timer+= Time.deltaTime;[/align]
[align=left] yieldreturn null;[/align]
[align=left] }[/align]
[align=left] jumping= false;[/align]
[align=left]}[/align]
[align=left]优点:[/align]
[align=left]玩家可以很好地控制角色跳跃的高度,并且跳跃过程中的运动轨迹都是很平滑的弧线,也不会出现类似喷气式上升的情况。[/align]
[align=left]缺点:[/align]
[align=left]没有缺点,简直完美![/align]
[align=left] [/align]
[align=left]在《Flappy Bird》中,用户每次点击都会使小鸟上升一个固定的高度。我们在游戏《Cloud Critters》开发前期就决定可以控制角色跳跃的高度,就和《超级玛丽》或者《密特罗德》一样。这样将会给玩家更多的操作空间。[/align]
[align=left] [/align]
[align=left]在进入如何实现这样一个可以正确控制跳跃高度的之前,我们先看一下这一段代码,之后的示例都将基于它。[/align]
[align=left] [/align]
[align=left]注意:这里为了示范方便,我们将在Update函数中启用跳跃协程(JumpRoutine)。[/align]
[align=left]void Update()[/align]
[align=left]{[/align]
[align=left] if(jumpButtonDown&& !jumping)[/align]
[align=left] {[/align]
[align=left] jumping= true;[/align]
[align=left] StartCoroutine(JumpRoutine());[/align]
[align=left] }[/align]
[align=left]}[/align]
[align=left]在实际的工程中,你最好在FixedUpdate中处理物理运动相关的行为。[/align]
[align=left] [/align]
[align=left] [/align]
[align=left]匀加速情况:[/align]
[align=left]IEnumeratorJumpRoutine()[/align]
[align=left]{[/align]
[align=left]rigidbody.velocity= Vector2.zero;[/align]
[align=left]floattimer = 0;[/align]
[align=left]while(jumpButtonPressed &&timer < jumpTime)[/align]
[align=left]{[/align]
[align=left]//Adda constant force every frame of the jump[/align]
[align=left]rigidbody.AddForce(jumpVector);[/align]
[align=left]timer+= Time.deltaTime;[/align]
[align=left]yieldreturn null;[/align]
[align=left]}[/align]
[align=left]jumping= false;[/align]
[align=left]}[/align]
[align=left]优点:[/align]
[align=left]跳跃高度的最小最大值差距较大,玩家可以更好的控制角色跳跃的高度和距离。[/align]
[align=left]缺点:[/align]
[align=left]每一帧都给角色施以一个固定的外力,导致角色在竖直方向上的速度会越来越快,就像背着一个喷气装置。[/align]
[align=left] [/align]
[align=left] [/align]
[align=left]类抛物情况:[/align]
[align=left]IEnumeratorJumpRoutine()[/align]
[align=left]{[/align]
[align=left]//Setthe gravity to zero and apply the force once[/align]
[align=left]floatstartGravity = rigidbody.gravityScale;[/align]
[align=left]rigidbody.gravityScale= 0;[/align]
[align=left]rigidbody.velocity= jumpVector;[/align]
[align=left]floattimer = 0f;[/align]
[align=left]while(jumpButtonPressed&& timer < jumpTime)[/align]
[align=left]{[/align]
[align=left]timer+= Time.deltaTime;[/align]
[align=left]yieldreturn null;[/align]
[align=left]}[/align]
[align=left]//Setgravity back to normal at the end of the jump[/align]
[align=left]rigidbody.gravityScale= startGravity;[/align]
[align=left]jumping= false;[/align]
[align=left]}[/align]
[align=left]优点:[/align]
[align=left]在跳起的过程中不会一直加速。在开始跳跃的那一刻,角色就会获得最大的跳跃速度,当用户松开按键或者达到跳跃最大高度后,便落下。这种跳跃形式和《超级玛丽》 比较接近。[/align]
[align=left] [/align]
[align=left] [/align]
[align=left]缺点:[/align]
[align=left]在玩家松开跳跃键后,角色还会持续几帧跳跃动画,继续上升直到向上的速度降为零才下落。这意味着即使你只是快速按一下跳跃键,角色也会跳起相当高的一端距离。[/align]
[align=left] [/align]
[align=left] [/align]
[align=left] [/align]
[align=left]类抛物情况改进版:[/align]
[align=left]IEnumeratorJumpRoutine()[/align]
[align=left]{[/align]
[align=left]//Addforce on the first frame of the jump[/align]
[align=left]rigidbody.velocity= Vector2.zero;[/align]
[align=left]rigidbody.AddForce(jumpVector,ForceMode2D.Impulse);[/align]
[align=left]//Waitwhile the character's y-velocity is positive (the character is going[/align]
[align=left]//up)[/align]
[align=left]while(jumpButtonPressed&& rigidbody.velocity.y > 0)[/align]
[align=left]{[/align]
[align=left]yieldreturn null;[/align]
[align=left]}[/align]
[align=left]//Ifthe jumpButton is released but the character's y-velocity is still[/align]
[align=left]//positive...[/align]
[align=left]if(rigidbody.velocity.y> 0)[/align]
[align=left]{[/align]
[align=left]//...setthe character's y-velocity to 0;[/align]
[align=left]rigidbody.velocity= new Vector2(rigidbody.velocity.x, 0);[/align]
[align=left]}[/align]
[align=left]jumping= false;[/align]
[align=left]}[/align]
[align=left]优点:[/align]
[align=left]能很精确地控制跳跃的最高点,当跳跃按钮松开时,角色即刻下落。[/align]
[align=left] [/align]
[align=left]缺点:[/align]
[align=left]尽管说此种跳跃达到最远跳跃距离时,角色的运动轨迹是一条平滑的弧线,可是当我们没有跳到最远距离时,这条运动轨迹就会出现较为明显的波动。[/align]
[align=left] [/align]
[align=left] [/align]
[align=left] [/align]
[align=left] [/align]
[align=left]终极版本:[/align]
[align=left]IEnumerator JumpRoutine()[/align]
[align=left]{[/align]
[align=left] rigidbody.velocity= Vector2.zero;[/align]
[align=left] float timer = 0;[/align]
[align=left] while(jumpButtonPressed&& timer < jumpTime)[/align]
[align=left] {[/align]
[align=left] //Calculatehow far through the jump we are as a percentage[/align]
[align=left] //applythe full jump force on the first frame, then apply less force[/align]
[align=left] //eachconsecutive frame[/align]
[align=left] float proportionCompleted = timer / jumpTime;[/align]
[align=left] Vector2 thisFrameJumpVector = Vector2.Lerp(jumpVector, Vector2.zero,proportionCompleted);[/align]
[align=left] rigidbody.AddForce(thisFrameJumpVector);[/align]
[align=left] timer+= Time.deltaTime;[/align]
[align=left] yieldreturn null;[/align]
[align=left] }[/align]
[align=left] jumping= false;[/align]
[align=left]}[/align]
[align=left]优点:[/align]
[align=left]玩家可以很好地控制角色跳跃的高度,并且跳跃过程中的运动轨迹都是很平滑的弧线,也不会出现类似喷气式上升的情况。[/align]
[align=left]缺点:[/align]
[align=left]没有缺点,简直完美![/align]
相关文章推荐
- 使用HTML5进行地理位置定位。误差在+-500m
- HTML5之地理位置
- 利用html5 共享地理位置
- java异常处理机制
- Python读取中文路径时的处理
- Java学习--01--JRE与JDK的关系
- 【杭电】[2012]素数判定
- (转)Unity3d游戏开场CG动画播放方式
- Dive Into HTML5:地理位置
- iOS开发——UISearchController实现搜索栏功能|阳和移动开发
- Java集群优化——dubbo+zookeeper构建高可用分布式集群
- 我的软件工程实践总结
- 【转载】C#时间差的计算,精确输出“年月天时分秒”
- HTML5开发:地理位置定位指南
- C语言 sizeof关键字
- JavaScript设计模式--前奏
- 我的软件工程实践总结
- (转)Unity 导出XML配置文件,动态加载场景
- Zookeeper之基于Observer部署架构
- 设备驱动的艺术之旅 - Linux 网卡驱动