66 lines
2.5 KiB
C#
66 lines
2.5 KiB
C#
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;
|
||
}
|
||
}
|
||
}
|