Advanced Interaction in Unity VR

Published on October 31, 2023

Welcome back to our Unity 3D VR development series! In this tutorial, we'll elevate your VR experience by adding advanced interaction features such as jumping, running, and interacting with objects in the virtual environment.

Step 1: Enhance the Character Controller

Building upon the previous tutorial, let's enhance the character controller script to support jumping and running. Open the `OculusCharacterController.cs` script and modify it:


    using UnityEngine;

    public class OculusCharacterController : MonoBehaviour
    {
        public float speed = 3.0f;
        public float jumpForce = 5.0f;
        CharacterController characterController;
        bool isGrounded;

        void Start()
        {
            characterController = GetComponent<CharacterController>();
        }

        void Update()
        {
            // Check if the character is grounded
            isGrounded = characterController.isGrounded;

            // Get Oculus joystick input
            float horizontal = OVRInput.Get(OVRInput.Axis2D.PrimaryThumbstick).x;
            float vertical = OVRInput.Get(OVRInput.Axis2D.PrimaryThumbstick).y;

            // Calculate movement direction
            Vector3 moveDirection = new Vector3(horizontal, 0.0f, vertical).normalized;

            // Convert to world space
            moveDirection = Camera.main.transform.TransformDirection(moveDirection);

            // Apply speed and move the character
            characterController.Move(moveDirection * speed * Time.deltaTime);

            // Jumping
            if (isGrounded && OVRInput.GetDown(OVRInput.Button.PrimaryIndexTrigger))
            {
                // Apply jump force
                moveDirection.y = jumpForce;
            }

            // Running
            if (OVRInput.Get(OVRInput.Button.SecondaryIndexTrigger))
            {
                // Increase movement speed when running
                characterController.Move(moveDirection * (speed * 2) * Time.deltaTime);
            }
        }
    }

                

This enhanced script now includes logic for jumping and running. Jumping is triggered by pressing the primary index trigger, and running is activated by holding the secondary index trigger.

Step 2: Interacting with Objects

Let's extend our VR experience by allowing the player to interact with objects. Create a new script named `ObjectInteraction.cs`:


    using UnityEngine;

    public class ObjectInteraction : MonoBehaviour
    {
        void Update()
        {
            // Check for interaction input (e.g., pressing a button on the controller)
            if (OVRInput.GetDown(OVRInput.Button.PrimaryHandTrigger))
            {
                // Perform object interaction logic here
                RaycastHit hit;
                if (Physics.Raycast(transform.position, transform.forward, out hit, 3.0f))
                {
                    // Check if the hit object has an interactable component
                    InteractableObject interactable = hit.collider.GetComponent<InteractableObject>();
                    if (interactable != null)
                    {
                        // Interact with the object
                        interactable.Interact();
                    }
                }
            }
        }
    }

                

Attach this script to your VR camera or player controller. It checks for interaction input and casts a ray forward. If the ray hits an object with an `InteractableObject` component, it triggers the interaction.

Create a script named `InteractableObject.cs` and attach it to any object you want to make interactable:


    using UnityEngine;

    public class InteractableObject : MonoBehaviour
    {
        public void Interact()
        {
            // Implement your object interaction logic here
            Debug.Log("Object Interacted: " + gameObject.name);
            // Add your custom interaction code (e.g., open a door, pick up an item, etc.)
        }
    }

                

With this setup, any object with the `InteractableObject` component can be interacted with by pressing the primary hand trigger on the Oculus controller.

Step 3: Testing the Advanced Interaction

Run your scene in VR mode, and you'll now have a more immersive experience. Try jumping, running, and interacting with objects in your virtual environment!

Conclusion

Congratulations on implementing advanced interaction features in your Unity VR project. You've expanded the possibilities of your virtual world, providing a more engaging and dynamic experience for the user.

Next Steps

Experiment with additional features, such as grabbing and throwing objects, implementing a teleportation system, or integrating realistic physics interactions. The possibilities are endless!

Stay tuned for more tutorials exploring advanced VR concepts and features.