一、安装InputSystem包
二、创建InputAction
在Settings文件夹中创建InputActions文件,创建GamePlay ActionMap动作表
设置属性为如图所示
点击加号创建一个新的绑定,并且将两个绑定分别设置为左摇杆和十字类型
再新建一个绑定2D vector compsite, WASD
使用监听的按钮,来设置上下左右对应的按键。
点击InputActions文件,为其生成一个C#脚本文件InputActionS,放入Scripts/Input中
扫描二维码关注公众号,回复:
14870973 查看本文章
三、创建PlayerInput ScriptObject脚本
为了更加方便的调用这个脚本,才去ScriptObject的方式来创建
创建C#脚本PlayerInput
将其继承ScriptObject,继承InputActionS.IGameplayActions接口
在脚本中实现这个接口
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.InputSystem;
[CreateAssetMenu(menuName = "player Input")]
public class PlayerInput : ScriptableObject,InputActionS.IGamePlayActions
{
private InputActionS _inputActionS;//输入动作表
//开始移动事件
public event UnityAction<Vector2> onMove =delegate {};//将事件初始化为空的委托
//停止移动事件
public event UnityAction onStopMove =delegate {};
private void OnEnable()
{
_inputActionS = new InputActionS();
//登记GamePlay动作表的回调函数,以后如果添加了新的动作表,也要到这里来登记回调函数。
_inputActionS.GamePlay.SetCallbacks(this);
}
private void OnDisable()
{
DisableAllInput();
}
/// <summary>
/// 禁用所有输入
/// </summary>
public void DisableAllInput()
{
_inputActionS.GamePlay.Disable();
}
/// <summary>
/// 启用GamePlay动作表
/// </summary>
public void EnableGamePlayInput()
{
_inputActionS.GamePlay.Enable();//启用GamePlay动作表
Cursor.visible = false;//鼠标光标隐藏
Cursor.lockState = CursorLockMode.Locked;//鼠标设置为锁定
}
public void OnMove(InputAction.CallbackContext context)
{
if (context.phase==InputActionPhase.Performed)//InputActionPhase.Performed表示输入动作为按下按键或者按住按键两个阶段
{
onMove.Invoke(context.ReadValue<Vector2>());//当玩家按下Move移动这个输入动作所绑定的按键时,就会调用onMove事件
}
if (context.phase == InputActionPhase.Canceled)
{
onStopMove.Invoke();
}
}
}
四、创建Player Input ScriptObject实例
在Settings文件夹中创建Player Input。
供后续Player脚本中使用
五、创建Player脚本
挂载在Player身上。需要通过Rigidbody的方式来控制Player,所以脚本中采取了一种扩展的方法来进行挂载组件。
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[RequireComponent(typeof(Rigidbody2D))] //直接在物体上添加Rigidbody2D组件
public class Player : MonoBehaviour
{
[SerializeField] private PlayerInput _input;
new Rigidbody2D rigidbody;
[SerializeField] private float moveSpeed = 10f;
private void Awake()
{
rigidbody = GetComponent<Rigidbody2D>();
}
void Start()
{
rigidbody.gravityScale = 0f;
_input.EnableGamePlayInput(); //激活动作表
}
void Update()
{
}
private void OnEnable()
{
_input.onMove += Move; //订阅Move事件
_input.onStopMove += StopMove; //订阅StopMove事件
}
private void OnDisable()
{
_input.onMove -= Move; //取消订阅Move事件
_input.onStopMove -= StopMove; //取消订阅StopMove事件
}
private void Move(Vector2 moveInput)
{
rigidbody.velocity = moveInput * moveSpeed;//将输入的值映射到刚体的速度
}
private void StopMove()
{
rigidbody.velocity = Vector2.zero;//将刚体的速度设为0
}
}