private static void UpdateControllers() { if (api == null) { return; } // Update controller state. api.RunFrame(); // Check if we have any new controllers have appeared. if (s_ConnectedControllers == null) { s_ConnectedControllers = new SteamHandle <SteamController> [STEAM_CONTROLLER_MAX_COUNT]; } var numConnectedControllers = api.GetConnectedControllers(s_ConnectedControllers); for (var i = 0; i < numConnectedControllers; ++i) { var handle = s_ConnectedControllers[i]; // See if we already have a device for this one. if (s_InputDevices != null) { SteamController existingDevice = null; for (var n = 0; n < s_InputDeviceCount; ++n) { if (s_InputDevices[n].handle == handle) { existingDevice = s_InputDevices[n]; break; } } // Yes, we do. if (existingDevice != null) { continue; } } // No, so create a new device. var controllerLayouts = InputSystem.ListLayoutsBasedOn("SteamController"); foreach (var layout in controllerLayouts) { // Rather than directly creating a device with the layout, let it go through // the usual matching process. var device = InputSystem.AddDevice(new InputDeviceDescription { interfaceName = SteamController.kSteamInterface, product = layout }); // Make sure it's a SteamController we got. var steamDevice = device as SteamController; if (steamDevice == null) { Debug.LogError(string.Format( "InputDevice created from layout '{0}' based on the 'SteamController' layout is not a SteamController", device.layout)); continue; } // Resolve the controller's actions. steamDevice.InvokeResolveActions(); // Assign it the Steam controller handle. steamDevice.handle = handle; ArrayHelpers.AppendWithCapacity(ref s_InputDevices, ref s_InputDeviceCount, steamDevice); } } // Update all controllers we have. for (var i = 0; i < s_InputDeviceCount; ++i) { var device = s_InputDevices[i]; var handle = device.handle; // Check if the device still exists. var stillExists = false; for (var n = 0; n < numConnectedControllers; ++n) { if (s_ConnectedControllers[n] == handle) { stillExists = true; break; } } // If not, remove it. if (!stillExists) { ArrayHelpers.EraseAtByMovingTail(s_InputDevices, ref s_InputDeviceCount, i); ////REVIEW: should this rather queue a device removal event? InputSystem.RemoveDevice(device); --i; continue; } ////TODO: support polling Steam controllers on an async polling thread adhering to InputSystem.pollingFrequency // Otherwise, update it. device.InvokeUpdate(); } }
private static void UpdateControllers() { if (api == null) { return; } // Check if we have any controllers have appeared or disappeared. if (s_ConnectedControllers == null) { s_ConnectedControllers = new ulong[STEAM_CONTROLLER_MAX_COUNT]; } var numConnectedControllers = api.GetConnectedControllers(s_ConnectedControllers); for (var i = 0; i < numConnectedControllers; ++i) { var handle = s_ConnectedControllers[i]; // See if we already have a device for this one. if (s_InputDevices != null) { SteamController existingDevice = null; for (var n = 0; n < s_InputDeviceCount; ++n) { if (s_InputDevices[n].steamControllerHandle == handle) { existingDevice = s_InputDevices[n]; break; } } // Yes, we do. if (existingDevice != null) { continue; } } // No, so create a new device. var controllerLayouts = InputSystem.ListLayoutsBasedOn("SteamController"); foreach (var layout in controllerLayouts) { // Rather than directly creating a device with the layout, let it go through // the usual matching process. var device = InputSystem.AddDevice(new InputDeviceDescription { interfaceName = SteamController.kSteamInterface, product = layout }); // Make sure it's a SteamController we got. var steamDevice = device as SteamController; if (steamDevice == null) { Debug.LogError(string.Format( "InputDevice created from layout '{0}' based on the 'SteamController' layout is not a SteamController", device.layout)); continue; } // Assign it the Steam controller handle. steamDevice.steamControllerHandle = handle; ArrayHelpers.AppendWithCapacity(ref s_InputDevices, ref s_InputDeviceCount, steamDevice); } } if (s_InputDevices != null) { // Remove anything no longer there. for (var i = 0; i < s_InputDeviceCount; ++i) { var device = s_InputDevices[i]; var handle = device.steamControllerHandle; var stillExists = false; for (var n = 0; n < numConnectedControllers; ++n) { if (s_ConnectedControllers[n] == handle) { stillExists = true; break; } } if (!stillExists) { ArrayHelpers.EraseAtByMovingTail(s_InputDevices, ref s_InputDeviceCount, i); InputSystem.RemoveDevice(device); } } } }