Unity新版输入系统简单使用

介绍之类的不在赘述,网上有许多教程.这里主要是怎么介绍快速调用

这里给出一个自认为不错的教程链接:Unity Input System 新输入系统的功能及用法介绍_unity 新输入系统_ZeryChen的博客-CSDN博客

一:直接输入

直接输入和旧版的用法差不多,直接上代码

using UnityEngine;
using UnityEngine.InputSystem;
using Touch = UnityEngine.InputSystem.EnhancedTouch.Touch;
using TouchPhase = UnityEngine.InputSystem.TouchPhase;

public class DirectInput : MonoBehaviour
{
    private Mouse mouse;
    private Keyboard keyboard;
    private Gamepad gamepad;
    private void Start()
    {
        //获取到游戏手柄之类的设备输入
        gamepad = Gamepad.current;
        //获取到键盘之类的设备输入
        keyboard = Keyboard.current;
        //获取到鼠标
        mouse = Mouse.current;

        //当输入设备改变时的回调方法
        InputSystem.onDeviceChange += (device, change) =>
        {
            switch (change)
            {
                case InputDeviceChange.Added:

                    break;
                case InputDeviceChange.Disconnected:

                    break;
                case InputDeviceChange.Removed:

                    break;
                default:
                    break;
            }
        };

    }
    private void Update()
    {
        //当前帧摁下了空格
        if (keyboard.spaceKey.wasPressedThisFrame)
        {
            Debug.Log("当前帧摁下了空格!");
        }
        //具有按钮或其他类型的输入的其他设备
        if (mouse.leftButton.isPressed)
        {
            Debug.Log("点击了鼠标左键!");
        }
        //是否摁下了a键
        if (Keyboard.current.aKey.isPressed)
        {
            Debug.Log("摁到了a键");
        }
        return;
        //针对移动平台的
        foreach (var touch in Touch.activeTouches)
        {
            if (touch.phase.Equals(TouchPhase.Began))
            {
                Debug.Log("手指触摸到了屏幕");
            }
        }
    }

}

二:消息驱动响应(Send Messages Broadcast Messages--------------不建议使用)

1. 注意事项函数必须以On开头

2.必须与Player Input挂在同一个对象下

 

using UnityEngine;
using UnityEngine.InputSystem;

// 此脚本必须与相关PlayerInput组件挂载到同一个GameObject
public class MyMessages : MonoBehaviour
{
    //对应的Move响应
   public void OnMove(InputValue inputValue)
    {
        Debug.Log(inputValue.Get<Vector2>());
    }
}

三:事件驱动响应-UnityEvent(Invoke Unity Events)

1.新建一个脚本UnityEventInput 把脚本挂在随意一个物体上

2.写一个函数,触发Move时调用,其他Fire,Jump 什么自定义委托也是一样

using UnityEngine;
using UnityEngine.InputSystem;

public class UnityEventInput : MonoBehaviour
{
    public void GetCurrentObjMoveInfo(InputAction.CallbackContext callbackContext)
    {
        //获取到输入的值
        //Debug.Log(callbackContext.ReadValue<Vector2>());
        if (callbackContext.started)
            Debug.Log(transform.name + "开始");
        if (callbackContext.performed)
            Debug.Log(transform.position + "进行中");
        if (callbackContext.canceled)
            Debug.Log(transform.name + "结束输入了");
    }
}

3.在Player Input 上赋值

 四:事件驱动响应-原生event(Invoke CSharp Events)

1.切换行为模式

2.找个物体挂上去实例出来 就能获取到值

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

public class CShaperEventInput : MonoBehaviour
{
    private PlayerInput playerInput;
    private InputAction move;
    private InputAction fire;
    private void Start()
    {
        //PlayerInput可能有多个实例对象 用这个方法找,会按照场景中的物体从下往上找,也可以直接拖拽赋值 等等
        playerInput = PlayerInput.GetPlayerByIndex(0);
        // playerInput = FindObjectOfType<PlayerInput>();
        move = playerInput.actions["Move"];
        fire = playerInput.actions["Fire"];


        move.started += (parame) =>
        {
            Debug.Log("移动开始");
        };
        move.performed += (parame) =>
        {
            Debug.Log("移动进行中");
        };
        move.canceled += (parame) =>
        {
            Debug.Log("移动结束");
        };

    }


    private void Update()
    {
        //也可以每帧去读取移动的值
        Debug.Log(move.ReadValue<Vector2>());

        if (fire.IsPressed())
        {
            Debug.Log("开火中");
        }
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值