Noticias

¡RECUERDA QUE SI ERES UN NUEVO USUARIO, DEBES PRESENTARTE PARA PODER PUBLICAR MENSAJES! | TENEMOS CANAL OFICIAL DE TELEGRAM: t.me/unity3dspain

modificar componentes de otros objetos

Iniciado por sam, Febrero 23, 2017, 12:43:48 AM

Tema anterior - Siguiente tema
Febrero 23, 2017, 12:43:48 AM Ultima modificación: Febrero 23, 2017, 05:04:32 PM por pioj
Hola! estoy trasteando tratando de mover un objeto desde un script de otro objeto, pero este no se mueve ni cambia de posición no tampoco tengo error en el código, he llamado al objeto que quiero mover desde una variable publica y lo de anexado, pero nada. Por esto me surgen varias dudas con Unity
 
- ¿Cómo sería la forma de modificar un componente de un objeto desde otro?
 
- Otra pregunta que me hago, ¿podría crear un script desde dónde manejar todos los objetos y eventos del juego? no digo que sea la manera mas correcta, pero se podría?
 
-Cómo puedo crear una variable Global que usar en todos los Scripts con sólo ponerla? por ejm. si La variable global fuera Pause y fuera igual a True pues que en todos los scritps pueda poner directamente, if ( pause == 1) { ... }
 
esas cosas no las encuentro claras en ningún lado, si alguien pudiera echarme una mano se lo agradecería mucho!!! 
 
Saludos y gracias de antemano!

Hola @sam mira no soy muy experto en lo que respecta programación : p  pero voy a tratar de ayudarte...
 
-Para lo primero es fácil, una forma, por ejemplo es crear una variable que almacene al gameObject al que le queres modificar algún componente, y luego en esa script llamas a esa variable(supongamos Player) y con GetComponent<>() seleccionas el componente y lo modificas.
 
Ej(quiero mover a un cubo desde una script que tiene mi jugador): 
 

public GameObject cubo;  
public float velo = 5f;
void Update () {

  if(Input.GetKey(KeyCode.W)){
     cubo.GetComponent<Transform>().Translate(Vector3.forward*Time.deltaTime*velo);
  }
 
}

 
y con el getcomponent podes modificar los valores de los componentes de(en este ejemplo) el cubo.
 
-De poder se puede y se suele hacer, lo que conozco como "GameManager", ahora para lo que te referís no se si sea conveniente, los manager(según mi entender, puedo equivocarme) te sirve para almacenar valores que quieres "mantener" durante el transcurso del juego(puntaje por ej) y que no se pierda al cambiar entre escenas(usando DontDestroyOnLoad) y para cosas como el audio creo que también.
 
-Y para lo de una variable global se me ocurren dos formas:
 
La primera y creo que para lo que la necesitas es la mejor, volviendo la variable stática:
 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class blabla : MonoBehaviour {
public static bool Pause;
///...

 
y en las scripts que la necesites llamala así:    blabla.Pause = true/false;
 
Y la segunda forma es la de crear una variable que almacene la script en la que se encuentra la variable que queres que sea "global":
 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class NewBehaviourScript : MonoBehaviour {

public NombreDeLaScipt myScript;
void Update() {
myScript.variableGlobal = ......
}
 
}

 
 
 
Espero poder haberte ayudado : )

Tenéis una guía de cómo hacer este tipo de cosas en nuestro subforo de Primeros Pasos

 
 

Cita de: sam date=1487807028- ¿Cómo sería la forma de modificar un componente de un objeto desde otro?
   


Puedes hacerlo tal como te ha indicado @Biarox1166 utilizando GetComponent aunque no ha acertado mucho en el ejemplo ... Con todos los componentes que existen por defecto en Unity mas los que tu mismo puedes crearte, ha ido a escoger el unico que no necesita utilizar GetComponent xDDD
 
Para modificar el Transform de un GameObject basta con acceder al miembro transform como si se tratara de una variable publica cualquiera :
 

public GameObject cubo;
private void Update () {
if (Input.GetKey (KeyCode.W))
   cubo.transform.Translate (Vector3.forward * Time.deltaTime);
}

 
Pero para cualquier otro componente que no sea el Transform si que deberas hacerlo utilizando GetComponent.
 
 
 
Cita de: sam date=1487807028- Otra pregunta que me hago, ¿podría crear un script desde dónde manejar todos los objetos y eventos del juego? no digo que sea la manera mas correcta, pero se podría?
   


Nooo !!! Seria como saltar desde una 10ª planta ... poder podrias pero nunca deberias hacerlo.
 
Si haces eso, el problema no es que sea la manera mas correcta o incorrecta de hacerlo porque en programacion casi siempre habra una manera mas correcta de hacer algo desde el punto de vista optimizacion y rendimiento ... el problema seria que te estarias cargando literalmente de un plumazo la programacion orientada a objetos (o componentes en este caso).
 
 
 
Cita de: sam date=1487807028-Cómo puedo crear una variable Global que usar en todos los Scripts con sólo ponerla? por ejm. si La variable global fuera Pause y fuera igual a True pues que en todos los scritps pueda poner directamente, if ( pause == 1) { ... }
   


Para mi el mejor metodo que existe, por lo menos a mi gusto y el que yo siempre utilizo, es mediante Singleton. Busca sobre eso y encontraras mucha informacion bien explicada con ejemplos incluidos (es algo muy facil de entender y poner en practica) ... pero para que te hagas una idea te dire que un singleton no es otra cosa que un script que te garantiza que solo habra un objeto de ese tipo.

Febrero 23, 2017, 09:21:03 AM #4 Ultima modificación: Febrero 23, 2017, 10:12:41 AM por sam
Hola, muchas gracias a todos!! la cosa es que ya habia puesto objeto.transform.translate pero no me lo mueve, asi que debo de tener algo mal, pero ahora sé que esa es la manera, y tambien las otras preguntas, uchas gracias a todos !!! Os lo agradezco mucho, voy a ponerme a ver que tal! saludosssss
 
 
 
Es curioso pero a pesar de que ya estaba usando la manera que me habéis puesto, este funcionaba en unos objetos hacia el objeto que quería mover y desde otros no. He tenido que hacerle un GameObject.find desde el start, la única diferencia es que unos son Prefebs (desde donde he tenido que hacer la llamada oject.find) y los otros no. 
 
¿A qué se puede deber esto? ¿por qué no funciona igual con todos el mismo método? no lo sé, pero si alguien lo sabe y me lo aclara me será de gran ayuda, Saludossss XD

Hola Sam, estaria bueno que subieras que hiciste (el codigo).
 
Cita de: sam date=1487838063Es curioso pero a pesar de que ya estaba usando la manera que me habéis puesto, este funcionaba en unos objetos hacia el objeto que quería mover y desde otros no
   


No te enredes con eso de uno "hacia" otro, si vos llamas "tranform", que como bien dicen arriba es implicito en un GameObject (no hay uno sin otro), debe acceder al componente Transform del objeto que tiene el script, sino tenes que tener alguna referencia del otro objeto, sea por variable publica o GameObject.Find, o lo que quieras.
 
 
 
Cita de: sam date=1487838063la única diferencia es que unos son Prefebs (desde donde he tenido que hacer la llamada oject.find) y los otros no.
   


Prefab o no sigue siendo un GameObject, si colocaste correctamente el Translate y no se mueve puede ser porque no referencias bien el objeto, debes tener null reference (en consola fijate), o porque se mueve a cero velocidad xD.
 
Saludos

Cita de: sam date=1487838063Es curioso pero a pesar de que ya estaba usando la manera que me habéis puesto, este funcionaba en unos objetos hacia el objeto que quería mover y desde otros no. He tenido que hacerle un GameObject.find desde el start, la única diferencia es que unos son Prefebs (desde donde he tenido que hacer la llamada oject.find) y los otros no. 
   
   
      ¿A qué se puede deber esto? ¿por qué no funciona igual con todos el mismo método? no lo sé, pero si alguien lo sabe y me lo aclara me será de gran ayuda, Saludossss XD
   


Las causas pueden ser multiples y es imposible decirte a que es debido el hecho de que en algunos casos funcione y en otros no ... eso solo puedes comprobarlo tu mismo, que eres quien tiene el proyecto delante, los demas solo podemos estar dandote posibles causas pero que en el fondo es dar palos de ciego porque quizas no tienen nada que ver con el problema (sin ver el proyecto es un ejercicio de imaginacion). Lo unico que podemos decirte, y que es 100% acertado, es que el problema no se encuentra en la funcion objeto.transform.Translate porque esa siempre te funcionara sin importar si se trata de un prefab o no.
 
Como te comentan es posible que el objeto hacia el que te quieres mover no este referenciado, la velocidad de movimiento sea cero o cualquier otra razon ... pero es como jugar a las adivinanzas sin pistas.
 
Un problema que suele aparecer a la hora de referenciar objetos prefab que creas por codigo es que Unity añade al nombre la cadena "(Clone)" ... por lo que al usar el Find para localizarlo por su nombre original no lo encontrara y siempre devolvera null. Son de aquellas cosas tontas que si no te fijas pueden traerte muchos quebraderos de cabeza, pero como decia tambien es posible que no tenga nada que ver con tu problema.

Febrero 23, 2017, 11:40:20 AM #7 Ultima modificación: Febrero 23, 2017, 06:11:22 PM por lightbug
Cita de: Arthure date=1487843823Un problema que suele aparecer a la hora de referenciar objetos prefab que creas por codigo es que Unity añade al nombre la cadena "(Clone)" ... por lo que al usar el Find para localizarlo por su nombre original no lo encontrara
   


Es cierto, una vez tuve una serie de problemas con eso mismo, buscaba "Obj", cuando tenia varios "Obj_Clone". A partir de ese moment use el Find para objetos unicos como el Player o cosas asi. La otra forma era cambiar el nombre por codigo despues de instanciarlo pero no me convencia.

Pues muchísimas gracias por los consejos!! me son todos de mucha ayuda!! usando el Find me está yendo bien! 
 
Gracias de nuevo y saludos!!!

Etiquetas: