美文网首页工作生活
Unity——#05 跳跃_2

Unity——#05 跳跃_2

作者: MisakiMel | 来源:发表于2019-07-05 06:48 被阅读0次

        今天解决上节遗留的两个问题,分别是:
    1.锁死输入同时保留速度,使其能够在跳跃过程中向前移动
    2.提供y分量的冲量,让其真正跳离地面
        好,事不宜迟,马上开搞!

    1.保留速度

        从上节(Unity——#04 跳跃)最后的效果图能看到,虽然我们实现了锁死玩家的输入,但也引发了新的问题,每次跳跃都只能停留在原地,原因是因为我们把Dmag置0了,所以速度(movingVec)也跟着没了,movingVec的表达式为:
    movingVec = pi.Dmag * model.transform.forward * (pi.run ? runSpeed : 1.0f);。所以在锁死玩家输入的同时,也要把movingVec给锁死,不能让它跟着置0。而且这个操作应该在OnJumpEnter()里实现,即在进入跳跃的状态时锁死movingVec。现在修改前的OnJumpEnter()为:

        void OnJumpEnter(){
            pi.InputEnabled = false;
        }
    

        现在我们应该定义一个bool变量来做锁死速度的开关,在平时默认是false,而在进入跳跃状态时设置为true:

        public bool lockVelocity = false;
        void OnJumpEnter(){
            pi.InputEnabled = false;
            lockVelocity = true;        //当跳跃时锁死速度,不让速度归0
        }
    

        好,开关设置完毕,接下来就是要对movingVec动手了:

          if (lockVelocity==false) {
              movingVec = pi.Dmag * model.transform.forward * (pi.run ? runSpeed : 1.0f); //速度
          }
    

        思路就是当lockVelocity为false时,这是默认情况,movingVec就可以跟随玩家的输入而变化,当lockVelocity为true时,就不再修改movingVec,让它保持在跳跃前的速度。
        还没完,因为我上节的疏忽,我忘了一件非常重要的事情,那就是现在在进入跳跃状态时有锁定输入和保留速度,但是没有在离开跳跃状态时恢复原样。所以我们要故技重施,像实现OnJumpEnter()函数调用那样,实现一个OnJumpExit(),并把输入打开和速度解锁,步骤为:
    1.在jump动画里Add Behaviour,命名为FSMCallOnExit:

    FSMCallOnExit

    2.在FSMCallOnExit脚本文件里进行如下操作:

        public string[] OnExitMessage;
        ...
        override public void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) {
            foreach (var msg in OnExitMessage) {
                animator.gameObject.SendMessageUpwards (msg);
            }
        ...
        }
    

    3.Inspector视窗里:



    4.在ActorController.cs文件里,实现OnJumpExit()函数:

        void OnJumpExit()
        {
            pi.InputEnabled = true;
            lockVelocity = false;       //恢复正常
        }
    

       可以看看效果如何了:


    Jump

       注意图里下划红线的几个参数,能看出在跳跃时,InputEnabled消勾了,而LockVelocity勾上了且Dmag为0。模型在跳跃时也能往跳跃的方向进行位移了。这个问题算是解决了。
       可能有人会有疑问,问为什么要重新新建一个FSMCallOnExit,而不是直接在FSMCallOnEnter里的OnStateExit()函数实现上述功能呢?一般的书本呢都喜欢把很多代码塞进同一个Behaviour里面,这就会导致出bug的时候很难找,很难抓,所以呢一个Behaviour里做的事不能太多,相反,多个简易的Behaviour就能在出bug时快速定位到是哪个Behaviour出的错,而出错的那个Behaviour由于代码不会很复杂,也能很快的找到哪一行出了问题,当然这只是现阶段我的看法,有点类似于高内聚低耦合的概念,可能以后会改变。

    2.提供冲量

       现在的跳跃其实都是没有离开地面的跳跃,仅仅是播放了个跳跃的动画,这是因为并没有给到模型一个y轴的冲量。来吧,让它真正跳出一步。
       首先先宣告一个Vector3变量:

    public Vector3 jumpVelocity;
    

       因为这个冲量是要在角色进入跳跃状态时,所以自然就要在OnStateEnter()里初始化

        void OnJumpEnter(){
            pi.InputEnabled = false;
            lockVelocity = true;        //当跳跃时锁死速度,不让速度归0
            jumpVelocity=new Vector3(0,5.0f,0);
        }
    

       这个冲量是要给到刚体的速度向量的,但是这个向量的赋值表达式是在FixedUpdate()里的,如果给到之后不及时清零的话,会造成角色一直往上飞,所以要在给到之后,直接来一个jumpVelocity = Vector3.zero;,具体如下:

        void FixedUpdate(){
            rigid.velocity = new Vector3(movingVec.x,rigid.velocity.y,movingVec.z)+jumpVelocity;
            jumpVelocity = Vector3.zero;
        }
    

       这里给到的冲量为5,所以跳起来可能会比较高,这也是让效果明显一点,实际上2.5就足够了。


    Jump

       看看当前角色的坐标值(Current Position),能看到Y轴在跳起来后有明显的数值变化。由于我给它已经加上了下落的动画,且跳得比较高,所以触发了下落动画的播放,冲量改为2.5就不会这样了,下落(fall)会在后续降到。至此跳跃就大功告成了。说简单不简单,但说难吧这其实是很基础的东西,还是要多加练习,熟能生巧,共勉!

    相关文章

      网友评论

        本文标题:Unity——#05 跳跃_2

        本文链接:https://www.haomeiwen.com/subject/hatdhctx.html