diff --git a/Game/Assets/Scripts/BedroomTask.cs b/Game/Assets/Scripts/BedroomTask.cs index 008b365..528cffa 100644 --- a/Game/Assets/Scripts/BedroomTask.cs +++ b/Game/Assets/Scripts/BedroomTask.cs @@ -13,95 +13,146 @@ using UnityEngine.XR.Interaction.Toolkit; public class BedroomTask : MonoBehaviour { + // To track how much trash has been collected so far public int trashCollected = 0; + + // Defines how much trash is needed to collect in order to unlock the door public int trashRequired = 10; - public GameObject door; // The VR swingable door object + + // Defines the door + public GameObject door; private XRGrabInteractable grabInteractable; + + // Defines door handle private Collider doorCollider; + + // Defines door's rigidbody to lock it private Rigidbody doorRigidbody; + + // Defines UI references public GameObject lockedDoorUI; public GameObject unlockedDoorUI; void Start() { + // Hide all UI prompts on start lockedDoorUI.SetActive(false); unlockedDoorUI.SetActive(false); + + // Ensure door is not null if (door != null) { + // Get the components of the door grabInteractable = door.GetComponent(); doorCollider = door.GetComponent(); doorRigidbody = door.GetComponent(); + // Ensure grab interactable is not null if (grabInteractable != null) { + // Detect when the door is grabbed grabInteractable.selectEntered.AddListener(OnDoorGrabAttempt); } + // Ensure rigidbody is not null if (doorRigidbody != null) { + // Lock the door on start LockDoor(); } } } + // Functions when trash is collected/thrown public void CollectTrash() { + // Add to trash count trashCollected++; - Debug.Log($"🗑️ Trash collected: {trashCollected}/{trashRequired}"); + Debug.Log($"Trash collected: {trashCollected}/{trashRequired}"); + // If player has collected/thrown required amount of trash if (trashCollected >= trashRequired) { + // Call unlocking door function UnlockDoor(); } } + // Functions when door is locked private void LockDoor() { + // Ensure rigidbody is not null if (doorRigidbody != null) { - doorRigidbody.isKinematic = true; // Stops movement - doorRigidbody.constraints = RigidbodyConstraints.FreezeAll; // Completely freezes door + // Stops door movement + doorRigidbody.isKinematic = true; + + // Freezes the door to ensure door doesn't open + doorRigidbody.constraints = RigidbodyConstraints.FreezeAll; } + // Ensure collider is not null if (doorCollider != null) { - doorCollider.enabled = false; // Prevents grabbing + // Prevents player from grabbing door handle + doorCollider.enabled = false; } } + // Functions when door is unlocked private void UnlockDoor() { + // Ensure rigidbody is not null if (doorRigidbody != null) { - doorRigidbody.isKinematic = false; // Allows movement + // Allows door movement + doorRigidbody.isKinematic = false; + + // Unfreezes door to let it open doorRigidbody.constraints = RigidbodyConstraints.None; // Removes restrictions } + // Ensure collider is not null if (doorCollider != null) { - doorCollider.enabled = true; // Enables grabbing + // Allows player to grab the door handle + doorCollider.enabled = true; } - + + // Show the unlocked door UI + unlockedDoorUI.SetActive(true); + + // Call the function to hide the UI after delay StartCoroutine(HideMessageAfterSeconds(unlockedDoorUI, 5f)); Debug.Log("Room is clean! The door is now unlocked."); } + // Function when player tries to grab the door private void OnDoorGrabAttempt(SelectEnterEventArgs args) { + // If the amount of trash collected is lesser than the required amount if (trashCollected < trashRequired) { + // Show the locked door UI + lockedDoorUI.SetActive(true); + + // Call the function to hide the UI after delay StartCoroutine(HideMessageAfterSeconds(lockedDoorUI, 5f)); Debug.Log("The door is locked! Clean the room first."); } } + // Function when the task is completed public bool IsTaskCompleted() { + // Trash collected is more or equal to trash required to collect return trashCollected >= trashRequired; } + // Function to hide the UI after a delay private IEnumerator HideMessageAfterSeconds(GameObject uiElement, float delay) { + // Waits for delay to end and hides the UI yield return new WaitForSeconds(delay); uiElement.SetActive(false); } diff --git a/Game/Assets/Scripts/InfoCollector.cs b/Game/Assets/Scripts/InfoCollector.cs index 03f6c83..66fbdc1 100644 --- a/Game/Assets/Scripts/InfoCollector.cs +++ b/Game/Assets/Scripts/InfoCollector.cs @@ -11,10 +11,15 @@ using TMPro; public class InfoCollector : MonoBehaviour { - public float detectionRange = 5f; - public TMP_Text infoText; // Reference to a UI Text (TextMeshPro) + public float detectionRange = 2f; // Adjust for accurate VR detection + public float gazeTimeRequired = 2f; // Time the player must look at the object before collecting info + public float displayTime = 5f; // How long the info stays on screen + public TMP_Text infoText; // UI Text (TextMeshPro) + private Camera vrCamera; private bool isDisplaying = false; + private GameObject currentObject = null; + private float gazeTimer = 0f; void Start() { @@ -29,11 +34,30 @@ public class InfoCollector : MonoBehaviour if (Physics.Raycast(ray, out hit, detectionRange)) { - if (hit.collider.CompareTag("InfoObject") && !isDisplaying) + if (hit.collider.CompareTag("InfoObject")) { - CollectInfo(hit.collider.gameObject); + if (currentObject == hit.collider.gameObject) + { + gazeTimer += Time.deltaTime; + if (gazeTimer >= gazeTimeRequired && !isDisplaying) + { + CollectInfo(currentObject); + } + } + else + { + // Reset timer if looking at a new object + currentObject = hit.collider.gameObject; + gazeTimer = 0f; + } } } + else + { + // Reset if no valid object is in view + currentObject = null; + gazeTimer = 0f; + } } void CollectInfo(GameObject obj) @@ -42,8 +66,8 @@ public class InfoCollector : MonoBehaviour infoText.text = "Info Collected: " + obj.name + "\n" + GetObjectInfo(obj); Debug.Log("Collected information from: " + obj.name); - // Hide text after 3 seconds - Invoke("ClearText", 3f); + // Hide text after displayTime + Invoke(nameof(ClearText), displayTime); } void ClearText() @@ -55,12 +79,9 @@ public class InfoCollector : MonoBehaviour string GetObjectInfo(GameObject obj) { // Define object descriptions here - if (obj.name == "AncientArtifact") - return "This artifact was used by an old civilization..."; - - if (obj.name == "HologramTerminal") - return "A futuristic data console storing historical records."; + if (obj.name == "Info") + return "Test"; return "An unknown object with mysterious origins."; } -} +} \ No newline at end of file