forked from cgvr/DeltaVR
		
	
		
			
				
	
	
		
			95 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			95 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
using System;
 | 
						|
using System.Collections;
 | 
						|
using System.Collections.Generic;
 | 
						|
using Unity.XR.CoreUtils;
 | 
						|
using UnityEngine;
 | 
						|
using UnityEngine.Rendering;
 | 
						|
using UnityEngine.UI;
 | 
						|
using UnityEngine.XR.Interaction.Toolkit;
 | 
						|
 | 
						|
public class MenuTeleportButton : MonoBehaviour
 | 
						|
{
 | 
						|
    public Sprite NormalSprite;
 | 
						|
    public Sprite HoverSprite;
 | 
						|
    public String TargetName;
 | 
						|
    public XRBaseControllerInteractor LeftXRInteractor; // Reference to XR controller interactor (e.g., Ray Interactor)
 | 
						|
    public XRBaseControllerInteractor RightXRInteractor;
 | 
						|
    public XROrigin Player;
 | 
						|
    public TeleportationProvider teleportationProvider; // Reference to TeleportationProvider
 | 
						|
 | 
						|
    private Button button;
 | 
						|
    private TeleportLocation target; // Target teleport position
 | 
						|
 | 
						|
    void Start()
 | 
						|
    {
 | 
						|
        button = GetComponent<Button>();
 | 
						|
 | 
						|
        // Subscribe to button events
 | 
						|
        button.onClick.AddListener(TeleportPlayer);
 | 
						|
 | 
						|
        TeleportLocation[] locations = FindObjectsOfType<TeleportLocation>(); // Fetch all teleport locations in the scene.
 | 
						|
        foreach (TeleportLocation location in locations) // Find the target location.
 | 
						|
        {
 | 
						|
            if (location.Name.Equals(TargetName))
 | 
						|
            {
 | 
						|
                target = location;
 | 
						|
                break;
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        if (target == null)
 | 
						|
        {
 | 
						|
            Debug.LogError("Teleport target of " + TargetName + " not found.");
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    public void SetStateSelected()
 | 
						|
    {
 | 
						|
        if (button != null && HoverSprite != null)
 | 
						|
        {
 | 
						|
            button.targetGraphic.GetComponent<Image>().sprite = HoverSprite;
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    public void SetStateDefault()
 | 
						|
    {
 | 
						|
        // Refresh the button state.
 | 
						|
        button.interactable = false;
 | 
						|
        button.interactable = true;
 | 
						|
 | 
						|
        if (NormalSprite != null)
 | 
						|
        {
 | 
						|
            button.targetGraphic.GetComponent<Image>().sprite = NormalSprite;
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    private void TeleportPlayer()
 | 
						|
    {
 | 
						|
        if (target == null || Player == null || teleportationProvider == null)
 | 
						|
        {
 | 
						|
            Debug.LogWarning("Teleportation failed: Target, Player, or TeleportationProvider is missing.");
 | 
						|
            return;
 | 
						|
        }
 | 
						|
 | 
						|
        // Prepare teleport request
 | 
						|
        TeleportRequest request = new TeleportRequest
 | 
						|
        {
 | 
						|
            destinationPosition = target.transform.position,
 | 
						|
            destinationRotation = target.transform.rotation,
 | 
						|
            matchOrientation = MatchOrientation.TargetUpAndForward
 | 
						|
        };
 | 
						|
 | 
						|
        // Queue teleport request
 | 
						|
        bool success = teleportationProvider.QueueTeleportRequest(request);
 | 
						|
 | 
						|
        if (!success)
 | 
						|
        {
 | 
						|
            Debug.LogWarning("Teleport request failed to queue.");
 | 
						|
        }
 | 
						|
 | 
						|
        // Refresh the button state
 | 
						|
        button.interactable = false;
 | 
						|
        button.interactable = true;
 | 
						|
    }
 | 
						|
}
 |