Duda básica Unity

darkblade60

Buenas,

estoy investigando un poco con Unity pero no entiendo bien la interacción entre "objetos".

Tengo Sprite1 que he arrastrado a un PREFAB al que le he añadido un script.

Tengo Sprite2 que he arastrado a otro PREFAB al que he añadido otros script diferente.

Cada script se encarga de manejar cada sprite... pero claro, quiero saber la posición de uno dentro del script de otro... y no se como cojones hacerlo, no hay un main para gestionar los dos a la vez??

PD: El premio no esta en la respuesta, esta en que alguien me entienda.

rekyemm

No se si he entendido bien la pregunta pero de primera se me ocurre que puedes hacer publica y estática la posición del objeto 2, y acceder a ella desde el otro script.

Script2 : public static int posX; en el update la vas refrescando posX = transform.position.x;
Script1: update:int posXobjeto2 = script1.posX;

Edit:
Ahora que lo pienso, si el objeto2 es child del objeto1 puedes acceder a todas sus propiedades desde el script del primero.

Edit2:
Cada vez que releo la pregunta entiendo una cosa diferente, haciendo public GameObject de ambos objetos dentro de cada script y arrastrando el prefab desde el editor al campo que se te crea en el script, puedes acceder a los dos objetos sin problema. O directamente desde el script que quieras haces un

GameObject objeto = GameObject.Find("nombredelobjetoenlajerarquia");

y ya lo tienes ahí.

2 respuestas
darkblade60

#2


public class Sprite1 : MonoBehaviour { 


void Update ()  
{ 
     }

}

public class Sprite2 : MonoBehaviour { 



void Update ()  
{ 
     }

}

Cada uno en un prefab, pues acceder de uno a otro xD

Si hago:

GameObject objeto = GameObject.Find("nombredelobjetoenlajerarquia");

Que objeto tengo que buscar? Si hago un objeto en la otra clase (prefab) a que igualo ese objeto nuevo publico....

L

Realmente no se qué quieres hacer con esos scripts, no creo que te sirvan de mucho, pero si pones referencias cruzadas podras acceder al otro sprite... en la escena arrastras cada sprite a la referencia del inspector del otro y yasta.

public class Sprite1 : MonoBehaviour {
public Sprite2 otroSprite;
void Update ()

{
}
}

public class Sprite2 : MonoBehaviour {
public Sprite1 otroSprite;
void Update ()

{
}
}

EDIT: Los parametros publicos d las clases salen en el inspector del prefab, por lo que puedes arrastrar un objeto manualmente en la escena para obtener la referencia

1 respuesta
darkblade60

#4

Pero si yo cojo y pongo en Sprite2:

Public Sprite1 otroSprite;

y directamente otroSprite.transform.position.x (por ejemplo, no funciona)

Es que no entiendo la estructura del unity, no se puede hacer un main desde donde cuelga todo?

1 respuesta
Devilpower

#5 No es la idea de unity, lo ideal sería tener un script para cada prefab, y si quieres acceder a la posicion de otro prefab, 1 o lo declaras como variable y se la asignas desde el editor, o 2 buscas en la escena el prefab.

No se si me explico.

1 respuesta
L

A ver, esque te estas equivocando, la clase Sprite no tiene transform ni posición ni nada, solo es una referencia a una imagen con diversas propiedades como el pivote, etc..

Si estas usando UGUI y quieres poder mover sprites, usa la clase Image por ejemplo, que si que tiene transform, y a su vez tiene asignado un Sprite.

Lo conveniente seria tener un script (main) controlador con las referencias a todos los sprites(Image) d la escena, y en este script manejarlos todos, ya con prefabs que sean mas complejos, royo widgets, es conveniente que tengan su propio script que los maneje internamente y un controlador que acceda a dichos scripts.

EDIT: puedes cambiar los sprites con las referencias a las Image: image1.sprite

public class ControladorSprites : MonoBehaviour {
public Image[] allSprites;

1 respuesta
darkblade60

#2 Lo que has dicho, lo primero "me sirve" pero lo veo chapucero, además no podré modificar esa posición

darkblade60

#6 Seguramente si te expliques xdd

#7 Dices de eliminar los prefabs y mover las "imagenes" directamente desde un script que no este asociado a nada?

L

De todas formas, si quieres explica un poco lo que quieres hacer y te pongo un pequeño script rápido, asi no nos mareamos tanto

1 respuesta
L

Canvas
-- Manejador (script con referencias)
----- Imagen1
----- Imagen2
... etc

EL manejador seria un prefab (widget) con el que mover todos los sprites, es mejor que el manejador controle todo a que cada sprite deba saber el estado de los demas

L

Pero bueno, explica un poco que deseas hacer y luego te pongo una solución facil

darkblade60

#10 Si simplemente quería probar, porque lo único que he hecho como juego es un pang con processing (no se si te suena) que no tiene interfaz ninguna, cargaba imagenes y hacia mis clases y mis historias partiendo de un MAIN que se ejecutaba primero, pero aqui veo que funciona con prefabs donde cada imagen tiene asignado uno y no veo un main que lo controle todo.

tengo 1 objeto en 1 prefab con su script y quiero que desde otro prefab con su script pueda displayear la posicion y modificarla, ya esta xD

edit: donde cojones asignaría el main? a la camara? simplemento lo creo y se ejecuta?

1 respuesta
L

#13 Vale, entonces no te compliques la vida:

public class VerPosicion : MonoBehaviour
{
public GameObject objetoTarget;


    void Update()
    {
        Debug.LogError(objetoTarget.transform.position);
    }
}
1 respuesta
darkblade60

#14 ahi has creado un objeto null y has sacado la informacion de el wtf!?

2 respuestas
L

Piensa que en Unity todos los objetos en escena son GameObject que poseen transform, aparte son cualquier clase que le metas a ese objeto en el inspector, pero como solo quieres saber la posicion, con tener una referencia tipo GameObject te sirve, arrastras ahi el objeto del que quieras conocer la posición y punto, y por los prefabs no te lies, pero lo mejor es hacer un prefab con un script a modo de "API", es decir, si es un prefab que contiene un titulo, imagen y barra de progreso por ejemplo, creas un script con referencias a dichos objetos

L

#15 No he creado ningun objeto, es una referencia publica para que añadas el objeto que quieras desde la escena

EDITO: Si no metes ningun objeto como referencia si que sería un objeto null y petaria, lógico

L

#15 Sigue estos pasos, crea 2 objetos vacios en la escena, a uno le metes el script que te he puesto, y arrastras el otro objeto creado a la referencia "objetoTarget" del script

1 respuesta
darkblade60

#18 Ojala supiera.

1 respuesta
L

#19 Menu: GameObject -> Create Empty (dos veces, creas dos objetos)
Seleccionas objeto1 -> inspector -> add Component -> script VerPosicion (el que te he puesto)
Sin dejar de seleccionar el objeto1, veras que en el script VerPosicion hay una referencia "objetoTarget" que busca un GameObject, arrastra ahi el objeto2 (creado al principio)

1 respuesta
FernandoA

#1 Lo mejor que puedes hacer es ir a Unity Learn y mirarte los tutoriales oficiales para entender el funcionamiento básico al menos.

Aprenderás más rápido (y mejor) lo necesario siguiendo esos tutoriales que lo que te pueda explicar cualquiera por aquí.

1 respuesta
L

#21 +1 xD

darkblade60

#20 me cago en mi vida, ya está, tanta GUI me marea, he arrastrado el prefab como dices y ya muestra la información... mamma mia, gracias a todos!!

1 respuesta
FernandoA

#23 De todos modos no dejes de ver los tutoriales oficiales que te he pasado en #21, están bastante bien, en muchos casos son breves (5 mins) y explican cosas que por lo que he leído en algunos de tus comentarios todavía no tienes claras. Te ayudarán a comprender el funcionamiento de Unity mejor.

1 respuesta
darkblade60

#24 Les echaré un ojo, gracias también ;)

Usuarios habituales

Tags