栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 游戏开发 > 其他

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

其他 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

新增跳落动画

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

新增落地侦查器

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

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发送一个信息正在地上,然后在人物控制器中处理这些信息,通过改变动画参数控制动画的过渡

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;
    
    }


小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的过程中踩到地面的情况

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/902283.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号