Noticias

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

Modificar Las Componentes Del Transform

Iniciado por eder, Septiembre 06, 2016, 11:59:49 PM

Tema anterior - Siguiente tema
Septiembre 06, 2016, 11:59:49 PM Ultima modificación: Septiembre 07, 2016, 12:54:09 AM por pioj
Porque no me deja modificar las componentes del transform por separado, es decir, si yo pongo esto:
 



   
      transform.position.x = (valor cualquiera)
   

[/quote]
 
para modificar solo una componente, me pone un error y me dice que es solo un { get }
 
que otra forma hay de hacer esto, de modificar la componente "x" o "y" o "z" de la posicion o rotacion o escala sin que afecte a las demas componentes??
 
 
 
(si modifico por ejemplo la "y" que las otras dos componentes puedan tomar el valor que sea)

Septiembre 07, 2016, 12:03:53 AM #1 Ultima modificación: Septiembre 07, 2016, 12:54:26 AM por pioj



   
      transform.position = new Vector3(30.0f, transform.position.y, transform.position.z); //La posicion en el eje X va a ser de 30 sin afectar a otros ejes.
   

[/quote]
 
PD: Js si te permite hacerlo directamente. transform.position.x = 30;

osea en JS si y en C# no?
 
que troleada es esta? jajajaj

Septiembre 07, 2016, 01:03:21 AM #3 Ultima modificación: Septiembre 07, 2016, 01:04:37 AM por Braltor
Cita de: eder date=1473199787osea en JS si y en C# no?
   
   
      que troleada es esta? jajajaj
   


jajaja tampoco entiendo la razon de eso, pero es cierto, C# no permite asignar solo 1 componente
 
ahora q lo pienso... talvez hay un getter/setter en el medio asi q solo puedes asignar un struct nuevo

Septiembre 14, 2016, 09:54:50 PM #4 Ultima modificación: Septiembre 15, 2016, 09:21:45 PM por kaito
Efectivamente, transform.position es una propiedad, que utiliza get/set, y además Vector3 es una estructura. A diferencia de las clases, las estructuras utilizan copias con referencias diferentes. Entonces, si modificas uno de sus valores x, y, z, se debe crear una nueva instancia con los 3 valores. Si Vector3 fuera una clase, utilizaría la referencia del objeto fuente, y no la copia, por lo que podríamos modificar individualmente uno de sus valores.
 
 
 

using UnityEngine;
using System.Collections;
public class Test : MonoBehaviour
{
    struct Vector
    {
        public float x, y, z;
        public Vector(float x, float y, float z)
        {
            this.x = x;
            this.y = y;
            this.z = z;
        }
    }
    Vector _position;
    Vector positionStruct
    {
        set { this._position = value; }
        get { return _position; }
    }
    class VectorClass {
        public float x, y, z;
        public VectorClass(float x, float y, float z)
        {
            this.x = x;
            this.y = y;
            this.z = z;
        }
    }
    VectorClass _vectorClass;
    VectorClass positionClass
    {
        set { this._vectorClass = value; }
        get { return this._vectorClass; }
    }
    // Use this for initialization
    void Start()
    {
        //Ejemplo estructura similar a Vector3
        positionStruct = new Vector(1f, 2f, 3f);
        Debug.Log("Propiedad utilizando una estructura");
        Debug.Log(positionStruct.x + "-" + positionStruct.y + "-" + positionStruct.z);
        //position.x = 5f; error
       
        //Utilizando clase similar a Vector3
        positionClass = new VectorClass(1f, 1f, 1f);
        Debug.Log("Propiedad utilizando una clase");
        Debug.Log(positionClass.x + "-" + positionClass.y + "-" + positionClass.z);
        positionClass.x = 3f;
        positionClass.y = 3f;
        positionClass.z = 3f;
        Debug.Log(positionClass.x + "-" + positionClass.y + "-" + positionClass.z);
    }
}

 
Una propiedad modificando una estructura no puede modificar independientemente sus valores. En cambio, una propiedad utilizando una clase si que puedes modificar sus valores independientemente.

El "porqué" de tener que darle el vector3 completo en C#, está explicado aquí abajo, según MSDN:
 



   
      Actually, the reason is that Vector3 are structs. In C#, structs are value types. So they are always returned by value wereas class can be pass/returned by references. It will be the same behaviour for all properties that wrap struct members (like Rect, Vector2, etc...)
   

[/quote]
 
Es decir, por conveniencia es mejor pasarle todos los componentes para crear la nueva struct, ya que la operación que hará luego es re-crear esa estructura de datos de cero.

Septiembre 15, 2016, 09:25:54 PM #6 Ultima modificación: Septiembre 15, 2016, 09:27:38 PM por kaito
He modificando el ejemplo anterior, y he añadido una propiedad que mani*** una estructura y otra propiedad que mani*** una clase. La propiedad que mani*** una clase si que puede cambiar uno de sus campos.
 
¿Por qué en JS si que podemos modificar position.x y en C Sharp no? Porque en c Sharp utilizan una propiedad que mani*** una estructura. Y en JS no existe propiedades (get,set). En JS seguramente mani*** directamente Vector3.
 
Si C Sharp mani***ra directamente un Vector3(estructura), sin propiedad como en JS, o si Vector3 fuera una clase,  también se podría modificar position.x en C Sharp.

Una struct es bastante más ligero que una clase, y dado que se utiliza Vector3 en todas partes el motivo debe ser éste.

yo descubri esto
 

Vector3 temp = transform.position; // hacer la copia de la posicion
temp.x = 35;//modifcar lo que tengas que modificar 
transform.position = temp;//y al final actualizas la posicion

 
esto me sirvio para el caso que tenga que modificar muchas cosas a la posicion, tambien funciona con la rotacion

A ver, si tanto interesa el tema, yo haría una extensión de Vector3/Vector2 que tomará los parámetros individuales y devolviera con un new la nueva clase. Nunca haría un wrapper de la struct ya que entonces vamos a perder rendimiento.

Cita de: iRobb date=1476520332A ver, si tanto interesa el tema, yo haría una extensión de Vector3/Vector2 que tomará los parámetros individuales y devolviera con un new la nueva clase. Nunca haría un wrapper de la struct ya que entonces vamos a perder rendimiento.
   


no se que problema le ven con hacerlo mediante vector3 y los parametros que no quieras cambiar pones los que ya tenias. Así de simple!

Para hacerlo como antes y siempre no comentes hombre. Añade algo nuevo a la sección.

Cita de: leocub58 date=1476550495no se que problema le ven con hacerlo mediante vector3 y los parametros que no quieras cambiar pones los que ya tenias. Así de simple!
   


tal cual! de paso se aprende mucho (bueno, algo) de como funcionan los vectores. Y eso si, en C# no podes hacer eso, pero por esa tonteria no te pases a JavaScript, C# siempre ganará en Unity, quedate de nuestro lado, del lado bueno jajajja
 
saludos

Etiquetas: