Files
RoomAwareVR/Assets/_Scripts/Utility/OVRStickAndRoomscaleMovement.cs
T
2025-10-02 00:07:11 +02:00

66 lines
2.5 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using Unity.Netcode;
using UnityEngine;
// Dieses Skript ist notwendig, um zum einen Smooth-Movement per Stick-Bewegung zu ermöglichen und zum anderen, dass der Character-Controller bei der physikalischen
// Roomscale-Bewegung dem/der NutzerIn folgt.
[RequireComponent(typeof(CharacterController))]
public class OVRStickAndRoomscaleMovement : NetworkBehaviour
{
public float speed = 2.0f;
public float gravity = -9.81f;
public Transform cameraTransform; // CenterEyeAnchor
public Transform rigRoot; // OVRCameraRig Root wichtig für Höhe!
private CharacterController characterController;
private Vector3 velocity;
public float minHeight = 1.0f; // Minimal mögliche Körpergröße (oder Größe wenn geduckt)
public float maxHeight = 2.2f; // Maximal mögliche Körpergröße
public float skinWidth = 0.05f; // Durchmesser des Kapsel-Colliders für den Körper. Darf nicht zu groß sein, um sich z.B. über Tische beugen zu können, ohne von der ingame-
// Physik weggeschoben zu werden.
void Start()
{
//if (!IsOwner) return; Wäre nur bei Multiplayer wichtig.
characterController = GetComponent<CharacterController>();
if (cameraTransform == null && Camera.main != null)
cameraTransform = Camera.main.transform;
}
void Update()
{
//if (!IsOwner) return; Wäre nur bei Multiplayer wichtig.
// 1. Position des Kopfes in der realen Welt bestimmen.
Vector3 headLocalPos = rigRoot.InverseTransformPoint(cameraTransform.position);
// 2. Höhe anpassen (Stehen, Hocken)
float height = Mathf.Clamp(headLocalPos.y, minHeight, maxHeight);
characterController.height = height;
// 3. Center des CharacterControllers so setzen, dass er immer den Spieler umschließt
characterController.center = new Vector3(headLocalPos.x, height / 2f + characterController.skinWidth, headLocalPos.z);
// 4. Stick Movement
Vector2 inputPos = OVRInput.Get(OVRInput.Axis2D.PrimaryThumbstick);
Vector2 inputRot = OVRInput.Get(OVRInput.Axis2D.SecondaryThumbstick);
Vector3 move = cameraTransform.forward * inputPos.y + cameraTransform.right * inputPos.x;
move.y = 0;
move.Normalize();
characterController.Move(move * speed * Time.deltaTime);
// 5. Gravity
velocity.y += gravity * Time.deltaTime;
characterController.Move(velocity * Time.deltaTime);
if (characterController.isGrounded)
{
velocity.y = 0f;
}
}
}