Unity-InputSystem Action Maps有什么用|PlayerInput切换操作映射

Action Maps作用

Action Maps 包含特定类型行为的所有动作。

比如你可以把角色正常状态下的动作放在一起,像移动,跳跃,开火等
一个Action Maps 代表一个状态下的行为映射集合。

那么似乎我只需要一个Action Maps就够了,那为什么要多个呢?

何时需要多个Action Maps

比如一个吃鸡游戏,有行走状态、驾驶汽车的状态、在界面上的状态。

这时我们就需要为这些状态各自配置独立的Action Map去控制操作。如,为行走状态配置ActionMap映射移动(wasd)、跳跃(空格),同时你又需要另一个Action Maps 用于控制驾驶 映射开车(wasd)、跳车(空格)。

这两种操作之间可能会发生按键冲突,你可以在不同的状态下切换Action Maps从而满足游戏需求。

切换Action Maps

在游戏中想要进行切换,可以通过脚本调用ActionMap对象的Enable、Disable函数以及playerinput的SwitchCurrentActionMaps函数

ActionMap开关:

SwitchCurrentActionMaps:

 

Default ActionMap无效问题

问题描述

PlayerInput设置默认的ActionMap(手动Enable也无效)  在运行后 所有ActionMap映射全部开启了,并没有遵循仅启用DefaultActionMap的规则。

测试:当我默认启用ActionMap - B,运行项目尝试ActionMap-B、ActionMap - A 中的 Move映射。

Move行为映射配置:

发现ActionMap - A 的映射也被启用了,并没有阻止其输入。

尽管在代码中尝试手动调用映射地图的Enable、Disable函数,也无法正常控制映射地图的开关。如图

通过输出消息可以发现所有映射都处于打开状态。

解决方案

看到DefaultMap字段笔者觉得Unity应该会自动的仅启用DefaultMap映射,但实际不然。经过测试发现PlayerInput.SwitchCurrentActionMaps以及设置DefaultMap后并没有关闭其他ActionMaps,默认所有ActionMap状态都为True。那么DefaultMap在这里貌似并没有什么作用,或许仅仅是初始化了CurrentActionMap。

那么我们需要手动对所有ActionMaps进行开关控制。

代码如下:

public PlayerInput playerInput;
    public InputActionMap map;
    public InputScheme inputScheme;
    public void Start()
    {
        playerInput=GetComponent<PlayerInput>();
        inputScheme = new InputScheme();
        LogActionMapStatus();
        TestActionMap();
    }
    
    public  void LogActionMapStatus()
    {
        //inputScheme.asset.actionMaps 不是访问的不是playerinput的实例对象。
        //foreach (var item in inputScheme.asset.actionMaps)
        //{
        //    Debug.Log(item.name + "Status:" + item.enabled);
        //}
        foreach (var item in playerInput.actions.actionMaps)
        {
            Debug.Log(item.name + "Status:" + item.enabled);
        }
    }
    public void CloseAllActionMaps()
    {
        foreach (var item in playerInput.actions.actionMaps)
        {
            item.Disable();
        }
    }
    public void TestActionMap()
    {
        //playerInput.currentActionMap.Disable();
        CloseAllActionMaps();
        Debug.Log("CurrentActionMap:" + playerInput.currentActionMap);
        playerInput.SwitchCurrentActionMap("B");
        Debug.Log("CurrentActionMap:" + playerInput.currentActionMap);
        playerInput.currentActionMap.Enable();
        LogActionMapStatus();
    }

测试结果:ActionMap - A成功被禁用,键位映射正确。

特别说明:

想要拿到所有的ActionMap映射,要从playerInput实例对象的空间中拿到actionMaps,这份actionMaps数据才是真正参与GameLogic的。

inputScheme.asset.actionMaps获取到的仅是一份文件数据拷贝。

示例代码:

public  void LogActionMapStatus()
    {
        //inputScheme.asset.actionMaps 不是访问的不是playerinput的实例对象。
        //foreach (var item in inputScheme.asset.actionMaps)
        //{
        //    Debug.Log(item.name + "Status:" + item.enabled);
        //}
        foreach (var item in playerInput.actions.actionMaps)
        {
            Debug.Log(item.name + "Status:" + item.enabled);
        }
    }

 

 

作者:Miracle
来源:麦瑞克博客
链接:https://www.unitymake.com/archives/unity/1372
本博客所有文章除特别声明外,均采用CC BY-NC-SA 4.0许可协议,转载请注明!
THE END
分享
打赏
海报
Unity-InputSystem Action Maps有什么用|PlayerInput切换操作映射
Action Maps作用 Action Maps 包含特定类型行为的所有动作。 比如你可以把角色正常状态下的动作放在一起,像移动,跳跃,开火等 一个Action Maps 代表一个状态……
<<上一篇
下一篇>>
文章目录
关闭
目 录