Jump to content
enelmenu

Ayuda - Ejes XYZ no ortodoxos

Recommended Posts

Hola, espero que esten teniendo un buen dia.
Primero que nada a que me refiero con ortodoxo? Simplemente a que no sigue una doctrina es decir no sigue algo fijo, algo que quiero que sea de una manera pero es de otra.

Necesito que XYZ siempre miren hacia la misma direccion aunque rote el padre o el objeto y apartir de ahi poder modificar XYZ...
Conosco que un V3 "localposition" de un transform se refiere a la posicion local lo cual no se modifica, pero de todas formas los ejes no me hacen caso.. y eso es un problema para mi...
Vamos con ejemplos practicos, no creo que todabia me hayan entendido:

Script para dar ejemplo:
Una Tapa se cierra y se abre en el sentido Z

SI TIENEN 5 MINUTOS PRUEBEN LO PORFA asi me ayudan sino es difícil entender mi problema <3

// PARA USARLO CREEN UN OBJETO CON MALLA TIPO CUBO
// EN LA ESCALA PONGANLE 0 EN Z
// INSERTEN EL SCRIPT EN EL OBJETO
// LISTO PUEDEN USAR EL SCRIPT

// CON E ABREN CON R CIERRAN
	public class CloseTop : MonoBehaviour
    {      
        private MeshRenderer _mesh;

        public float maxScale = 1f;
        public float speed =  2f;

        private Vector3 _posFix;
        private float _scaleStart;
        private float _scaleEnd;

        public bool _close = false;
        public bool _open = false;

        void Start()
        {
            _mesh = GetComponent<MeshRenderer>();
            _posFix = transform.localPosition;
            _scaleStart = transform.localScale.z;
            _scaleEnd = _scaleStart;
        }

        void Update()
        {
            
            transform.localScale = new Vector3(1, -0.06f,Mathf.MoveTowards(transform.localScale.z, _scaleEnd, Time.deltaTime * speed));
            transform.localPosition = _posFix + transform.forward * (transform.localScale.z / 2.0f + _scaleStart / 2.0f);

            if (_open)
            {
                _close = false;
                _mesh.enabled = true;
                if (transform.localScale.z == maxScale)
                {
                    _open = false;
                }
            }

            if (_close)
            {
                _open = false;
                if (transform.localScale.z == _scaleStart)
                {
                    _mesh.enabled = false;
                    _close = false;
                }
            }

            if (Input.GetKeyDown(KeyCode.E))
            {
                _open = true;
                _close = false;
                _scaleEnd = maxScale;
            }
            else if (Input.GetKeyDown(KeyCode.R))
            {
                _close = true;
                _open = false;
                _scaleEnd = _scaleStart;
            }

        }
    }

 

Bueno hasta ahi todo correcto el objeto abre y cierra en Z..

  • Ahora al objeto ponganlo adentro de un padre...
  • Roten el PADRE 90 grados
  • Ejecuten el start

Y ESE es mi problema....
Como pudieron observar si miran el transform del gameobject "Top"(tapa) cuando esta rotado el padre.
La rotacion se modifica correctamente... en Z, pero la posicion se modifica en Y...
Neceisto que se modifique en Z tambien.

Alguna solucion?

Share this post


Link to post
Share on other sites

¿Porqué has utilizado en la escala un valor negativo?

El fallo lo tienes aquí:

            transform.localPosition = _posFix + transform.forward * (transform.localScale.z / 2.0f + _scaleStart / 2.0f);

 

Transform.forward no es lo mismo que Vector3(0,0,1), sino que indica hacía la dirección que apunta el objeto. Si giras el objeto 90 grados el valor que transform.forward daría seria Vector3(0,1,0). Sería correcto utilizar transform.forward si utilizaras la posición global en vez de la local.

Para arreglarlo puedes poner:

            transform.localPosition = _posFix + new Vector3(0, 0, (transform.localScale.z / 2.0f + _scaleStart / 2.0f));

Saludos

Edited by TheBullet

Share this post


Link to post
Share on other sites

@TheBullet SOLUCIONADO! Gracias papa, me sacaste una gran duda sobre el transform.forward, si sospechaba que el problema estaba en ese transform.forward.

Muchas gracias.
Un abrazo.

Share this post


Link to post
Share on other sites

Para agregar a la respuesta de @TheBullet poner :

transform.localPosition = _posFix + new Vector3(0, 0, (transform.localScale.z / 2.0f + _scaleStart / 2.0f));

es lo mismo que

transform.localPosition = _posFix + Vector3.forward * (transform.localScale.z / 2.0f + _scaleStart / 2.0f);

y no haces el "new"

Share this post


Link to post
Share on other sites
hace 3 horas, lightbug said:

Para agregar a la respuesta de @TheBullet poner :


transform.localPosition = _posFix + new Vector3(0, 0, (transform.localScale.z / 2.0f + _scaleStart / 2.0f));

es lo mismo que


transform.localPosition = _posFix + Vector3.forward * (transform.localScale.z / 2.0f + _scaleStart / 2.0f);

y no haces el "new"

Si, mejor así.

Share this post


Link to post
Share on other sites

UnitySpain © Todos los derechos reservados 2020
×
×
  • Create New...