Unity人物跳跃效果

最近在做一个小游戏,需要实现人物的跳跃效果。自己从简单到复杂,把目前比较好的方法都试了一遍,这里简单总结一下。

1.直接使用动画位移

这个其实是美术在做动画的时候已经做好的东西,跳跃的动画本身就含有位移,只需要在应用动画的时候勾选Apply Root Motion就可以了。但是简单也有问题,就是跳跃的高度无法控制,不够灵活。不过对于新手来说先试一下,至少人物能动起来,心里美滋滋。

2.使用刚体组件加作用力

这个其实就是利用Unity的刚体组件,模拟真实的物理效果。在跳跃的时刻给物体添加一个向上的瞬时作用力,这样就能模拟跳跃的效果。这个使用场合还是很多的。但是也有毛病,刚体模拟跳跃还需要勾选重力(当然也可以给物体一个向下的恒力),但是大多数情况下我们是不需要重力的,而且使用物理会消耗更多资源(相比脚本)。这个网上也有很多例子,一行代码搞定,不详细介绍。

3.自己写脚本模拟跳跃

这个是应用场景最多的方式。简单的,可以定义跳跃的时间和高度,然后开协程每帧更新物体的高度,这样就能实现跳跃,具体见下面代码。但是这种跳跃是线性的,无法模拟真实跳跃,更加无法实现自定义跳跃的曲线。

 1     public int jumpTime = 30;
 2     public int fallTime = 20;
 3     public float jumpHeight = 1f;
 4     void JumpForSeconds()
 5     {
 6         StartCoroutine(jumpForSeconds());
 7     }
 8
 9     IEnumerator jumpForSeconds()
10     {
11         int time = jumpTime;
12         float speed = jumpHeight / jumpTime;
13         while(time>0)
14         {
15             time--;
16             transform.Translate(transform.up * speed);
17             yield return new WaitForEndOfFrame();
18         }
19         time = fallTime;
20         speed = -jumpHeight / fallTime;
21         while(time>0)
22         {
23             time--;
24             transform.Translate(transform.up * speed);
25             yield return new WaitForEndOfFrame();
26         }
27     }

4.使用AnimationCurve

这里只介绍简单的使用方法。AnimationCurve是Unity可视化的曲线模拟组件,需要在挂载的脚本中public声明一个AnimationCurve类型的变量,如public AnimationCurve jumpCurve; 此时可以发现inspector视图中脚本多出来一个

单击后面的编辑框即可打开编辑界面,打开后如图

在这里可以编辑你想要的曲线类型,跳跃就是简单的抛物线,你也可以自定义任何类型的曲线。具体如何编辑曲线,可以查看官方文档https://docs.unity3d.com/Manual/EditingCurves.html,写的十分详细。吐槽一下这里的曲线只能用定义关键帧的方式来画,并没有预定义好的曲线。如果能做成matlab那样强大就好了,当然也可能是游戏中其实不需要那么复杂的曲线。

接下来如何使用这条曲线呢,其实你可以把刚才定义的变量jumpCurve理解为这条曲线,它提供了很多方法,最常用的就是Evaluate函数,这个函数参数为x,返回y值,也就是你可以根据横轴任意一点得到曲线上的某一点。在跳跃的例子中,横轴就是时间,纵轴就是高度,那么我们稍微修改一下方法3,高度由这个曲线每帧获取,然后定义物体高度就可以了。  

 1     void JumpForSeconds()
 2     {
 3         StartCoroutine(jumpForSeconds());
 4     }
 5
 6     IEnumerator jumpForSeconds()
 7     {
 8         int time = 0;
 9         float x = 0;
10         float z = 0;
11         float height = 0;
12        while(time<=jumpTime)
13         {
14              x = transform.position.x;
15              z = transform.position.z;
16              height = jumpCurve.Evaluate(time);
17             transform.position = new Vector3(x, height, z);
18             yield return new WaitForEndOfFrame();
19             time++;
20         }
21     }

顺便再多说一点,这个AnimationCurve十分强大,像道路生成、运动轨迹等都可以使用。

时间: 2024-11-07 18:39:53

Unity人物跳跃效果的相关文章

unity, 人物与移动跳台的交互

例如人物跳到往复运动的移动跳台上后应随跳台运动. 要实现这个效果有两个思路,一是用运动学一是用动力学. 一,运动学思路: 1,创建一个box作为移动跳台,用unity里内置的Animation Curves调个左右往复运动的动画. 2,为移动跳台添加Rigidbody并勾选Is Kinematic.这样,移动跳台本身就不再接受动力学作用了,但是它会对其它物体产生动力学作用.(While the Rigidbody is marked isKinematic, it will not be aff

Unity 人物跟谁手指的移动(第一种方式)

长夜漫漫无心睡眠,敲敲代码,越敲越来劲! 我发现好多小朋友都在玩熊出没之xxxx这个游戏,居然打了一下午都没玩通第2关,我把测试也叫来陪我一起玩! 结果他也打不通,我再去叫策划,他也没打过,我去叫主管,他还是没打过,我再回去叫测试使用游戏修改大师,修改宝石买完全部的装备!结果他还是没打过! (这款游戏,让我人生都变得没有了意义!) 人物跟随手指的移动而移动: 第一种方式: 手指移动了多少,主角就移动多少!(我使用的这种方式,存在问题,手指过快滑动,主角会慢慢跟手指有了距离!) 第二种方式: 手指

用3dMax给lol人物模型制作表情动画并导入Unity

参考链接:Blend Shapes / Morph Targets for Facial Animation (Autodesk 3ds Max) 今天逛Youtube的时候Get到了一个新技能:那就是给人物制作表情动画,感觉超简单! 制作Unity中可用的人物表情动画流程大致是:在3dMax中制作表情动画->导出成FBX文件->导入Unity 下面以制作微笑和眨眼睛的动画为例进行讲解 在3dMax中制作表情动画 首先导入人物模型,这里以亚索为例: 按住Shift,选择移动工具将当前选中的亚索

用Unity简单实现第三人称人物的移动和转向

上图不重要,因为实现人物的移动用的是动画,没有什么可说的,主要是下面实现人物的转向. 比如在一个平面中,玩家按了w和d键则人物会面向右前方向前进,如果此时玩家按了a和s键则人物会面向左后方向前进,那么人物从右前转向左后方需要转多少度呢? 已知的数据只有通过键盘按键得知的vertical和horizontal,仅通过这两个数据得到需要转的角度的方式看看上图中的代码就懂了. 水平有限,方法并不聪明,不喜忽喷. 如果有更好的方法,欢迎在评论区分享. 原文地址:https://www.cnblogs.c

Unity 鼠标点击左右移动,人物跟随旋转

上代码: using UnityEngine; using System.Collections; public class Test : MonoBehaviour { private Vector3 startPosition; //鼠标按钮的坐标点 private float x; public bool isDown; //表示鼠标是否按下 public void OnMouseDown() { isDown = true; startPosition = Input.mousePosi

(转)Unity中武器与人物的碰撞检测

自:http://blog.csdn.net/Monzart7an/article/details/24435843 目前来说有三种思路,其实前两种算变种了: 1.动画关键帧回调 + 范围检测. 这个是在Asset store上面下的一个例子中看到的,其实之前在做端游时,也差不多是这样做的,就是挥武器的动作到某一帧的时候,计算武器位中心的范围内有木有怪物,有的话,就给这个目标添加伤害.范围检测用到的函数是这个: Physics.OverlapSphere   static function Ov

Unity基于响应式编程(Reactive programming)入门

系列目录 [Unity3D基础]让物体动起来①--基于UGUI的鼠标点击移动 [Unity3D基础]让物体动起来②--UGUI鼠标点击逐帧移动 时光煮雨 Unity3D让物体动起来③—UGUI DoTween&Unity Native2D实现 时光煮雨 Unity3D实现2D人物动画① UGUI&Native2D序列帧动画 时光煮雨 Unity3D实现2D人物动画② Unity2D 动画系统&资源效率 背景 前有慕容小匹夫的一篇<解构C#游戏框架uFrame兼谈游戏架构设计&

【转】unity自带寻路Navmesh入门教程(一)

http://liweizhaolili.blog.163.com/blog/static/16230744201271161310135/ 说明:从今天开始,我阿赵打算写一些简单的教程,方便自己日后回顾,或者方便刚入门的朋友学习.水平有限请勿见怪.不过请尊重码字截图录屏的劳动,如需转载请先告诉我.谢谢! unity自从3.5版本之后,增加了NavMesh寻路的功能.在此之前,unity用户只能通过第三方插件(如Astar寻路插件)等做寻路功能.阿赵我也使用过A*寻路插件,A*的原理并不复杂,有

【转】unity自带寻路Navmesh入门教程(三)

http://liweizhaolili.blog.163.com/blog/static/16230744201271225812998/ 继续介绍NavMesh寻路的功能,接下来阿赵打算讲一下以下两个例子,先看看完成的效果: 第一个例子对于喜欢DOTA的朋友应该很熟悉了,就是不同小队分不同路线进攻的寻路,红绿蓝三个队伍分别根据三条路线进攻. 第二个例子是动态的控制道路的开关.当吊桥打开时,道路不通,当吊桥放下时,道路可以通行. 先来说说第一个例子吧,第一个例子其实很简单,只需要在之前两节的基