glantucan / puzzle_game

A small Unity basics review example and start point to go to a modular design
1 stars 1 forks source link

Ejercicio21 (WerderAntoine) #5

Open glantucan opened 8 years ago

glantucan commented 8 years ago

He intentado haciendo que al llegar a la posición indicada la velocidad se reduzca a 0 mediante estas lineas:

if (player.transform.position == controlPoint)
v = 0f;

Pero dado que para que coincidan exactamente en la misma posicion hay que tener una suerte mayor que la del euromillones, estas lineas no sirven.

He buscado en la ayuda de Unity y he encontrado Vector3.MoveTowards pero no parece ser exactamente lo que necesito.

glantucan commented 8 years ago

En este caso no es una cuestión de buscar en la referencia de Unity. Ahí no vas a encontrar la solución para este problema, aunque nunca está de más mirar.

Lo que tienes que hacer es calcular la distancia que queda por recorrer en cada fotograma. Tampoco va a llegar exáctamente a cero nunca, pero puedes compararla con una distancia mínima que tú consideres que es lo suficientemente cercana a 0.

Ese es el primer paso. Cuando lo consigas, piensa un poco más porque esa distancia mínima depende de la velocidad a la que se mueve el cubo, y se puede calcular exáctamente.

RomeroJaime commented 8 years ago

hola oscar, hemos intentado esto entre cuatro pero a veces nos llega y se nos para y a veces no se nos mueve y no sabemos por que, ¿podrias ayudarnos?

using UnityEngine;
using System.Collections;

public class Vectores21 : MonoBehaviour {
    public float v;
    private Vector3 displace;
    private Vector3 direction;
    private int distance;
    public GameObject player;
    public Vector3 controlPoint;

    // Use this for initialization
    void Start () {
        direction = controlPoint - player.transform.position;
        }

    // Update is called once per frame
    void Update () {

        displace = direction.normalized* v * Time.deltaTime;
        player.transform.position = player.transform.position + displace;

        if (player.transform.position.sqrMagnitude <= controlPoint.sqrMagnitude) 
            v = 0;
    }
glantucan commented 8 years ago

El quiz de la cuestión está en la comparación que hacéis en el if. Lo que estáis comparando es la longitud del vector de posición del cubo con la longitud del vector de posición del punto de control.

Un consejo. El vector que llamáis direction, es en realidad el vector distancia. El vector direction, en este caso, es ese vector normalizado.

A riesgo de ser pesado ;) os repito que es fundamental que elijais bien el nombre de las variables.

WerderAntoine commented 8 years ago

Continuamos con la odisea. Mediante la formula de d=v * t calculamos el tiempo que necesitara el objeto para recorrer la distancia y que cuando se iguale al tiempo que lleva recorriendo se pare.

Nunca se iguala por 0.1

public class Vectores21 : MonoBehaviour {
    public float v;
    public GameObject player;
    public Vector3 controlPoint;

    private Vector3 displace;
    private Vector3 initialDistance;
    private Vector3 realTimeDistance;
    private float distance;
    private float totalTime;
    private float time;

    // Use this for initialization
    void Start () {
        initialDistance = controlPoint - player.transform.position;
        totalTime = initialDistance.magnitude / v;

    }

    // Update is called once per frame
    void Update () {

        realTimeDistance = controlPoint - player.transform.position;
        distance = realTimeDistance.magnitude;

        displace = initialDistance.normalized* v * Time.deltaTime;
        player.transform.position = player.transform.position + displace;

        Debug.Log ("totalTime=" + totalTime);
        Debug.Log ("time=" + time);
        Debug.Log ("deltaTime=" + Time.deltaTime);

        time = totalTime - Time.deltaTime;
        if(totalTime <= time){
            player.transform.position = controlPoint;
        }

    }
}
glantucan commented 8 years ago

Mmmm.

Ahora no puedo probar porque no estoy delante del ordenador, mañana lo vemos. Pero el enfoque que le has dado, aunque puede funcionar es un poco retorcido.

Lo suyo sería que compararas el realTimeDistance con un valor pequeño que sería la mínima distancia que consideres lo suficientemente pequeña como para asumir que ya ha llegado al destino.

Podéis probar con varios valores, 0.1, 0.2... El valor correcto depende de la velocidad que lleve el player. De hecho, una vez que hayas probado que funciona de la forma anterior tienes que pensar como calcular esa distancia mínima para que funcione con cualquier velocidad. Si lo piensas con calma papel y boli, es fácil.