C#实战课程---太空大战(第二课:InputSystem)

一、安装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
    }
}

猜你喜欢

转载自blog.csdn.net/m0_70379630/article/details/126373720