Unity项目-黑魂复刻(三)玩家控制器(跳跃)

新增跳落动画

在jump动画播放完后过渡到下落动画,之后再跳回地面动画,需要注意回去的顺序,Exit Time越短就先回去

Unity项目-黑魂复刻(三)玩家控制器(跳跃)

新增落地侦查器

解决落地之前都是fail动画的问题,而不是fail落地动画播放完毕就播放落地动画,使用Physics.OverlapCapsule进行碰撞检测地面碰撞到的碰撞体。

Unity项目-黑魂复刻(三)玩家控制器(跳跃)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class OnGroundSensor : MonoBehaviour
{
    //获得人物胶囊体
    public CapsuleCollider capcol;

    //上半球的球心
    private Vector3 point1;
    //下半球的球心
    private Vector3 point2;
    //胶囊体的半径
    private float radius;
    void Awake()
    {
        radius = capcol.radius;
    }

    // Update is called once per frame
    void FixedUpdate()
    {
        //transform.position在底部
        point1 = transform.position + transform.up * radius;
        point1 = transform.position + transform.up * capcol.height - transform.up * radius;

        //获得layer为Ground的所有碰撞体
        Collider[] outputCols = Physics.OverlapCapsule(point1, point2, radius, LayerMask.GetMask("Ground"));
        if (outputCols.Length != 0) {
            foreach (var col in outputCols)
            {
                print("collision:" + col.name);

            }  
        }
    }
}

使用落地侦查器

为了实现玩家跳起来后落地的过程一直是fall落地动画,思路:如果碰到地面就会给人物SendMessageUpwards发送一个信息正在地上,然后在人物控制器中处理这些信息,通过改变动画参数控制动画的过渡

Unity项目-黑魂复刻(三)玩家控制器(跳跃)

OnGroundSensor脚本中

//获得layer为Ground的所有碰撞体
        Collider[] outputCols = Physics.OverlapCapsule(point1, point2, radius, LayerMask.GetMask("Ground"));
        if (outputCols.Length != 0)
        {
            //foreach (var col in outputCols)
            //{
            //    print("collision:" + col.name);

            //}  
            SendMessageUpwards("IsGround");
        }
        else {
            SendMessageUpwards("IsNotGround");


        }

ActorController脚本中

    void IsGround() {
        print("is on ground");
        anim.SetBool("isGround", true);
    }
    void IsNotGround() {

        print("is not on ground!!!!");
        anim.SetBool("isGround", false);
    }

修改人物在执行下落动画时出现垂直降落问题

在之前的操作中,播放完jump跳跃动画就会将input和位移就会开启更新,所以我们的思路是在fail下落到地面的时候再发送消息让input和位移就会开启更新,就会根据上一帧的速度出现一个惯性。

 void OnGroundEnter() {
        pi.inputEnabled = true;
        lockPlanar = false;
    
    }

Unity项目-黑魂复刻(三)玩家控制器(跳跃)
小bug:

在原地起跳时,会因为脚到地面的距离差出现漂移的情况,解决办法:j将自定义的胶囊体向下偏移,从而减小这个误差。

public class OnGroundSensor : MonoBehaviour
{
 //获得人物胶囊体
    public CapsuleCollider capcol;
    //让自定义的胶囊体向下偏移
    public float offset = 0.1f;
    //上半球的球心
    private Vector3 point1;
    //下半球的球心
    private Vector3 point2;
    //胶囊体的半径
    private float radius;
	//让自定义的胶囊体向下偏移
    public float offset = 0.1f;
 	void Awake()
    {
        //使胶囊体变窄
        radius = capcol.radius-0.1f;
    }

    // Update is called once per frame
    void FixedUpdate()
    {
        //transform.position在底部
        point1 = transform.position + transform.up * (radius-offset);
        point2 = transform.position + transform.up * (capcol.height- offset) - transform.up * radius
        ...
    }
}

解决jump动画过渡到fail的过程中踩到地面的情况

Unity项目-黑魂复刻(三)玩家控制器(跳跃)

上一篇:摸鱼日记1.31


下一篇:CF1644A Doors and Keys 题解