我正在开发一个快速的自上而下的角色控制器,我想检测我当前使用的控制方案是游戏手柄还是键盘。我的问题是,Unity 似乎默认并且只检测游戏手柄,即使我拔掉/分离了任何游戏手柄控制器并严格使用键盘和鼠标也是如此。
我尝试为我的主要运动脚本检测这一点的主要方法是在玩家输入组件中的“控件更改事件”上调用一个函数
它只会在 true 时触发,并且在实践中它只会在启动时运行一次,再也不会运行。
public void OnDeviceChanged(PlayerInput playInput)
{
isGamepadActive = playInput.currentControlScheme.Equals("GamePad") ? true : false;
Debug.Log(isGamepadActive);
}
我很难看到其他人是否也有类似的问题,我怀疑这可能是 Unity 检测/使用当前控制方案的方式。
我希望有人能解决这个问题,非常感谢您的宝贵时间!
潜在问题 A:多个玩家输入
如果场景中有多个 PlayerInput 组件,那么它将绑定到单个输入设备。您需要从场景中删除除一个 PlayerInput 组件之外的所有组件,或者创建您自己的不依赖于 PlayerInput 的组件。
潜在问题 B:设置问题
检查您是否已从 InputActionsAsset 中选择默认控制方案作为 PlayerInput 检查器上的 Gamepad。您是使用具有多个 ControlScheme 的单个 InputActionsAsset,还是使用每个都有自己的控制方案的多个 InputActionsAsset?
如果这没有帮助...
您可以通过 InputActionAssets 列表进行搜索来获取当前活动的控制方案,而无需依赖 PlayerInput 组件的事件:
[SerializeField]
private List<InputActionAsset> inputActionAssets;
private bool TryFindControlScheme(InputDevice inputDevice, out InputControlScheme? controlScheme)
{
// try to get the control scheme directly from the device
foreach (InputActionAsset inputActionAsset in inputActionAssets)
{
controlScheme = InputControlScheme.FindControlSchemeForDevice(inputDevice, inputActionAsset.controlSchemes);
if (controlScheme.HasValue) { return true; }
}
// try to get the control scheme from inputActionAsset's controlSchemes' supported devices
foreach (var inputActionAsset in inputActionAssets)
{
foreach (var inputControlScheme in inputActionAsset.controlSchemes)
{
if (inputControlScheme.SupportsDevice(inputDevice))
{
controlScheme = inputControlScheme;
return true;
}
}
}
// unable to find control scheme
controlScheme = null;
return false;
}