27. Dezember 2024

Studio Game 2 – Woche 2

Ich habe mich in der zweiten Woche weiterhin mit den Mechaniken und

 

Controller Input:

Da die Controller-Eingaben mit Steam VR 2.0 nicht mehr so funktionieren wie bei Steam VR 1.0 musste ich mich damit beschäftigen meine Angepassten Steuerungseingaben abzufragen. Das Ziel war es mithilfe des Trackpads ein Menü zu öffnen und mithilfe der Touchposition einen Auswahl zu treffen. Leider hat das Trackpad nur zwei States und einen Vector 2 Output, weshalb ich die Userexperience nicht so gestalten konnte wie ursprünglich geplant, da ich der Click-Input bereits vom Teleport genutzt wird.

Ein weiterer State ist „Touched“, also ob das Trackpad berührt wird, und der dazugehörende Wert der Position kann auch abgefragt werden.

Hierfür habe ich im Unity in den SteamVR Input Einstellungen unter Window -> SteamVR Input drei neue Actionen definiert:

Nach erstellen der Actions muss man über Open Binding UI die neu erstellten Actions den Controller Buttons zuweisen:

Nach dem Binding muss man zurück ins Unity und mit Save & Generate die Einstellungen übernehmen.

Um im Script die Eingaben abzufragen war es nötig die Actions mit Funktionen zu verbinden:

public SteamVR_ActionSet actionSetEnable;

public SteamVR_Action_Boolean MenuButton;
public SteamVR_Action_Boolean TouchPad;
public SteamVR_Action_Vector2 TouchPos;

 

Abfrage ob der MenuButton gedrückt wurde:

MenuButton.GetState(SteamVR_Input_Sources.AnyVector2 menuPosition)

Abfrage wo das Trackpad berührt wird (falls das Trackpad nicht berührt wird gibt TouchPos.GetAxis einen Vector von (0,0) zurück:

Vector2 menuPosition = TouchPos.GetAxis(SteamVR_Input_Sources.Any);

 

Menu Selection:

Um eine die Position des Fingers darzustellen muss man zuerst den Winkel definieren und danach schauen in welchem Segment des Kreises dieser Winkel liegt.

 

private void touchSelect(Vector2 menuPosition, bool leftHandTouched, bool rightHandTouched)
{
double segmentsize = Math.PI / 4;
double phi = 0;

//calculate Phi
if (menuPosition.x > 0)
{
phi = Math.Atan(menuPosition.y / menuPosition.x);
}
else if (menuPosition.x < 0 && menuPosition.y >= 0)
{
phi = Math.Atan(menuPosition.y / menuPosition.x) +      Math.PI;
}
else if (menuPosition.x < 0 && menuPosition.y < 0)
{
phi = Math.Atan(menuPosition.y / menuPosition.x) –      Math.PI;
}
else if (menuPosition.x == 0 && menuPosition.y > 0)
{
phi = Math.PI / 2;
}
else if (menuPosition.x == 0 && menuPosition.y < 0)
{
phi = -1 * Math.PI / 2;
}

//check in which segment phi is.
//Debug.Log(phi);
//Debug.Log(segmentsize);
if (phi > 0 && phi < segmentsize)
{
if (rightHandTouched)
{
menusL[0].SetActive(true);
activeMenu = menusL[0];
}
else if (rightHandTouched)
{
menusR[0].SetActive(true);
activeMenu = menusR[0];
}
selectedPrefab = objectPrefabs[0];
}
else if (phi > segmentsize && phi < segmentsize * 2)
{
if (leftHandTouched)
{
menusL[1].SetActive(true);
activeMenu = menusL[1];
}
else if (rightHandTouched)
{
menusR[1].SetActive(true);
activeMenu = menusR[1];
}
selectedPrefab = objectPrefabs[0];
}
else if (phi > segmentsize * 2 && phi < segmentsize * 3)
{
if (leftHandTouched)
{
menusL[2].SetActive(true);
activeMenu = menusL[2];
}
else if (rightHandTouched)
{
menusR[2].SetActive(true);
activeMenu = menusR[2];
}
selectedPrefab = objectPrefabs[0];

}
else if (phi > segmentsize * 3 && phi < segmentsize * 4)
{
if (leftHandTouched)
{
menusL[3].SetActive(true);
activeMenu = menusL[3];
}
else if (rightHandTouched)
{
menusR[3].SetActive(true);
activeMenu = menusR[3];
}
selectedPrefab = objectPrefabs[0];
}
else if (phi < 0 && phi > -1 * segmentsize)
{
if (leftHandTouched)
{
menusL[7].SetActive(true);
activeMenu = menusL[7];
}
else if (rightHandTouched)
{
menusR[7].SetActive(true);
activeMenu = menusR[7];
}
selectedPrefab = objectPrefabs[0];

}
else if (phi < (-1 * segmentsize) && phi > (segmentsize * -2))
{
if (leftHandTouched)
{
menusL[6].SetActive(true);
activeMenu = menusL[6];
}
else if (rightHandTouched)
{
menusR[6].SetActive(true);
activeMenu = menusR[6];
}
selectedPrefab = objectPrefabs[0];
}
else if (phi < segmentsize * -2 && phi > segmentsize * -3)
{
if (leftHandTouched)
{
menusL[5].SetActive(true);
activeMenu = menusL[5];
}
else if (rightHandTouched)
{
menusR[5].SetActive(true);
activeMenu = menusR[5];
}
selectedPrefab = objectPrefabs[0];

}
else if (phi < segmentsize * -3 && phi > segmentsize * -4)
{
if (leftHandTouched)
{
menusL[4].SetActive(true);
activeMenu = menusL[4];
}
else if (rightHandTouched)
{
menusR[4].SetActive(true);
activeMenu = menusR[4];
}
selectedPrefab = objectPrefabs[0];
}

for (int i = 0; i < menusL.Length; i++)
{
if (activeMenu != menusL[i])
{
menusL[i].SetActive(false);
}
if (activeMenu != menusR[i])
{
menusR[i].SetActive(false);
}
selectedPrefab = objectPrefabs[0];
}
}
}

 

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert