using UnityEngine; using RootMotion.FinalIK; namespace RootMotion.Demos { // Moving the demo VR character controller. public class VRController : MonoBehaviour { [System.Serializable] public enum InputMode { Input = 0, WASDOnly = 1, } public InputMode inputMode; public VRIK ik; public Transform centerEyeAnchor; // Match these values to velocities in the locomotion animation blend tree for better looking results (avoids half-blends) public float walkSpeed = 1f; public float runSpeed = 3f; public float walkForwardSpeedMlp = 1f; public float runForwardSpeedMlp = 1f; private Vector3 smoothInput, smoothInputV; private void Update() { // Get input Vector3 input = GetInput(); input *= ik.solver.scale; float fDot = Vector3.Dot(input, Vector3.forward); bool f = fDot > 0f; // Locomotion speed float s = walkSpeed; if (Input.GetKey(KeyCode.LeftShift)) { s = runSpeed; if (f) s *= runForwardSpeedMlp; // Walk faster/slower when moving forward } else { if (f) s *= walkForwardSpeedMlp; // Run faster/slower when moving forward } // Input smoothing smoothInput = Vector3.SmoothDamp(smoothInput, input * s, ref smoothInputV, 0.1f); // Rotate input to avatar space Vector3 forward = centerEyeAnchor.forward; forward.y = 0f; Quaternion avatarSpace = Quaternion.LookRotation(forward); // Apply transform.position += avatarSpace * smoothInput * Time.deltaTime; } // Returns keyboard/thumbstick input vector private Vector3 GetInput() { switch (inputMode) { case InputMode.Input: Vector3 v = new Vector3(Input.GetAxisRaw("Horizontal"), 0f, Input.GetAxisRaw("Vertical")); if (v.sqrMagnitude < 0.3f) return Vector3.zero; return v.normalized; case InputMode.WASDOnly: Vector3 input = Vector3.zero; if (Input.GetKey(KeyCode.W)) input += Vector3.forward; if (Input.GetKey(KeyCode.S)) input += Vector3.back; if (Input.GetKey(KeyCode.A)) input += Vector3.left; if (Input.GetKey(KeyCode.D)) input += Vector3.right; return input.normalized; default: return Vector3.zero; } } } }