导入inputSystem
在窗口-包管理器-注册表-搜inputSystem,安装
创建inputSystem文件,右键-创建-最下角-inputAction
创建文件
创建PlayerInput继承
using System.Collections;
using System.Collections.Generic;
using UnityEditor.Tilemaps;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.InputSystem;
using static NewControls;
[CreateAssetMenu(menuName ="Player Input")]//可以在窗口创建文件
public class PlayerInput : ScriptableObject,
@NewControls.IGamePlayActions ,
@NewControls.IPauseMenuActions ,
@NewControls.IGameOverScreenActions
//继承@NewControls.IGamePlayActions 的所有类 I+动作表名字+Actions
{
@NewControls inputAction;
//开始移动
public event UnityAction<Vector2> onMove=delegate { };//初始化 委托用法
//停止移动
public event UnityAction onStopMove=delegate { };
//开火
public event UnityAction onFire=delegate { };
//停止开火
public event UnityAction onStopFire=delegate { };
//翻滚
public event UnityAction onDodge=delegate { };
//能量爆发
public event UnityAction onOverDrive=delegate { };
//暂停菜单
public event UnityAction onPause=delegate { };
//取消暂停菜单
public event UnityAction onUnPause=delegate { };
//导弹
public event UnityAction onMissile = delegate { };
//游戏结束
public event UnityAction onConfirmGameOver = delegate { };
//登记处 动作表才会生效
public void OnEnable()
{
inputAction=new @NewControls();//初始化
inputAction.gamePlay.SetCallbacks(this);//登记回调函数
inputAction.PauseMenu.SetCallbacks(this);
inputAction.gameOverScreen.SetCallbacks(this);
}
void OnDisable()
{
inputAction.Disable();//禁用 inputAction所有的脚本
}
//禁用所有脚本
public void DisableAllInputs()
{
inputAction.Disable();//禁用 inputAction所有的脚本
}
//启用玩家动作表
public void EnableGamePlayInputy() => SwitchActionMap(inputAction.gamePlay, false);
//禁用玩家动作表
public void DisableGamePlayInputy()
{
inputAction.gamePlay.Disable();
}
//启用暂停菜单
public void EnablePauseMenuInputy()=>SwitchActionMap(inputAction.PauseMenu, true);
//启用游戏结束动作表
public void EnableGameOverScreenInputy() => SwitchActionMap(inputAction.gameOverScreen, true);
//切换动作表
void SwitchActionMap(InputActionMap actionMap,bool isUIinput)
{
inputAction.Disable();//禁用 inputAction所有的脚本
actionMap.Enable();
if(isUIinput)
{
// Cursor.visible= true;//鼠标显示
//Cursor.lockState= CursorLockMode.None;//鼠标状态为解锁
}
else
{
// Cursor.visible= false;//鼠标隐藏
// Cursor.lockState= CursorLockMode.Locked;//鼠标状态为锁定
}
}
//动态更新 不受Time.timeScale影响
public void SwitchToDynamicUpdateMode() => InputSystem.settings.updateMode=InputSettings.UpdateMode.ProcessEventsInDynamicUpdate;//改变更新模式
//固定更新
public void SwitchToFixedUpdateMode() => InputSystem.settings.updateMode=InputSettings.UpdateMode.ProcessEventsInFixedUpdate;
//移动动作表接口
public void OnMove(InputAction.CallbackContext context)
{
if(context.performed)//按下按键时 performed持续检测
{
onMove.Invoke(context.ReadValue<Vector2>());//传递 动作表读取的vector2 值
}
if (context.canceled)//松开按键时
{
onStopMove.Invoke();
}
}
//开火动作表
public void OnFire(InputAction.CallbackContext context)
{
// if (context.phase==InputActionPhase.Performed)//按下按键时 performed持续检测
if (context.performed)//按下按键时 performed持续检测
{
onFire.Invoke();
}
if (context.canceled)//松开按键时
{
onStopFire.Invoke();
}
}
//翻滚动作表
public void OnDodge(InputAction.CallbackContext context)
{
if(context.performed)
{
onDodge.Invoke();
}
}
//能量爆发表
public void OnOverDrive(InputAction.CallbackContext context)
{
if (context.performed)
{
onOverDrive.Invoke();
}
}
//开始暂停菜单
public void OnPause(InputAction.CallbackContext context)
{
if (context.performed)
{
onPause.Invoke();
}
}
//取消暂停菜单
public void OnUnPause(InputAction.CallbackContext context)
{
if (context.performed)
{
onUnPause.Invoke();
}
}
//导弹
public void OnMissile(InputAction.CallbackContext context)
{
if (context.performed)
{
onMissile.Invoke();
}
}
//结束游戏
public void OnComfirmGameOver(InputAction.CallbackContext context)
{
if (context.performed)
{
onConfirmGameOver.Invoke();
}
}
}
订阅事件
public PlayerInput input;
protected override void OnEnable()
{
base.OnEnable();
//订阅事件
input.onMove+=Move;
input.onStopMove+=stopMove;
input.onFire+=Fire;
input.onStopFire+=StopFire;
input.onDodge+=Dodge;
input.onOverDrive+=OverDrive;
}
new private void OnDisable()
{
//取消订阅
input.onMove-=Move;
input.onStopMove-=stopMove;
input.onFire-=Fire;
input.onStopFire-=StopFire;
input.onDodge-=Dodge;
input.onOverDrive-=OverDrive;
}
详细看
[Unity] 横版卷轴射击游戏 制作教程 Ep.02 如何使用Input System | 输入系统 |如何实现玩家移动 | 独立游戏 | 游戏开发_哔哩哔哩_bilibili