C# 実践講座 --- 宇宙戦争 (Lesson 2: InputSystem)

1.InputSystem パッケージをインストールする

二、InputActionを作る

Settings フォルダーに InputActions ファイルを作成し、GamePlay ActionMap アクション テーブルを作成します。

図に示すようにプロパティを設定します

 プラス記号をクリックして新しいバインディングを作成し、2 つのバインディングをそれぞれ左スティックとクロス タイプに設定します。

 新しいバインドされた 2D ベクトル コンポジット、WASD を作成します。

モニターボタンで上下左右に対応するボタンを設定します。

 InputActions ファイルをクリックして C# スクリプト ファイル InputActionS を生成し、Scripts/Input に配置します。

3. PlayerInput ScriptObject スクリプトを作成する

このスクリプトをより便利に呼び出すために、ScriptObject の方法で作成されます。

C# スクリプトを作成する

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();
        }
    }
}

 4. Player Input ScriptObject のインスタンスを作成する

 Settings フォルダに Player Input を作成します。

 後続の Player スクリプトで使用するため

5. 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