OpenXR

BallSpawner

In Assets/Scripts/BallSpawner.cs,

using UnityEngine;

public class BallSpawner : MonoBehaviour
{
    [SerializeField] private GameObject prefabToSpawn;

    private GameObject spawnedObject;

    private void Start()
    {
        prefabToSpawn.SetActive(false);
    }

    public void SpawnNewOne()
    {
        if (spawnedObject != null)
        {
            Destroy(spawnedObject);
        }

        spawnedObject = Instantiate(prefabToSpawn, transform.position, Quaternion.identity);
        spawnedObject.SetActive(true);
    }
}

GlassManager

In Assets/Scripts/GlassManager.cs,

//using System.Collections;
//using System.Collections.Generic;
using UnityEngine;

public class GlassManager : MonoBehaviour
{
    // [SerializeField] private Transform[] possibleGlassSpawns;
    [SerializeField] private GameObject[] glassVariants;

    void Awake()
    {
        SpawnGlass();
    }

    public void SpawnGlass()
    {
        Debug.Log("Spawning glass...");
        // Transform spawnPos = possibleGlassSpawns[Random.Range(0, possibleGlassSpawns.Length)];
        GameObject glassVariant = glassVariants[Random.Range(0, glassVariants.Length)];
        glassVariant.transform.position = transform.position;
        // glassVariant.transform.position = new Vector3(transform.position.x, 0.8f, transform.position.z);
        // y, z axes are inverted? Only for the rubber duck assets
        Debug.Log("Spawning glass at position: " + transform.position);

        glassVariant.transform.Translate(new Vector3(Random.Range(-1.0f, 1.0f), glassVariant.transform.position.y + 0.8f, Random.Range(-1.0f, 1.0f)));

        Debug.Log("Spawning glass at glassVariant.position: " + glassVariant.transform.position);
        // glassVariant.transform.Translate(Random.Range(-1.0f, 1.0f), 0.0f, Random.Range(-1.0f, 1.0f));
        // Debug.Log("Spawning glass at rotation: " + glassVariant.transform.localRotation);
        glassVariant.transform.localRotation = Quaternion.AngleAxis(Random.Range(-35, 35), Vector3.forward);

        GameObject newObject = Instantiate(glassVariant, glassVariant.transform.position, glassVariant.transform.rotation);
        newObject.SetActive(true);
        Debug.Log("newObject: " + newObject.name);

    }
}

DestroyOnCollideWithTag

In Assets/Scripts/DestroyOnCollideWithTag.cs,

//using System.Collections;
//using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;

public class DestroyOnCollideWithTag : MonoBehaviour
{
    [SerializeField] private string ballTag;
    [SerializeField] private UnityEvent onDestroy;

    private void OnCollisionEnter(Collision collision)
    {
        if (collision.collider.CompareTag(ballTag))
        {
            onDestroy.Invoke();
            Destroy(gameObject);
        }
    }
}

NPCBehavior

In Assets/Scripts/NPCBehavior.cs,

// using Unity.XR.CoreUtils;
using UnityEngine;

public class NPCBehavior : MonoBehaviour
{
    private Animator npcAnimator;
    private GameObject pondTelepotationArea;
    private GameObject plane;
    private bool isPondActivated = true;

    void Start()
    {
        // ground = GameObject.Find("Ground");
        pondTelepotationArea = GameObject.Find("MovementZones").gameObject;
        plane = GameObject.Find("GravelBakePlane_-0.05").gameObject;
        npcAnimator = GetComponent<Animator>();
    }

    public void ActivateNPC()
    {
        // Debug.Log("NPC Activated");
        npcAnimator.SetBool("IsActivated", true);

        isPondActivated = !isPondActivated;
        if (isPondActivated)
        {
            Debug.Log("isPondActivated: " + isPondActivated);
            // Activate the water and deactivate the rocks
            plane.transform.GetChild(0).gameObject.SetActive(false);
            plane.transform.GetChild(1).gameObject.SetActive(false);
            pondTelepotationArea.transform.GetChild(2).gameObject.SetActive(false);
            pondTelepotationArea.transform.GetChild(2).gameObject.transform.GetChild(0).gameObject.GetComponent<MeshRenderer>().enabled = false;
        }
        else
        {
            Debug.Log("isPondActivated: " + isPondActivated);
            // Deactivate the water and activate the rocks
            plane.transform.GetChild(0).gameObject.SetActive(true);
            plane.transform.GetChild(1).gameObject.SetActive(true);
            pondTelepotationArea.transform.GetChild(2).gameObject.SetActive(true);
            pondTelepotationArea.transform.GetChild(2).gameObject.transform.GetChild(0).gameObject.GetComponent<MeshRenderer>().enabled = false;
        }
    }

    public void DeActivateNPC()
    {
        // Debug.Log("NPC Deactivated");
        npcAnimator.SetBool("IsActivated", false);
    }
}

External Resources