add controller selection, auto-search

- fix bug in master volume control where the text input doesn't work
- fix bug in the Fan Club minigame where the player wouldn't jump when they were supposed to
This commit is contained in:
minenice55 2022-07-23 22:24:07 -04:00
parent ecbe84074f
commit 06fe482f3d
8 changed files with 144 additions and 35 deletions

View file

@ -736,7 +736,7 @@ GameObject:
m_Icon: {fileID: 0} m_Icon: {fileID: 0}
m_NavMeshLayer: 0 m_NavMeshLayer: 0
m_StaticEditorFlags: 0 m_StaticEditorFlags: 0
m_IsActive: 0 m_IsActive: 1
--- !u!224 &14095204 --- !u!224 &14095204
RectTransform: RectTransform:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@ -3972,7 +3972,7 @@ RectTransform:
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0} m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 0} m_AnchorMax: {x: 1, y: 0}
m_AnchoredPosition: {x: -289.15, y: 2} m_AnchoredPosition: {x: -289.15002, y: 2}
m_SizeDelta: {x: -578.29, y: 49.92} m_SizeDelta: {x: -578.29, y: 49.92}
m_Pivot: {x: 0.5, y: 0} m_Pivot: {x: 0.5, y: 0}
--- !u!114 &156962255 --- !u!114 &156962255
@ -10814,6 +10814,9 @@ MonoBehaviour:
m_EditorClassIdentifier: m_EditorClassIdentifier:
numConnectedLabel: {fileID: 976256976} numConnectedLabel: {fileID: 976256976}
currentControllerLabel: {fileID: 1007704296} currentControllerLabel: {fileID: 1007704296}
controllersDropdown: {fileID: 1317282580}
splitControllersDropdown: {fileID: 1219573650}
autoSearchLabel: {fileID: 1359502640}
--- !u!1 &528192059 --- !u!1 &528192059
GameObject: GameObject:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@ -13272,7 +13275,7 @@ MonoBehaviour:
m_HandleRect: {fileID: 704039020} m_HandleRect: {fileID: 704039020}
m_Direction: 0 m_Direction: 0
m_Value: 0 m_Value: 0
m_Size: 0.032871276 m_Size: 0.03287128
m_NumberOfSteps: 0 m_NumberOfSteps: 0
m_OnValueChanged: m_OnValueChanged:
m_PersistentCalls: m_PersistentCalls:
@ -19115,7 +19118,7 @@ MonoBehaviour:
m_HandleRect: {fileID: 1589389271} m_HandleRect: {fileID: 1589389271}
m_Direction: 2 m_Direction: 2
m_Value: 1 m_Value: 1
m_Size: 1 m_Size: 0.9999944
m_NumberOfSteps: 0 m_NumberOfSteps: 0
m_OnValueChanged: m_OnValueChanged:
m_PersistentCalls: m_PersistentCalls:
@ -24822,7 +24825,7 @@ RectTransform:
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0.5} m_AnchorMin: {x: 0, y: 0.5}
m_AnchorMax: {x: 1, y: 0.5} m_AnchorMax: {x: 1, y: 0.5}
m_AnchoredPosition: {x: 0, y: 130.0071} m_AnchoredPosition: {x: 0, y: 129.91104}
m_SizeDelta: {x: 0, y: 0} m_SizeDelta: {x: 0, y: 0}
m_Pivot: {x: 0.5, y: 1} m_Pivot: {x: 0.5, y: 1}
--- !u!114 &1154875944 --- !u!114 &1154875944
@ -25279,7 +25282,7 @@ RectTransform:
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0} m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1} m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: 0, y: -49.999878} m_AnchoredPosition: {x: 0, y: -49.99991}
m_SizeDelta: {x: -48, y: -148} m_SizeDelta: {x: -48, y: -148}
m_Pivot: {x: 0.5, y: 0.5} m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &1182686745 --- !u!114 &1182686745
@ -38346,7 +38349,19 @@ MonoBehaviour:
m_TargetGraphic: {fileID: 1802706671} m_TargetGraphic: {fileID: 1802706671}
m_OnClick: m_OnClick:
m_PersistentCalls: m_PersistentCalls:
m_Calls: [] m_Calls:
- m_Target: {fileID: 527828799}
m_TargetAssemblyTypeName: HeavenStudio.Editor.ControllerSettings, Assembly-CSharp
m_MethodName: StartAutoSearch
m_Mode: 1
m_Arguments:
m_ObjectArgument: {fileID: 0}
m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine
m_IntArgument: 0
m_FloatArgument: 0
m_StringArgument:
m_BoolArgument: 0
m_CallState: 2
--- !u!114 &1802706671 --- !u!114 &1802706671
MonoBehaviour: MonoBehaviour:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@ -38494,7 +38509,7 @@ RectTransform:
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0} m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 0, y: 1} m_AnchorMax: {x: 0, y: 1}
m_AnchoredPosition: {x: 0, y: -84.98996} m_AnchoredPosition: {x: 0, y: -84.98999}
m_SizeDelta: {x: 320, y: -113.92} m_SizeDelta: {x: 320, y: -113.92}
m_Pivot: {x: 0, y: 1} m_Pivot: {x: 0, y: 1}
--- !u!1 &1852819572 --- !u!1 &1852819572

View file

@ -122,6 +122,7 @@ namespace HeavenStudio.Games.Scripts_FanClub
{ {
animator.Play("FanFree", -1, 0); animator.Play("FanFree", -1, 0);
stopBeat = false; stopBeat = false;
clappingStartTime = Single.MinValue;
} }
} }
} }
@ -204,6 +205,7 @@ namespace HeavenStudio.Games.Scripts_FanClub
animator.Play("FanJump", -1, 0); animator.Play("FanJump", -1, 0);
Jukebox.PlayOneShotGame("fanClub/play_jump"); Jukebox.PlayOneShotGame("fanClub/play_jump");
jumpStartTime = cond.songPositionInBeats; jumpStartTime = cond.songPositionInBeats;
clappingStartTime = Single.MinValue;
stopCharge = false; stopCharge = false;
} }

View file

@ -123,17 +123,17 @@ namespace HeavenStudio.InputSystem
public override bool GetButton(int button) public override bool GetButton(int button)
{ {
return BitwiseUtils.WantCurrent(joyBtStateCurrent.buttons, mappings[button]); return BitwiseUtils.WantCurrent(joyBtStateCurrent.buttons, 1 << mappings[button]);
} }
public override bool GetButtonDown(int button) public override bool GetButtonDown(int button)
{ {
return BitwiseUtils.WantCurrentAndNotLast(joyBtStateCurrent.buttons, joyBtStateLast.buttons, mappings[button]); return BitwiseUtils.WantCurrentAndNotLast(joyBtStateCurrent.buttons, joyBtStateLast.buttons, 1 << mappings[button]);
} }
public override bool GetButtonUp(int button) public override bool GetButtonUp(int button)
{ {
return BitwiseUtils.WantNotCurrentAndLast(joyBtStateCurrent.buttons, joyBtStateLast.buttons, mappings[button]); return BitwiseUtils.WantNotCurrentAndLast(joyBtStateCurrent.buttons, joyBtStateLast.buttons, 1 << mappings[button]);
} }
public override float GetAxis(InputAxis axis) public override float GetAxis(InputAxis axis)
@ -164,74 +164,93 @@ namespace HeavenStudio.InputSystem
public override bool GetHatDirection(InputDirection direction) public override bool GetHatDirection(InputDirection direction)
{ {
//todo: check analogue stick hat direction too //todo: check analogue stick hat direction too
int bt;
switch (direction) switch (direction)
{ {
case InputDirection.Up: case InputDirection.Up:
return BitwiseUtils.WantCurrent(joyBtStateCurrent.buttons, ButtonMaskUp); bt = mappings[0];
break;
case InputDirection.Down: case InputDirection.Down:
return BitwiseUtils.WantCurrent(joyBtStateCurrent.buttons, ButtonMaskDown); bt = mappings[1];
break;
case InputDirection.Left: case InputDirection.Left:
return BitwiseUtils.WantCurrent(joyBtStateCurrent.buttons, ButtonMaskLeft); bt = mappings[2];
break;
case InputDirection.Right: case InputDirection.Right:
return BitwiseUtils.WantCurrent(joyBtStateCurrent.buttons, ButtonMaskRight); bt = mappings[3];
break;
default: default:
return false; return false;
} }
return BitwiseUtils.WantCurrent(joyBtStateCurrent.buttons, 1 << bt);
} }
public override bool GetHatDirectionDown(InputDirection direction) public override bool GetHatDirectionDown(InputDirection direction)
{ {
//todo: check analogue stick hat direction too //todo: check analogue stick hat direction too
int bt;
switch (direction) switch (direction)
{ {
case InputDirection.Up: case InputDirection.Up:
return BitwiseUtils.WantCurrentAndNotLast(joyBtStateCurrent.buttons, joyBtStateLast.buttons, ButtonMaskUp); bt = mappings[0];
break;
case InputDirection.Down: case InputDirection.Down:
return BitwiseUtils.WantCurrentAndNotLast(joyBtStateCurrent.buttons, joyBtStateLast.buttons, ButtonMaskDown); bt = mappings[1];
break;
case InputDirection.Left: case InputDirection.Left:
return BitwiseUtils.WantCurrentAndNotLast(joyBtStateCurrent.buttons, joyBtStateLast.buttons, ButtonMaskLeft); bt = mappings[2];
break;
case InputDirection.Right: case InputDirection.Right:
return BitwiseUtils.WantCurrentAndNotLast(joyBtStateCurrent.buttons, joyBtStateLast.buttons, ButtonMaskRight); bt = mappings[3];
break;
default: default:
return false; return false;
} }
return BitwiseUtils.WantCurrentAndNotLast(joyBtStateCurrent.buttons, joyBtStateLast.buttons, 1 << bt);
} }
public override bool GetHatDirectionUp(InputDirection direction) public override bool GetHatDirectionUp(InputDirection direction)
{ {
//todo: check analogue stick hat direction too //todo: check analogue stick hat direction too
int bt;
switch (direction) switch (direction)
{ {
case InputDirection.Up: case InputDirection.Up:
return BitwiseUtils.WantNotCurrentAndLast(joyBtStateCurrent.buttons, joyBtStateLast.buttons, ButtonMaskUp); bt = mappings[0];
break;
case InputDirection.Down: case InputDirection.Down:
return BitwiseUtils.WantNotCurrentAndLast(joyBtStateCurrent.buttons, joyBtStateLast.buttons, ButtonMaskDown); bt = mappings[1];
break;
case InputDirection.Left: case InputDirection.Left:
return BitwiseUtils.WantNotCurrentAndLast(joyBtStateCurrent.buttons, joyBtStateLast.buttons, ButtonMaskLeft); bt = mappings[2];
break;
case InputDirection.Right: case InputDirection.Right:
return BitwiseUtils.WantNotCurrentAndLast(joyBtStateCurrent.buttons, joyBtStateLast.buttons, ButtonMaskRight); bt = mappings[3];
break;
default: default:
return false; return false;
} }
return BitwiseUtils.WantNotCurrentAndLast(joyBtStateCurrent.buttons, joyBtStateLast.buttons, 1 << bt);
} }
public override void SetPlayer(int playerNum) public override void SetPlayer(int? playerNum)
{ {
if (playerNum == -1) if (playerNum == -1 || playerNum == null)
{ {
this.playerNum = null; this.playerNum = null;
JslSetPlayerNumber(joyshockHandle, 0); JslSetPlayerNumber(joyshockHandle, 0);
return; return;
} }
this.playerNum = playerNum;
int ledMask = (int) this.playerNum;
if (type == TypeDualSense) if (type == TypeDualSense)
{ {
if (playerNum <= 4) if (playerNum <= 4)
{ {
playerNum = DualSensePlayerMask[playerNum]; ledMask = DualSensePlayerMask[(int) this.playerNum];
} }
} }
JslSetPlayerNumber(joyshockHandle, playerNum); JslSetPlayerNumber(joyshockHandle, ledMask);
this.playerNum = playerNum;
} }
public override int? GetPlayer() public override int? GetPlayer()

View file

@ -136,14 +136,14 @@ namespace HeavenStudio.InputSystem
} }
} }
public override void SetPlayer(int playerNum) public override void SetPlayer(int? playerNum)
{ {
if (playerNum == -1) if (playerNum == -1 || playerNum == null)
{ {
this.playerNum = null; this.playerNum = null;
return; return;
} }
this.playerNum = playerNum; this.playerNum = (int) playerNum;
} }
public override int? GetPlayer() public override int? GetPlayer()

View file

@ -159,7 +159,7 @@ namespace HeavenStudio.InputSystem
public abstract bool GetHatDirectionDown(InputDirection direction); // direction just became active? public abstract bool GetHatDirectionDown(InputDirection direction); // direction just became active?
public abstract bool GetHatDirectionUp(InputDirection direction); // direction just became inactive? public abstract bool GetHatDirectionUp(InputDirection direction); // direction just became inactive?
public abstract void SetPlayer(int playerNum); // Set the player number (starts at 1, set to -1 or null for no player) public abstract void SetPlayer(int? playerNum); // Set the player number (starts at 1, set to -1 or null for no player)
public abstract int? GetPlayer(); // Get the player number (null if no player) public abstract int? GetPlayer(); // Get the player number (null if no player)
//public abstract Sprite GetDisplayIcon(); //"big icon" for the controller in the settings menu //public abstract Sprite GetDisplayIcon(); //"big icon" for the controller in the settings menu

View file

@ -60,6 +60,7 @@ namespace HeavenStudio
InputJoyshock joyshock = new InputJoyshock(i); InputJoyshock joyshock = new InputJoyshock(i);
joyshock.InitializeController(); joyshock.InitializeController();
joyshock.SetPlayer(inputDevices.Count + 1); joyshock.SetPlayer(inputDevices.Count + 1);
inputDevices.Add(joyshock);
} }
} }
else else
@ -99,6 +100,22 @@ namespace HeavenStudio
return null; return null;
} }
public static int GetInputControllerId(int player)
{
//select input controller id that has player field set to player
//this will return the first controller that has that player number in the case of controller pairs (eg. Joy-Cons)
//so such controllers should have a reference to the other controller in the pair
//controller IDs are determined by connection order (the Keyboard is always first)
for (int i = 0; i < inputDevices.Count; i++)
{
if (inputDevices[i].GetPlayer() == player)
{
return i;
}
}
return -1;
}
public static void UpdateInputControllers() public static void UpdateInputControllers()
{ {
foreach (InputController i in inputDevices) foreach (InputController i in inputDevices)

View file

@ -17,10 +17,53 @@ namespace HeavenStudio.Editor
[SerializeField] private TMP_Text currentControllerLabel; [SerializeField] private TMP_Text currentControllerLabel;
[SerializeField] private TMP_Dropdown controllersDropdown; [SerializeField] private TMP_Dropdown controllersDropdown;
[SerializeField] private TMP_Dropdown splitControllersDropdown; [SerializeField] private TMP_Dropdown splitControllersDropdown;
[SerializeField] private GameObject autoSearchLabel;
private bool isAutoSearching = false;
private void Start() { private void Start() {
numConnectedLabel.text = "Connected: " + PlayerInput.GetNumControllersConnected(); numConnectedLabel.text = "Connected: " + PlayerInput.GetNumControllersConnected();
currentControllerLabel.text = "Current Controller: " + PlayerInput.GetInputController(1).GetDeviceName(); currentControllerLabel.text = "Current Controller: " + PlayerInput.GetInputController(1).GetDeviceName();
PopulateControllersDropdown();
PopulateSplitControllersDropdown();
controllersDropdown.onValueChanged.AddListener(delegate
{
InputController lastController = PlayerInput.GetInputController(1);
InputController newController = PlayerInput.GetInputControllers()[controllersDropdown.value];
lastController.SetPlayer(newController.GetPlayer() != null ? (int) newController.GetPlayer() : -1);
newController.SetPlayer(1);
currentControllerLabel.text = "Current Controller: " + newController.GetDeviceName();
if (typeof(InputJoyshock) == newController.GetType()) {
StartCoroutine(SelectionVibrate((InputJoyshock) newController));
}
});
}
private void Update() {
if (isAutoSearching) {
var controllers = PlayerInput.GetInputControllers();
foreach (var controller in controllers) {
if (controller.GetLastButtonDown() > 0 || controller.GetLastKeyDown() > 0) {
PlayerInput.GetInputController(1).SetPlayer(controller.GetPlayer() != null ? (int) controller.GetPlayer() : -1);
controller.SetPlayer(1);
isAutoSearching = false;
autoSearchLabel.SetActive(false);
controllersDropdown.value = PlayerInput.GetInputControllerId(1);
currentControllerLabel.text = "Current Controller: " + controller.GetDeviceName();
if (typeof(InputJoyshock) == controller.GetType()) {
StartCoroutine(SelectionVibrate((InputJoyshock) controller));
}
}
}
}
}
public void StartAutoSearch() {
autoSearchLabel.SetActive(true);
isAutoSearching = true;
} }
public void SearchAndConnectControllers() public void SearchAndConnectControllers()
@ -28,9 +71,11 @@ namespace HeavenStudio.Editor
int connected = PlayerInput.InitInputControllers(); int connected = PlayerInput.InitInputControllers();
numConnectedLabel.text = "Connected: " + connected; numConnectedLabel.text = "Connected: " + connected;
currentControllerLabel.text = "Current Controller: " + PlayerInput.GetInputController(1).GetDeviceName(); currentControllerLabel.text = "Current Controller: " + PlayerInput.GetInputController(1).GetDeviceName();
PopulateControllersDropdown();
PopulateSplitControllersDropdown();
} }
public void populateControllersDropdown() public void PopulateControllersDropdown()
{ {
List<TMP_Dropdown.OptionData> dropDownData = new List<TMP_Dropdown.OptionData>(); List<TMP_Dropdown.OptionData> dropDownData = new List<TMP_Dropdown.OptionData>();
var vals = PlayerInput.GetInputControllers(); var vals = PlayerInput.GetInputControllers();
@ -44,7 +89,7 @@ namespace HeavenStudio.Editor
controllersDropdown.value = 0; controllersDropdown.value = 0;
} }
public void populateSplitControllersDropdown() public void PopulateSplitControllersDropdown()
{ {
List<TMP_Dropdown.OptionData> dropDownData = new List<TMP_Dropdown.OptionData>(); List<TMP_Dropdown.OptionData> dropDownData = new List<TMP_Dropdown.OptionData>();
var vals = PlayerInput.GetInputControllers(); var vals = PlayerInput.GetInputControllers();
@ -62,5 +107,16 @@ namespace HeavenStudio.Editor
splitControllersDropdown.AddOptions(dropDownData); splitControllersDropdown.AddOptions(dropDownData);
splitControllersDropdown.value = 0; splitControllersDropdown.value = 0;
} }
IEnumerator SelectionVibrate(InputJoyshock controller)
{
JslSetRumbleFrequency(controller.GetHandle(), 0.2f, 0.25f, 80f, 160f);
yield return new WaitForSeconds(0.08f);
JslSetRumbleFrequency(controller.GetHandle(), 0f, 0f, 0f, 0f);
yield return new WaitForSeconds(0.04f);
JslSetRumbleFrequency(controller.GetHandle(), 0.25f, 0f, 640f, 0f);
yield return new WaitForSeconds(0.05f);
JslSetRumbleFrequency(controller.GetHandle(), 0f, 0f, 0f, 0f);
}
} }
} }

View file

@ -68,7 +68,7 @@ namespace HeavenStudio.Editor
public void OnVolLabelChanged() public void OnVolLabelChanged()
{ {
volSlider.value = (float)System.Math.Round(System.Convert.ToSingle(volLabel.text), 2); volSlider.value = (float)System.Math.Round(System.Convert.ToSingle(volLabel.text) / 100f, 2);
GlobalGameManager.ChangeMasterVolume(volSlider.value); GlobalGameManager.ChangeMasterVolume(volSlider.value);
} }
} }