Beispiel #1
0
    private void Awake()
    {
        //MENSAGEM ERRO MARKER SEM COMPONENTE NewTrackableEventHandler
        bool AnyMarkerWithoutNewTrackableEventHandlerComponent = false;

        foreach (GameObject marker in Markers)
        {
            if (marker.GetComponent <NewTrackableEventHandler>() == null)
            {
                Debug.LogError("AR Educational Framework Message: The ImageTarget: " + marker.name + " doesn't have NewTrackableEventHandler component. you need to substitute DefaultTrackableEventHandler component for it.");
                AnyMarkerWithoutNewTrackableEventHandlerComponent = true;
            }
        }
        if (AnyMarkerWithoutNewTrackableEventHandlerComponent)
        {
            this.enabled = false; //desativa o componente atual, porém ainda para este frame terminaria de executar o codigo de embaixo, e portanto usa-se return.
            return;               //nao executar o codigo de embaixo para este frame, em conjunto com a linha anterior, apartir de aqui, é desativado o script atual e nao se executa o codigo de embaixo nem para terminar este frame.
        }
        //MENSAGEM ERRO: OBJECT IS NOT CHILD OF MARKER
        bool anyObjectIsNotChildOfMarker = false;

        for (int i = 0; i < Objects.Length; i++)
        {
            if (!Objects[i].transform.IsChildOf(Markers[i].transform))
            {
                Debug.LogError("AR Educational Framework Message: The ImageTarget: " + Markers[i].name + " doesn't have child " + Objects[i].name + " in the Unity hierarchy. you need to make the object: " + Objects[i].name + ", child of marker: " + Markers[i].name + ".");
                anyObjectIsNotChildOfMarker = true;
            }
        }
        if (anyObjectIsNotChildOfMarker)
        {
            this.enabled = false; //desativa o componente atual, porém ainda para este frame terminaria de executar o codigo de embaixo, e portanto usa-se return.
            return;               //nao executar o codigo de embaixo para este frame, em conjunto com a linha anterior, apartir de aqui, é desativado o script atual e nao se executa o codigo de embaixo nem para terminar este frame.
        }

        //CRIAR O OBJETO EMPTY PARA cada objeto de Objects E ACRESCENTAR NA LISTA GERAL DE OBJETOS EMPTY INTERMEDIARIOS USADOS PARA ESCALAR OBJETOS PROPORCIONALMENTE
        if (TypeOfOperation == TypeOfOperations.scale) //sempre que que vai se escalar com o botao
        {
            for (int i = 0; i < Objects.Length; i++)   //percorre os objetos associados ao botao
            {
                List <GameObject> originalObjects = new List <GameObject>();
                foreach (GeralObjectsContainer geralObjectContainer in GeralObjectsContainerList)//obtem lista atual dos objetos gerais (que vao ser escalados por botoes ou por marcadores de controle)
                {
                    originalObjects.Add(geralObjectContainer.OriginalObject);
                }
                if (!originalObjects.Contains(Objects[i]))                                //ainda nao foi acrescentado o objeto atual na lista, entao pode se acrescentar
                {
                    GameObject objEmty = new GameObject(Objects[i].name + "Emty");        //cria um emty novo com o mesmo nome do que o objeto atual + Empy
                    objEmty.transform.localPosition = Markers[i].transform.localPosition; //posiciona ele no mesmo lugar do marcador
                    objEmty.transform.parent        = Markers[i].transform;               //fazer objeto emty filho do marcador,necessario para nao tirar o objeto do seu contexto inicial quando for colocado como filho do emty
                    objEmty.transform.localScale    = Vector3.one;                        //IMPORTANTE RESET O VALOR A 1,1,1 POIS SE O MARCADOR NAO TEM TANAHO 1,1,1, O OBJ EMTY QUANDO SE FAZ FILHO DO MARCADOR FICARIA COM OUTRO TAMANHO E DARIA ERRADO AS OPERACOES MATEMATICAS DO ALGORITMO

                    //CODIGO RELACIONADO COM: SUPORTAR IMAGENS EM CANVAS PARA SEREM ESCALADAS
                    Transform myParent = Objects[i].transform.parent;
                    if (!(UnityEngine.Object.ReferenceEquals(myParent, Markers[i])) && (myParent.GetComponent <Canvas>() != null)) //se pai do objeto atual nao for marcador e for um canvas
                    {
                        objEmty.transform.SetParent(myParent.transform);                                                           //fazer o objEmty filho do canvas
                        objEmty.transform.localScale = Vector3.one;                                                                //IMPORTANTE RESET O VALOR A 1,1,1 POIS SE O CANVAS NAO TEM TANAHO 1,1,1, O OBJ EMTY QUANDO SE FAZ FILHO DO CANVAS FICARIA COM OUTRO TAMANHO E DARIA ERRADO AS OPERACOES MATEMATICAS DO ALGORITMO
                    }
                    //---

                    Objects[i].transform.SetParent(objEmty.transform);                                   //fazer objeto atual filho do objeto empty
                    GeralObjectsContainer geralObjectN = new GeralObjectsContainer(Objects[i], objEmty); //acrescenta na lista geral o objeto atual e seu empty criado
                    GeralObjectsContainerList.Add(geralObjectN);
                }
            }
        }
    }
Beispiel #2
0
    private void Awake()
    {
        //CODIGO RELACIONADO COM: INTERACAO MARCADORES
        marker1NewTrackableEventHandlerComponent = Marker1.GetComponent <NewTrackableEventHandler>();
        marker2NewTrackableEventHandlerComponent = Marker2.GetComponent <NewTrackableEventHandler>();
        //MENSAGEM ERRO MARKER SEM COMPONENTE NewTrackableEventHandler
        if (marker1NewTrackableEventHandlerComponent == null || marker2NewTrackableEventHandlerComponent == null)
        {
            if (marker1NewTrackableEventHandlerComponent == null)
            {
                Debug.LogError("AR Educational Framework Message: The ImageTarget: " + Marker1.name + " doesn't have NewTrackableEventHandler component. you need to substitute DefaultTrackableEventHandler component for it.");
            }
            if (marker2NewTrackableEventHandlerComponent == null)
            {
                Debug.LogError("AR Educational Framework Message: The ImageTarget: " + Marker2.name + " doesn't have NewTrackableEventHandler component. you need to substitute DefaultTrackableEventHandler component for it.");
            }
            this.enabled = false; //desativa o componente atual, porém ainda para este frame terminaria de executar o codigo de embaixo, e portanto usa-se return.
            return;               //nao executar o codigo de embaixo para este frame, em conjunto com a linha anterior, apartir de aqui, é desativado o script atual e nao se executa o codigo de embaixo nem para terminar este frame.
        }
        //MENSAGEM ERRO OBJECT IS NOT CHILD OF MARKER
        if (!MyObject.transform.IsChildOf(Marker1.transform))
        {
            Debug.LogError("AR Educational Framework Message: The ImageTarget: " + Marker1.name + " doesn't have child " + MyObject.name + " in the Unity hierarchy. you need to make the object: " + MyObject.name + ", child of marker: " + Marker1.name + ".");
            this.enabled = false; //desativa o componente atual, porém ainda para este frame terminaria de executar o codigo de embaixo, e portanto usa-se return.
            return;               //nao executar o codigo de embaixo para este frame, em conjunto com a linha anterior, apartir de aqui, é desativado o script atual e nao se executa o codigo de embaixo nem para terminar este frame.
        }
        //MENSAGEM DE ERRO SUB-OBJETO NAO É FILHO DO OBJETO
        if (TypeOfChange == TypeOfChanges.ChangeObjectProperties)
        {
            if (ChangeMaterials)
            {
                bool anySubObjectWithMaterialIsNotChildOfMyObject = false;
                for (int i = 0; i < SubObjectsWithMaterial.Length; i++)
                {
                    GameObject subObjectWithMaterialA = SubObjectsWithMaterial[i].SubObjectWithMaterial;//obtemos o sub-objeto com material atual

                    if (!subObjectWithMaterialA.transform.IsChildOf(MyObject.transform))
                    {
                        Debug.LogError("AR Educational Framework Message: The object: " + subObjectWithMaterialA.name + " is not valid. you need to add a child of the object " + MyObject.name + " with a Renderer component, or the object " + MyObject.name + " itself if it is a primitive object from Unity with its Renderer component directly on it (e.g Cube, Sphere etc).");
                        anySubObjectWithMaterialIsNotChildOfMyObject = true;
                    }
                }
                if (anySubObjectWithMaterialIsNotChildOfMyObject)
                {
                    this.enabled = false; // desativa o componente atual, porém ainda para este frame terminaria de executar o codigo de embaixo, e portanto usa-se return.
                    return;               // nao executar o codigo de embaixo para este frame, em conjunto com a linha anterior, apartir de aqui, é desativado o script atual e nao se executa o codigo de embaixo nem para terminar este frame.
                }
            }
        }

        //CODIGO RELACIONADO COM: TROCAR OBJETO POR OUTRO
        //ACRESCENTA NA LISTA renderers do componente NewTrackableEventHandler do marker1, os renderer dos objetos myObject e o novo objeto newObject a trocar. isto pois o marker1 vai pular a ativacao desses renderer quando for vissivel na camera(nao ira ativar esses objetos quando for encontrado), ao inves disso, serao ativados diretamente por este codigo. NOTA: quando o marcador nao encontrado, aí sim marker1 vai desativar normalmente esses renderer.
        //---
        if (TypeOfChange == TypeOfChanges.ChangeObject && this.enabled)
        {
            myObjectRenderers  = MyObject.GetComponentsInChildren <Renderer>();
            newObjectRenderers = NewObject.GetComponentsInChildren <Renderer>();
            if (myObjectRenderers.Length > 0 && newObjectRenderers.Length > 0)//SÓ se o myObject e newObject tem componentes Renderer ira funcionar a caracteristica de trocar o objeto pelo outro
            {
                foreach (Renderer renderer in myObjectRenderers)
                {
                    if (!marker1NewTrackableEventHandlerComponent.Renderers.Contains(renderer))
                    {
                        marker1NewTrackableEventHandlerComponent.Renderers.Add(renderer);
                    }
                }
                foreach (Renderer renderer in newObjectRenderers)
                {
                    if (!marker1NewTrackableEventHandlerComponent.Renderers.Contains(renderer))
                    {
                        marker1NewTrackableEventHandlerComponent.Renderers.Add(renderer);
                    }
                }

                //MENSAGEM ERRO OBJECT IS NOT CHILD OF MARKER
                if (!NewObject.transform.IsChildOf(Marker1.transform))
                {
                    Debug.LogError("AR Educational Framework Message: The ImageTarget: " + Marker1.name + " doesn't have child " + NewObject.name + " in the Unity hierarchy. you need to make the object: " + NewObject.name + ", child of marker: " + Marker1.name + ".");
                    this.enabled = false; //desativa o componente atual, porém ainda para este frame terminaria de executar o codigo de embaixo, e portanto usa-se return.
                    return;               //nao executar o codigo de embaixo para este frame, em conjunto com a linha anterior, apartir de aqui, é desativado o script atual e nao se executa o codigo de embaixo nem para terminar este frame.
                }
            }
            else
            {
                if (myObjectRenderers.Length == 0)
                {
                    Debug.LogError("AR Educational Framework Message: The GameObject: " + MyObject.name + " doesn't have any Renderer component.");
                }
                if (newObjectRenderers.Length == 0)
                {
                    Debug.LogError("AR Educational Framework Message: The GameObject: " + NewObject.name + " doesn't have any Renderer component.");
                }

                this.enabled = false; //desativa o componente atual, porém ainda para este frame terminaria de executar o codigo de embaixo, e portanto usa-se return.
                return;               //nao executar o codigo de embaixo para este frame, em conjunto com a linha anterior, apartir de aqui, é desativado o script atual e nao se executa o codigo de embaixo nem para terminar este frame.
            }
        }
        //---

        if (typeOfChange == TypeOfChanges.ChangeObjectProperties)
        {
            if (changeScale)
            {
                //CODIGO RELACIONADO COM: BLOQUEAR BOTOES QUANDO MARCADORES JUNTOS MUDANDO ESCALA
                objectsWithButtonOperations = GameObject.FindObjectsOfType <ButtonOperations>(); //obtem todos os componentes de tipo ButtonOperations, ou seja deve obter (implicitamente) os botoes que podem mudar escala
                foreach (ButtonOperations obj in objectsWithButtonOperations)                    //percorre o vector e coloca numa lista só os componentes que sao usados para escalar(nao pra rotacionar)
                {
                    if (obj.TypeOfOperation == ButtonOperations.TypeOfOperations.scale)          //se está sendo usado para escalar
                    {
                        objectsWithButtonOperationsF.Add(obj);
                    }
                }
                //----

                //CRIAR O OBJETO EMPTY PARA O objeto myObject (NO CASO DE NAO TER) E ACRESCENTAR ELE NA LISTA GERAL DE OBJETOS EMPTY INTERMEDIARIOS USADOS PARA ESCALAR OBJETOS PROPORCIONALMENTE
                //NOTA: PARA ESTE TRECHO DE CODIGO, FOI NECESSARIO QUE O MARKER1 FOSSE CONSIDERADO COMO MARCADOR VINCULADO AO OBJETO E MARKER2 COMO MARCADOR DE CONTROLE
                List <GameObject> originalObjects = new List <GameObject>();
                foreach (GeralObjectsContainer geralObjectContainer in ButtonOperations.GeralObjectsContainerList)//PERCORRE E OBTEM LISTA GERAL DE OBJETOS USADOS PARA ESCALAR PROPORCIONALMENTE
                {
                    originalObjects.Add(geralObjectContainer.OriginalObject);
                }
                if (!originalObjects.Contains(MyObject))                               //nao foi acrescentado o myObject atual na lista geral (ou seja nao sera mudada sua transform atraves de botoes), entao neste codigo deve se acrescentar nessa lista geral para mudar escala com marcadores
                {
                    GameObject objEmty = new GameObject(MyObject.name + "Emty");       //cria um objeto emty novo com o mesmo nome do que o myObject atual
                    objEmty.transform.localPosition = Marker1.transform.localPosition; //posiciona ele no mesmo lugar do marcador atual
                    objEmty.transform.parent        = Marker1.transform;               //fazer myObject emty filho do marcador, necessario para nao tirar o myObject do seu contexto inicial quando for colocado como filho do emty
                    objEmty.transform.localScale    = Vector3.one;                     //IMPORTANTE RESET O VALOR A 1,1,1 POIS SE O MARCADOR NAO TEM TANAHO 1,1,1, O OBJ EMTY QUANDO SE FAZ FILHO DO MARCADOR FICARIA COM OUTRO TAMANHO E DARIA ERRADO AS OPERACOES MATEMATICAS DO ALGORITMO

                    //CODIGO RELACIONADO COM: SUPORTAR IMAGENS EM CANVAS PARA SEREM ESCALADAS
                    Transform myParent = MyObject.transform.parent;
                    if (!(UnityEngine.Object.ReferenceEquals(myParent, Marker1)) && (myParent.GetComponent <Canvas>() != null)) //se pai do objeto myObject nao for marcador e for um canvas
                    {
                        objEmty.transform.SetParent(myParent.transform);                                                        //fazer o objEmty filho do canvas
                        objEmty.transform.localScale = Vector3.one;                                                             //IMPORTANTE RESET O VALOR A 1,1,1 POIS SE O CANVAS NAO TEM TANAHO 1,1,1, O OBJ EMTY QUANDO SE FAZ FILHO DO CANVAS FICARIA COM OUTRO TAMANHO E DARIA ERRADO AS OPERACOES MATEMATICAS DO ALGORITMO
                    }
                    //---
                    MyObject.transform.SetParent(objEmty.transform);                                   //fazer myObject filho do objeto empty

                    GeralObjectsContainer geralObjectN = new GeralObjectsContainer(MyObject, objEmty); //acrescenta na lista geral myObject e seu empty criado
                    ButtonOperations.GeralObjectsContainerList.Add(geralObjectN);
                }
            }
        }

        //CODIGO RELACIONADO COM: BLOQUEAR OUTROS CHANGEELEMENT QUANDO UN DELES jÁ ESTA TROCANDO O OBJETO
        if (myObjectRenderers.Length > 0 && newObjectRenderers.Length > 0)//SÓ se o myObject e newObject tem componentes Renderer ira funcionar a caracteristica de trocar o objeto pelo outro
        {
            changeElementComponents = GameObject.FindObjectsOfType <ChangeElement>();
            foreach (ChangeElement changeElement in changeElementComponents)
            {
                if (!(UnityEngine.Object.ReferenceEquals(changeElement, this)) && changeElement.TypeOfChange == ChangeElement.TypeOfChanges.ChangeObject && UnityEngine.Object.ReferenceEquals(changeElement.MyObject, MyObject)) //se o componente changeElement nao for o atual, e estiver mudando o mesmo objeto que este
                {
                    othersChangeElementComponentsChangingMyObject.Add(changeElement);                                                                                                                                             //acrescenta na lista othersChangeElementComponentsChangingMyObject os changeElement que podem mudar o objeto, exetuando o atual changeElement
                }
            }
        }
    }