Jump to content
UnitySpain
Sign in to follow this  
XedZ

Objeto mira al raton(con Flip)

Recommended Posts

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.

Captura.PNG

Captura2.PNG

Share this post


Link to post
Share on other sites
On 5/4/2019 at 6:53 AM, XedZ said:

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.

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.

Edited by lightbug

Share this post


Link to post
Share on other sites

 

 

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.

Edited by XedZ

Share this post


Link to post
Share on other sites
10 hours ago, XedZ said:

 

 

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?

Share this post


Link to post
Share on other sites
15 hours ago, lightbug said:

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?

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;
        }

 

123e.PNG

12e.PNG

Share this post


Link to post
Share on other sites

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;
}

 

Share this post


Link to post
Share on other sites
Sign in to follow this  

×
×
  • Create New...