コード例 #1
0
 private void Awake()
 {
     myObjectRenderers = MyObject.GetComponentsInChildren <Renderer>();
     //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.
     }
     //NOVO 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 the 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.
     }
 }
コード例 #2
0
    public void AddAvatarPedestals()
    {
        GameObject         MyObject, MyParentObject = null;
        VRC_AvatarPedestal MyAvatarScript;
        Vector3            V = new Vector3();
        int i, l, m, n, k, CurrentRow = 0, CurrentReset = 0, CurrentReset2 = 0;

        MeshRenderer[] MyMeshRenderers;
        Material[]     MyMaterials;

        if (SelectedObject == null)
        {
            CustomMessage = "You've To Select Avatar Pedestal";
            return;
        }

        MyAvatarScript = SelectedObject.GetComponent <VRC_AvatarPedestal>();

        if (MyAvatarScript == null)
        {
            CustomMessage = "VRC_AvatarPedestal Script Not Found. Select Correct Avatar Pedestal";
            return;
        }

        if (UsedName == "" || UsedTag == "")
        {
            CustomMessage = "You've To Set Used Name And Used Tag";
            return;
        }

        CustomMessage = "";
        PendingAvatarPedestals.Clear();

        for (i = 0; i < ListOfAvatarIDs.Count; i++)
        {
            if (i > 0 && i % LengthOfRow == 0)
            {
                CurrentRow++;

                if (CurrentRow == MaxRows)
                {
                    CurrentRow = 0;
                    CurrentReset++;

                    if (CurrentReset == MaxResets)
                    {
                        CurrentReset = 0;
                        CurrentReset2++;
                    }
                }
            }

            V             = StartPosition + (i % LengthOfRow) * OffsetByIndex + OffsetByRow * CurrentRow + OffsetByReset * CurrentReset + OffsetByReset2 * CurrentReset2;
            MyObject      = Instantiate(SelectedObject, V, SelectedObject.transform.rotation);
            MyObject.name = Repl(UsedName, "%Index%", i.ToString());
            MyObject.tag  = UsedTag;
            MyObject.SetActive(!bDefaultHide);

            if (bKeepParentObject)
            {
                if (SelectedObject.transform.parent != null)
                {
                    MyParentObject = SelectedObject.transform.parent.gameObject;
                }
            }
            else
            {
                MyParentObject = ParentObject;
            }

            if (MyParentObject != null && MyParentObject.transform != null)
            {
                MyObject.transform.SetParent(MyParentObject.transform, bWorldPositionStays);
            }

            if (CustomMeterialsByID.List.Count > 0)
            {
                for (m = 0; m < CustomMeterialsByID.List.Count; m++)
                {
                    for (n = 0; n < CustomMeterialsByID.List[m].ListOfIDs.Count; n++)
                    {
                        if (CustomMeterialsByID.List[m].ListOfIDs[n] == ListOfAvatarIDs[i])
                        {
                            MyMeshRenderers = MyObject.GetComponentsInChildren <MeshRenderer>(true);

                            for (k = 0; k < MyMeshRenderers.Length; k++)
                            {
                                MyMaterials = MyMeshRenderers[k].materials;

                                for (l = 0; l < MyMaterials.Length; l++)
                                {
                                    MyMaterials[l] = CustomMeterialsByID.List[m].M;
                                }

                                MyMeshRenderers[k].materials = MyMaterials;
                            }
                        }
                    }
                }
            }

            MyAvatarScript             = MyObject.GetComponent <VRC_AvatarPedestal>();
            MyAvatarScript.blueprintId = ListOfAvatarIDs[i];

            if (bActivateByTrigger)
            {
                PendingAvatarPedestals.Add(MyObject);
            }
        }

        if (bActivateByTrigger)
        {
            AddAvatarPedestalsToTrigger();
        }
    }
コード例 #3
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
                }
            }
        }
    }