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);
}
}
来源:麦瑞克博客
链接:https://www.playcreator.cn/archives/unity/1372/
本博客所有文章除特别声明外,均采用CC BY-NC-SA 4.0许可协议,转载请注明!