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