void Start()
    {
        // Inicializa el BundleLoader, IdInfoCollection y el DropDownId para
        // poder subscribirse a los eventos onAssetBundleFinishLoad, onDropdownIdSelected
        // y onIdsLoadingDone
        _bundleManager.InitBundleLoader();
        _bundleManager.InitDropdownId();
        _bundleManager.InitIdInfoCollection();

        _bundleManager.onAssetBundleFinishLoad += OnAssetBundleFinishLoad;
        _bundleManager.onDropdownIdSelected    += OnDropdownIdSelected;
        _bundleManager.onIdsLoadingDone        += OnIdsLoadingDoneHandler;

        // Borra las opciones que contenia el dropdown para llenarlo con
        // los ids disponibles en firebase. Cuando termina la descarga
        // de todos los ids ejecuta la funcion onIdLoadingDoneHandler.
        _bundleManager.ClearDropdown();
        _bundleManager.DownloadAndDeserializeIdInfoCollection();


        // Si la opcion loadOnStart esta activada significa que se desea
        // mostrar un assetbundle desde el inicio. Por esto se agrega
        // un assetbundle con id="Test" que se encuentra en pathForLoadOnStart.
        // El path puede ser local o una link de internet directo al archivo.
        if (loadOnStart && pathForLoadOnStart != "")
        {
            _bundleManager.AsyncAddAssetBundle("Test", pathForLoadOnStart);
        }

        Application.targetFrameRate = 10;
    }
    // Esta funcion se ejecuta cuando se presiona cualquier carta. Para
    // distinguir la carta se utiliza el parametro cardIndex. Dentro de la
    // funcion se dispara la descarga del assetbundle correspondiente al
    // id de la carta, y se activa la capacidad de poner objetos en la escena AR.
    public void OnCardClick(Button cardBtn, int cardIndex)
    {
        string id = cards[cardIndex].cardGameObject.transform.name;

        Debug.Log("Se presiono la carta con ID: " + id);
        _bundleManager.AsyncAddAssetBundle(id);
        _bundleManager.SetCanSpawnModel(true);
        _ux_Helper.CollectionView.SetActive(false);
        _ux_Helper.MainDock.SetActive(false);
        _ux_Helper.ActionDock.SetActive(true);
    }
Пример #3
0
    public void OnImageChanged(ARTrackedImagesChangedEventArgs args)
    {
        foreach (var trackedImage in args.updated)
        {
            // La imagen no esta visible para la camara
            if (trackedImage.trackingState != UnityEngine.XR.ARSubsystems.TrackingState.Tracking)
            {
                if (trackedImage.transform.childCount > 1 && trackedImage.transform.GetChild(childIndexModel).gameObject.activeSelf)
                {
                    debuglog.text += $"NO se ve la imagen con id: {trackedImage.referenceImage.name}\n";
                    trackedImage.transform.GetChild(childIndexMarkers).gameObject.SetActive(false);
                    trackedImage.transform.GetChild(childIndexModel).gameObject.SetActive(false);
                    FirstPass = true;
                }
            }

            // La imagen si esta visible para la camara
            else
            {
                if (!FirstPass)
                {
                    return;
                }

                // Usa el nombre (id) de la imagen para cargar el assetbundle
                // de firebase
                try
                {
                    debuglog.text += $"SI se detecto la imagen. Child Count: {trackedImage.transform.childCount}\n";


                    _bundleManager.AsyncAddAssetBundle(trackedImage.referenceImage.name);

                    // El modelo se enfoca por primera vez dentro del Script
                    // ModelManager cuando se termina de instanciar
                    trackedImage.GetComponent <PrefabBundle>().id = trackedImage.referenceImage.name;
                    StartCoroutine(_modelManager.DisplayAssetBundleInPrefabBundle(trackedImage.gameObject, trackedImage.referenceImage.name));

                    // Hace que los iconos de enfoque sean perpendiculares al piso
                    trackedImage.transform.GetChild(childIndexMarkers).eulerAngles = new Vector3(0, 0, 0);
                    FirstPass = false;

                    // Si la cantidad de hijos es mayor a 1 significa que el modelo ya fue invocado y
                    // materializado en la escena, por lo cual se debe de mostrar y enfocar.
                    if (trackedImage.transform.childCount > 1)
                    {
                        trackedImage.transform.GetChild(childIndexModel).gameObject.SetActive(true);

                        // Hace que el modelo sea perpendicular al piso
                        trackedImage.transform.GetChild(childIndexModel).eulerAngles = new Vector3(0, 0, 0);
                        _modelManager.FocusObject(trackedImage.gameObject);
                    }
                    debuglog.text += $"Se completa el asociamiento del prefabbundle al asset bundle\n";
                }
                catch (Exception ex)
                {
                    debuglog.text += $"Error en la asociacion al assetbundle: {ex.Message}\n";
                }
            }
        }
    }