Noticias

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

Temas recientes

Objeto mira al raton(con Flip)

Iniciado por XedZ, Mayo 04, 2019, 11:53:47 AM

Tema anterior - Siguiente tema

public Transform controlThisObject; //Here can be the transform of the weapon
    private Vector3 mousePos;
    public Quaternion angles;
    public bool facingRight = true;
    void Update()
    {
        MouseL();
        angles = transform.rotation;
    }
   
    void MouseL()
    {
       
       
           
                Vector3 mousePos = Input.mousePosition;
                mousePos.z = 5.23f;
                Vector3 gunPos = Camera.main.WorldToScreenPoint(transform.position);
                mousePos.x = mousePos.x - gunPos.x;
                mousePos.y = mousePos.y - gunPos.y;
                float angle = Mathf.Atan2(mousePos.y, mousePos.x) * Mathf.Rad2Deg;
                transform.rotation = Quaternion.Euler(new Vector3(0, 0, angle));
        if (transform.rotation.w <=0.7 && !facingRight)
        {
           
            facingRight = !facingRight;
           
            Vector3 theScale = transform.localScale;
            theScale.x *= -1;
            transform.localScale = theScale;
        }
       
        else if (transform.rotation.w >= 0.7 && facingRight)
        {
           
            facingRight = !facingRight;
           
            Vector3 theScale = transform.localScale;
            theScale.x *= -1;
            transform.localScale = theScale;
        }
    }

 
Estoy intentando hacer un script en el que un arma mira al raton y que cuando gire a la izquierda cambie de horientacion.Nose si me explico bien.Pero al momento de girar a la izquierda pasan cosas raras.Muchas gracias de antemano.
 


Mayo 05, 2019, 12:17:14 AM #1 Ultima modificación: Mayo 05, 2019, 09:45:15 PM por lightbug
Cita de: XedZ date=1556963627Estoy intentando hacer un script en el que un arma mira al raton y que cuando gire a la izquierda cambie de horientacion.Nose si me explico bien.Pero al momento de girar a la izquierda pasan cosas raras.Muchas gracias de antemano.
   


Tenés que trabajar en espacios iguales, o bien pasas el cursor (screen space) a mundo (world space), o la pos del player al mundo del cursor (screen space). Usá el método de Camera.ScreenPointToWorld o similar (alrevés de como estás usando, es una posiblidad).
 
https://docs.unity3d.com/ScriptReference/Camera.ScreenToWorldPoint.html
 
Una cosa no uses Camera.main en update, es super ineficiente:
 

Camera mainCamera;
void Awake()
{
mainCamera = Camera.main;
}
...
void Update()
{
...
mainCamera.ScreenToWorldPoint( ... );
...
}

 
Eso te va una pos de mundo. Al x de esa posición lo comparás con x del player:
 

facingRight = x_cursor > x_player;

 
Si tenés dudas si algo funciona o no imprimi la posicion del player y la del punto devuelto por ScreenToWorldPoint.

Mayo 05, 2019, 10:54:50 AM #2 Ultima modificación: Mayo 05, 2019, 12:07:45 PM por XedZ
 
 
 
 
Muchas gracias.Una cosa , como harias tu para darle la vuelta , lo he estado probando y al darle la vuelta parece que se invierte la cosa.

Cita de: XedZ date=1557046490 
   
   
       
   
   
      Muchas gracias.Una cosa , como harias tu para darle la vuelta , lo he estado probando y al darle la vuelta parece que se invierte la cosa.
   


osea darle la vuielta = girar al personaje? si es así no debería cambiar en nada, el cursor seguirá teniendo la misma posición y lo mismo el personaje. ¿Qué es exactamente lo que te pasa?

Cita de: lightbug date=1557085497osea darle la vuielta = girar al personaje? si es así no debería cambiar en nada, el cursor seguirá teniendo la misma posición y lo mismo el personaje. ¿Qué es exactamente lo que te pasa?
   


Vector3 mousePos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
        mousePos.z = 5.23f;
        mousePos.x = mousePos.x - transform.position.x;
        mousePos.y = mousePos.y - transform.position.y;
        float angle = Mathf.Atan2(mousePos.y, mousePos.x) * Mathf.Rad2Deg;
        transform.rotation = Quaternion.Euler(new Vector3(0, 0, angle));
 
        if (mousePos.x < transform.position.x && !facingRight)
        {
            facingRight = !facingRight;
 
            Vector3 theScale = transform.localScale;
            theScale.x *= -1;
            transform.localScale = theScale;
        }
        else if (mousePos.x > transform.position.x && facingRight)
        {
            facingRight = !facingRight;
 
            Vector3 theScale = transform.localScale;
            theScale.x *= -1;
            transform.localScale = theScale;
        }

 
 
 


El problema es el arma? quizás podrías separar un poco más las cosas siguiendo la línea de
 


  1.    obtener las coordenadas


  2.    determinar el flag "facingRight"


  3.    Si cambia el flag realizas la acción



const float valorRaro = 5.23f;
bool facingRight;
 
void Update
{
     // estas usando Camera.main!
     Vector3 mousePos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
     // mousePos.z = 5.23f; //este valor ni idea, no queda tan lindo poner este tipo de valores sueltos, quizás quede mejor el const de arriba
     mousePos.z = valorRaro; //este valor ni idea, no queda tan lindo poner este tipo de valores sueltos, quizás quede mejor el const de arriba
     mousePos.x = mousePos.x - transform.position.x;
     mousePos.y = mousePos.y - transform.position.y;
     //ni idea esto, supongo que será para el arma...   
     float angle = Mathf.Atan2(mousePos.y, mousePos.x) * Mathf.Rad2Deg;
     transform.rotation = Quaternion.Euler(new Vector3(0, 0, angle));
//esta es var local
bool facingRight = mousePos.x < transform.position.x;
if( facingRight != this.facingRight )
    {
   Flip();
         this.facingRight = facingRight;
    }
 
     
}
 
void Flip()
{
     Vector3 theScale = transform.localScale;
    theScale.x *= -1;
    transform.localScale = theScale;
}

 
 

Etiquetas: