乐趣区

关于unity:黑魂复刻游戏的自制按钮类Unity随手记

明天实现的内容:
自制按钮类
明天咱们将实现咱们本人的按钮类。按钮类的具体性能是提供按压,刚刚按下,刚刚松开的信号,也就是对按钮进行再封装。对于刚刚按下和刚刚松开信号,我晓得 Unity 提供了 GetButtonDown 和 GetButtonUp,但我感觉能够学习一下老师的思路,假如未来须要开发新的零碎,就能够通过这个办法实现本人的 GetButtonDown 和 GetButtonUp。

代码如下:

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

// 自制按钮类
public class MyButton
{
    public bool isPressing = false; // 正在按压
    public bool OnPressed = false; // 刚刚按下
    public bool OnRelease = false; // 刚刚被开释

    public bool currentState = false; // 以后状态
    public bool lastState = false; // 上一帧的状态

    // 更新 MyButton
    public void Tick(bool _input)
    {
        OnPressed = false; //OnPressd 只有一种状况下是 true 所以每次都先设置为 false
        OnRelease = false; // 与 OnPressed 同理

        currentState = _input; // 按键的以后状态永远和对应物理按键的状态统一

        isPressing = currentState; // 是否被按下 按下就是 true

        if (currentState != lastState) // 判断是否刚刚按下按键或刚刚松开按键
        {if (currentState == true)
                OnPressed = true;
            else
                OnRelease = true;
        }

        lastState = currentState; // 完结时将上一帧状态更新为以后帧状态
    }
}

逻辑简介
咱们的 Button 类须要在 Input 模块的脚本中的 Update 里始终通过 Tick 失去 GetButton 的状态从而进行更新。

    btnA.Tick(Input.GetButton(buttonRun_jab_roll));

IsPressing 就是游戏按键是否被按下,只有放弃与物理按键的状态统一就行,当咱们要判断以后是否是刚刚被按下或者刚刚松开时,就须要将以后的状态与上一次的状态相比拟,如果他们不一样,上一次状态是 false 就阐明刚刚按下了,上一次状态是 true 就阐明刚刚松开了。

使用自制按钮类
使用这个自制类,原来写在 Input 脚本中的 GetButton 就能够全副不要了,拿手柄输出脚本做个例子。

public class JoystickInput : IPlayerInput
{[Header("==== 手柄按键 ====")]
    // 角色挪动管制轴
    public string movementAxis_X = "X axis";
    public string movementAxis_Y = "Y axis";
    // 摄像机管制轴
    public string cameraAxis_X = "4th axis";
    public string cameraAxis_Y = "5th axis";
    // 游戏功能键
    public string btnA = "A"; // 冲刺 / 后跃 / 翻滚
    public string btnLS = "LS"; // 跳跃键
    public string btnRB = "RB"; // 攻打键
    public string btnLB = "LB"; // 举盾键

    // 自制按键
    public MyButton buttonRun_jab_roll = new MyButton(); // 冲刺 / 后跃 / 翻滚
    public MyButton buttonJump = new MyButton(); // 跳跃键
    public MyButton buttonAttackRHand = new MyButton(); // 攻打键
    public MyButton buttonDefense = new MyButton(); // 举盾键
    // Update is called once per frame
    void Update()
    {
        // 更新按键
        buttonRun_jab_roll.Tick(Input.GetButton(btnA));
        buttonJump.Tick(Input.GetButton(btnLS));
        buttonAttackRHand.Tick(Input.GetButton(btnRB));
        buttonDefense.Tick(Input.GetButton(btnLB));

        // ...
        
        // 冲刺
        run = buttonRun_jab_roll.isPressing;
        // 攻打信号
        attack = buttonAttackRHand.OnPressed;
        // 举盾信号
        defense = buttonDefense.isPressing;
        // 跳跃信号
        jump = buttonJump.OnPressed;
        // ...
    }
}
退出移动版