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);
}
}
}
}