Unity3D实现蓄力跳跃
发表于2018-12-14
游戏游戏不仅仅只实现了觉得跳跃,还可以在角色跳跃的动作上再做优化,就如下面要介绍的蓄力跳跃,角色跳跃,蓄力跳的更高,并带有动画。
思路是,设置一个蓄力值Current,一个最大值MAX和一个最小值MIN。如果键盘某键一直被按住的话一直增加这个蓄力值cu+= Time.deltaTime*10f,但肯定有个限度的,当增加到最大值时就保持当前值等于最大值不再增加了cu=MAX,然后把这个值给物体一个向上的速度(用获取的刚体组件).velocity = new Vector3(0f, current, 0f)。基本就是这样,下面看具体实现一下。Unity3D版本是5.3.2f1
1、新建场景,一个Plan,一个空物体名字叫Player下面有个Cube,去掉Cube的BoxCollider
2、为这个Player创建4个动画片段,(PS:动画部分不是重点,只是为了更形象,此处可以省略,但需要将代码中播放动画的代码部分注释掉就行)分别是:
Idle(待机状态):保持缩放不变,位置不变;
InPressure(蓄力状态):高度变小,X Z 轴变大,来回变大还原的动画;
Jump(跳跃):高度变大,X Z 轴变小,也就是变的瘦小细长;
DownUp(颤动恢复原形):先变胖,在变回原样(缩放为1,1,1)
3、为Player创建动画控制器,从Idle->InPressure->Jump->DownUp-Idle,连接好后设置两个条件,一个是Bool类型的OnGround,一个是Float的IsPressure,需要注意的是把每个动画过度时的Has Exit Time取消勾选,下面的过度时间设为0,表示立即切换,过度条件的话看字面意思理解设置一下(再次PS一下,这部分不是重点。可省略,但需要注释掉代码中的动画控制代码。)
4、为Player加上BoxCollider组件,添加刚体组件并,锁定XYZ轴的旋转,还有动画控制器,也就是上面创建的,再添加脚本
5、脚本如下,详细介绍看注释就可以
、
额,在附上可以复制粘贴的吧(伸手党的福音)
using UnityEngine; using System.Collections; public class player : MonoBehaviour { bool OnGround; //是否在地面上 float jumpPressure = 0f; //蓄力值 float MinjumpPressure = 3f; //蓄力最小值 public float MaxjumpPressure = 10f; // 蓄力最大值 Rigidbody rbody; Animator animator; // Use this for initialization void Start () { OnGround = true; //初始设置在地面上 rbody = GetComponent<Rigidbody>(); //获取组件 animator = GetComponent<Animator>(); } // Update is called once per frame void Update () { if (OnGround) //判断是否在地面上 { if (Input.GetButton("Jump")) //hold 按下(住)不放空格键 { if (jumpPressure < MaxjumpPressure) { //如果当前蓄力值小于最大值 jumpPressure += Time.deltaTime*10f; //则每帧递增当前蓄力值 } else { //达到最大值时,当前蓄力值就等于最大蓄力值 jumpPressure = MaxjumpPressure; } print("hold: "+jumpPressure); //测试用,请忽略 //这时设置动画为蓄力状态动画 animator.SetFloat("IsPressure", jumpPressure); } else //not hold 鼠标松开时 { if (jumpPressure > 0f) { //如果是轻轻按下就松开则把最小蓄力值赋值给当前蓄力值 //如果是按住不松则把上面递增的值传下来 jumpPressure += MinjumpPressure; //给一个向上速度 rbody.velocity = new Vector3(0f, jumpPressure, 0f); jumpPressure = 0f; //升空以后把蓄力值重设为0 OnGround = false; //在地面上设为否 } animator.SetFloat("IsPressure", 0f); //设置动画的Float值为0 animator.SetBool("OnGround", OnGround); //根据是否在地面上播放动画 } } } void OnCollisionEnter(Collision other) { //检测是否碰撞到地面 if (other.gameObject.tag == "Ground") { OnGround = true; } } }
6、如果上面2步的动画部分没做的话则注释掉上面代码中与animator相关的代码即可。
保存,测试,按空格键跳跃,长按可蓄力跳跃,并带有果冻一样的弹性动画。
对了,附上源文件:
http://pan.baidu.com/s/1kUnnjkN