Clone een programmeerblok uit een socket.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.XR.Interaction.Toolkit;
 
public class CloneFromSocket : MonoBehaviour
{
    [SerializeField]
    private GameObject clonePrefab;
 
    private XRGrabInteractable grabbable;
    private GameObject parentTarget;
    [SerializeField]
    private string parentTag;
 
    [SerializeField]
    private List<GameObject> socketList = new List<GameObject>();
    private GameObject parentExists;
    private GameObject nestedExists;
 
    private AudioSource audioSource;
 
 
    void Start()
    {
        audioSource = GameObject.FindGameObjectWithTag("Player").GetComponent<AudioSource>();
 
        grabbable = GetComponent<XRGrabInteractable>();
        grabbable.selectExited.AddListener(CloneInteractable);
        grabbable.selectEntered.AddListener(OnSocketEntered);
        parentTarget = GameObject.FindGameObjectWithTag(parentTag);
 
        //foreach item in socketList  disable the socket XR socket interactor component)
        foreach (GameObject socket in socketList)
        {
            XRSocketInteractor socketInteractor = socket.GetComponent<XRSocketInteractor>();
            if (socketInteractor != null)
            {
                socketInteractor.enabled = false;
            }
        }
 
    }
 
    private void CloneInteractable(SelectExitEventArgs args)
    {
        XRSocketInteractor socketInteractor = args.interactorObject as XRSocketInteractor;
 
        audioSource.Play();
 
        if (socketInteractor != null)
        {
            GameObject gameObjectClone = Instantiate(clonePrefab, socketInteractor.transform.position, socketInteractor.transform.rotation);
 
            IXRSelectInteractable selectInteractable = gameObjectClone.GetComponent<IXRSelectInteractable>();
        }
 
        StartCoroutine(enableSockets());
 
        grabbable.selectExited.RemoveListener(CloneInteractable);
    }
 
    private IEnumerator enableSockets()
    {
        yield return new WaitForSeconds(1f);
 
        foreach (GameObject socket in socketList)
        {
            XRSocketInteractor socketInteractor = socket.GetComponent<XRSocketInteractor>();
            if (socketInteractor != null)
            {
                socketInteractor.enabled = true;
            }
        }
    }
 
    private void OnSocketEntered(SelectEnterEventArgs args)
    {
        XRSocketInteractor socketInteractor = args.interactorObject as XRSocketInteractor;
 
        if (socketInteractor != null)
        {
            string socketTag = socketInteractor.gameObject.tag;
 
            if (socketTag == "Code Block")
            {
                audioSource.Play();
 
                //see if a gameobject with the name of the socketparenttag exists in the parentTarget
                foreach (Transform child in parentTarget.transform)
                {
 
                    if (child.name == socketInteractor.transform.parent.tag && child.name != "Untagged")
                    {
                        //if it does, set the parent of the grabbable to the parentTarget
                        parentExists = child.gameObject;
                    }
                    else if (child.name == "Nested")
                    {
                        nestedExists = child.gameObject;
                    }
                }
 
                // check if the grabbable tag is the same as the socket parent tag
                if (grabbable.gameObject.tag == socketInteractor.transform.parent.tag)
                {
                    grabbable.gameObject.tag = "Nested";
                    grabbable.transform.SetParent(parentTarget.transform, true);
 
                    if(nestedExists == null)
                    {
                        GameObject emptyObject = new GameObject("Nested");
                        emptyObject.transform.SetParent(parentTarget.transform, true);
                    }
                    else
                    {
                        grabbable.transform.SetParent(nestedExists.transform, true);
                    }
                }
                else
                {
                    if (parentExists != null)
                    {
                        grabbable.transform.SetParent(parentExists.transform, true);
                    }
                    else if (socketInteractor.transform.parent.tag == "Untagged")
                    {
                        grabbable.transform.SetParent(parentTarget.transform, true);
                    }
                    else
                    {
                        string socketParentTag = socketInteractor.transform.parent.tag;
 
                        GameObject emptyObject = new GameObject(socketParentTag);
                        grabbable.transform.SetParent(emptyObject.transform, true);
                        emptyObject.transform.SetParent(parentTarget.transform, true);
                    }
                }
 
                int socketIndex = socketInteractor.transform.GetSiblingIndex();
                grabbable.transform.SetSiblingIndex(socketIndex);
            }
        }
    }
}