Jump to content

Recommended Posts

Hola de nuevo :7_sweat_smile:

Como dice en el titulo, estoy tratando de crear el retroceso de un arma, pero de un modo... suavizado, en un principio pensé en usar corrutinas, pero como bien me an explicado los compañeros, no sirven para lo que creía :58_disappointed_relieved:.

  void Retroceso() 
    {
      

         punto_inicial = new Vector3(camara.transform.localEulerAngles.x,camara.transform.localEulerAngles.y);
        camara.transform.localEulerAngles = new Vector3(camara.transform.localEulerAngles.x - 4f, camara.transform.localEulerAngles.y); // esto es el retroceso en si
        camara.transform.localEulerAngles = Vector3.Lerp(camara.transform.localEulerAngles,punto_inicial, 1f); // el suabizado de el que hablaba
    }

Retroceso, solo se llama una vez, en el momento en el que presionas el botón derecho de el ratón hacia abajo.

El problema esta en que, como todo se ejecuta en un solo fotograma, desaparece ese efecto de retroceso, la pregunta seria que: como ago para que primero se ejecuten 


         punto_inicial = new Vector3(camara.transform.localEulerAngles.x,camara.transform.localEulerAngles.y);
        camara.transform.localEulerAngles = new Vector3(camara.transform.localEulerAngles.x - 4f, camara.transform.localEulerAngles.y);

y cuando se acabe de ejecutar inicie este otro

 camara.transform.localEulerAngles = Vector3.Lerp(camara.transform.localEulerAngles,punto_inicial, 1f);

Gracias de antemano :91_thumbsup:

Share this post


Link to post
Share on other sites

No entiendo muy bien que quieres hacer pero, creo que es como el sistema que se ejecuta al usar el arco en Minecraft jaja (creo). Pues por qué no usas una variable float de velocidad?, Para que no haga ese cambio "brusco" al iniciar el cambio de posición, en vez de ir de 0 a -4 en un solo fotograma, usa la velocidad para que esa variable se actualice a algo como  0, -1, -2, -3 y -4, en un tiempo determinado.

Share this post


Link to post
Share on other sites

Buenos días Alex

12 hours ago, Alex said:

No entiendo muy bien que quieres hacer

Ese movimiento brusco de el principio, esta echo así a propósito, el problema esta en que, una vez echo ese movimiento, necesito que se ejecute la ultima parte y que no lo calcule en un solo fotograma... no se si me explico

Share this post


Link to post
Share on other sites

Hola!

Es una manera brusca pero tal vez te sirva:

El "1f" cambialo por "step" ya que este se va a actualizar en cada frame hasta llegar a 1.

public float time; //Juega con este valor para ver los resultados.

void Retroceso()
{
punto_inicial = new Vector3(camara.transform.localEulerAngles.x,camara.transform.localEulerAngles.y);

camara.transform.localEulerAngles = new Vector3(camara.transform.localEulerAngles.x - 4f, camara.transform.localEulerAngles.y);
// esto es el retroceso en si

}

StartCoroutine(ActualizaElEstado(Vector3 punto_inicial, float time));

}

private IEnumerator ActualizaElEstado(Vector3 punto_inicial, float time)
{
float inversedTime = 1 / time ; // Puedes cambiar este valor.


for( step = 0.0f; step < 1.0f ; step += Time.deltaTime * inversedTime )
{
     camara.transform.localEulerAngles = Vector3.Lerp(camara.transform.localEulerAngles,punto_inicial, step);
    
yield return WaitForEndOfFrame();
} }

 

Edited by pioj
Por favor, usa el <> o el "quote" para pegar código.
  • Like 1

Share this post


Link to post
Share on other sites

 

Esto es algo que subí hace unos días a instagram.

Para que la cámara funcione correctamente tenes tener múltiples axis disponibles, por lo que la mejor idea es ir anidando la camara.

1 Nivel - Rotación X
2 Nivel - Rotación Y
3 Nivel - Rotación Z
4 Nivel - Retroceso
5 Nivel - Respiración
6 Nivel - Movimientos de Pasos.

De esta manera lo resolvi fácil y el movimiento queda fluido, existe otra técnica que es un poco más compleja, pero al final termina realizando los mismo cálculos. 

Recuerda siempre rotar y mover los niveles en su espacio local.

Share this post


Link to post
Share on other sites

¡Muchas gracias francoe!

he estado rompiéndome la cabeza intentando lograr esos movimientos... aplicare tus consejos pero un poco de inspiración no me vendría mal :22_stuck_out_tongue_winking_eye:

 

 

Y buenas noches Alex

E estado probando tu código y funciono, pero provocaba algunos bugs... así que a partir de el original aquí esta nuestro pequeñín 

 void Retroceso() 
    {
        punto_inicial = -mov_player.Vertical_mov;             
        mov_player.Vertical_mov -= 10;                                                            
        StartCoroutine(fuerza_sobrante());
       
    }
    
    IEnumerator fuerza_sobrante()
    {
       
        for (float time = 0;  time < 10; time ++) {
            mov_player.Vertical_mov += 0.7f;
            time++;
            yield return new WaitForEndOfFrame();
        }
        
    }

 

Share this post


Link to post
Share on other sites

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