Unity3D实现蓄力跳跃

发表于2018-12-14
评论0 1.27w浏览
游戏游戏不仅仅只实现了觉得跳跃,还可以在角色跳跃的动作上再做优化,就如下面要介绍的蓄力跳跃,角色跳跃,蓄力跳的更高,并带有动画。

思路是,设置一个蓄力值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

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引