[Chip]Unity开发笔记--Input System实现下蹲和滑行

本文详细介绍了如何在Unity中使用InputSystem配置移动(下蹲和冲刺)功能,包括创建C#脚本、绑定按键、控制玩家缩放和施加力。通过实例展示了如何编写Crouch和Slide功能的代码实现。

0.基础配置

基础配置在之前的笔记中有介绍

[Chip]Unity开发笔记--Input System实现移动

[Chip]Unity开发笔记--Input System实现跳跃,冲刺

1.Input Actions配置

1.在Actions中右键Add Action命名为Crouch,Action Type为Button。

2.右键Crouch选择Add Binding,在右侧Path中选择Listen按下“C”键,即可将“C”键绑定为下蹲所需的按键。

3.同理Add Action命名为Slide,将Shift键绑定为冲刺所需的按键。

配置完后如图所示

2.下蹲代码编写

1.右键Create一个C# Scrpt命名为Crouch,并挂载到Player身上。

2.初始化PlayerControl

public class Crouch : MonoBehaviour
{
    public PlayerControl playerControl;
    private void Awake()
    {
        playerControl = new PlayerControl();
    }
    private void OnEnable()
    {
        playerControl.Enable();
    }
    private void OnDisable()
    {
        playerControl.Disable();
    }
}

3.获取Player的Scale并记录,设置下蹲时的Scale

public float localYScale;
public float crouchYScale;
public Vector3 localScale;
public Vector3 crouchScale;
private void Start()
    {
        localScale = new Vector3(player.transform.localScale.x, localYScale, player.transform.localScale.z);
        //默认Scale
        crouchScale = new Vector3(player.transform.localScale.x, crouchYScale, player.transform.localScale.z);
        //下蹲时Scale
    }

4.开始下蹲和结束下蹲

public Rigidbody rb;
private void Start()
    {
        rb=GetComponent<Rigidbody>();
        playerControl.Player.Crouch.started += CrouchStart;
        //注册开始下蹲事件
        playerControl.Player.Crouch.canceled += CrouchOver;
        //注册结束下蹲事件
    }
private void CrouchStart(InputAction.CallbackContext obj)
    {
        transform.localScale = crouchScale;
        rb.AddForce(Vector3.down * 5f, ForceMode.Impulse);
        //当C键按下时设置Player的Scale为下蹲时Scale,并施加一个向下的力,确保Player接触地面
    }
private void CrouchOver(InputAction.CallbackContext obj)
    {
        transform.localScale = localScale;
        //当C键松开时恢复Player的Scale为默认Scale
    }

5.设置好slideYScale保存后运行即可使用“C”键下蹲。 

3.滑行代码编写

1.右键Create一个C# Scrpt命名为Slide,并挂载到Player身上。

2.初始化PlayerControl

public class Dash: MonoBehaviour
{
    public PlayerControl playerControl;
    private void Awake()
    {
        playerControl = new PlayerControl();
    }
    private void OnEnable()
    {
        playerControl.Enable();
    }
    private void OnDisable()
    {
        playerControl.Disable();
    }
}

3.获取Player的Scale并记录,设置滑行时的Scale

public float localYScale;
public float slideYScale;
public Vector3 localScale;
public Vector3 slideScale;
private void Start()
    {
        localYScale=player.transform.localScale.y;
        localScale=new Vector3(player.transform.localScale.x, localYScale, player.transform.localScale.z);
        //默认Scale
        slideScale = new Vector3(player.transform.localScale.x, slideYScale, player.transform.localScale.z);
        //滑行时Scale
    }

4.设置滑行方向

Rigidbody rb;
bool canSlide;
bool isSlide;
Vector2 inputVector;
Vector3 slideVector;
private void Start()
    {
        rb = player.GetComponent<Rigidbody>();
        canSlide = true;
        playerControl.Player.Slide.started += SlideStart;
        //为滑行注册事件
    }
private void Update()
    {
        inputVector = playerControl.Player.Move.ReadValue<Vector2>();
    }
private void SlideStart(InputAction.CallbackContext obj)
    {
        if(inputVector.x!=0|| inputVector.y != 0)
        {
            if (canSlide && inGround)
            //确保滑行时Player在地面上
            {
                canSlide = false;
                isSlide = true;
                transform.localScale = slideScale;
                //设置Player的Scale为滑行时Scale
                slideVector = transform.right * inputVector.x + transform.forward * inputVector.y;
                rb.AddForce(Vector3.down * 5f, ForceMode.Impulse);
                //给Player一个向下的瞬时力,确保Player紧贴地面
            }
        }
    }

5.开始滑行

public float slideForce;
public float slideTime;
public float slideTimer;
private void FixedUpdate()
    {
        if (isSlide)
        {
            Sliding();
        }
    }
private void Sliding()
    {
        rb.AddForce(slideVector.normalized * slideForce, ForceMode.Force);
        //持续为Player施加力直到滑行时间到达所设定时间
        slideTimer=slideTime;
        slideTimer-=Time.deltaTime;
        if (countTimer <= 0)
        {
            StopSlide();
        }
    }
private void StopSlide()
    {
        isSlide = false;
        transform.localScale = localScale;
    }

6.接触地面后重置滑行次数

private void ResetSlide()
    {
        if(inGround)
        {
            canSlide=true;
        }
    }

7. 设置好slideYScale,slideForce和slideTime保存后运行即可在地面上使用Ctrl键滑行。

4.完整项目视频预览

[Unity练习作]类幽灵行者跑酷小游戏

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值