Noticias

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

Como se le aplicaria Time.Deltatime

Iniciado por ThePalyerZftP, Julio 13, 2015, 05:23:26 PM

Tema anterior - Siguiente tema

using UnityEngine;
using System.Collections;
public class Test1Variables : MonoBehaviour {
public int Vida = 100;
public int VidaMaxima = 100;
public int Armadura = 0;
public int ArmaduraExtra = 50;
public bool ArmaduraExtraB = true;
public int ArmaduraSegundo = 1;
public int ArmaduraMaxima = 100;
void Awake (){
   if (ArmaduraExtraB == true) {
      Armadura = Armadura + ArmaduraExtra;
   }
}
void Update () {
   if (Armadura < ArmaduraMaxima && Vida == VidaMaxima) {
      Armadura = Armadura + ArmaduraSegundo;
   }
   Debug.Log ("Armadura: " + Armadura + ("/100"));
}

Este post nomas lo hago para que me ayuden a aprender, el script que les pasare no es para ningun proyecto mio solo es lo que estoy haciendo para aprender.
 
Me gustaria saver como le pongo tiempo real en segundos para que suva la armadura cada un segundo.

Multiplica ArmaduraSegundo por Time.deltaTime y lo tienes. No sabría explicarte el funcionamiento del Time.deltaTime


Cita de: juanma_teso date=1436805651Multiplica ArmaduraSegundo por Time.deltaTime y lo tienes. No sabría explicarte el funcionamiento del Time.deltaTime
Pero en donde lo pongo dime la linia.

Julio 13, 2015, 08:44:39 PM #4 Ultima modificación: Julio 13, 2015, 08:45:32 PM por Jose134

public float timeToDoSomething;
private float time = 0;
void Update () {
    time += Time.deltaTime;    
    if(time > timeToDoSomething){
        time = 0;
        DoSomething();
    }
}
void DoSomething () {
    Debug.Log("Han pasado " + timeToDoSomething + " segundos");
}

Espero que este ejemplo te sirva de ayuda para incorporarlo a tu codigo
 
EDIT: este codigo por si mismo deberia funcionar asi que lo puedes copiar y pegar y probarlo por ti mismo en unity

Julio 14, 2015, 12:27:15 AM #5 Ultima modificación: Julio 14, 2015, 12:28:19 AM por ThePalyerZftP
Cita de: Jose134 date=1436813079

public float timeToDoSomething;
private float time = 0;
void Update () {
    time += Time.deltaTime;    
    if(time > timeToDoSomething){
        time = 0;
        DoSomething();
    }
}
void DoSomething () {
    Debug.Log("Han pasado " + timeToDoSomething + " segundos");
}

Espero que este ejemplo te sirva de ayuda para incorporarlo a tu codigo
 
EDIT: este codigo por si mismo deberia funcionar asi que lo puedes copiar y pegar y probarlo por ti mismo en unity
 
y no entendi el codigo
no lo que quiero es que cada segundo que pasa sume uno.

Creía que el "Multiplica ArmaduraSegundo por Time.deltaTime" se entendía jaja. Línea 23:

Armadura = Armadura + ArmaduraSegundo * Time.deltaTime;

Julio 14, 2015, 08:48:37 AM #7 Ultima modificación: Julio 14, 2015, 09:02:55 AM por esr
Buenas, creo que no estas entendiendo bien como funciona el Update y el deltaTime, te voy a dar una explicacion lo mas rapida y sencilla posible. 
 
La funcion Update se esta ejecutando continuamente, pero entre cada ejecucion de Update el motor realiza diversas tareas (renderizado, calculo de fisicas, ejecucion de Update de otros scripts, etc..) por lo que el intervalo entre cada Update de un Script no es imediato, hay es donde entra el Time.deltaTime. Esta variable contiene el tiempo entre la ejecucion de un update con el Update anterior. 
 
Te voy a poner un ejemplo rapido :

private float TotalTime = 0;
void Update () {
   TotalTime += Time.deltaTime;
   Debug.log(TotalTime);
}

En este ejemplo se imprimira en consola el tiempo que se lleva ejecutando el juego.
 
Para lo que quieres hacer tu y copiando el codigo de Jose134 (si te molesta que lo utilice dimelo y lo quito) lo unico que tienes que cambiar seria esto:

using UnityEngine;
using System.Collections;
 
public class Test1Variables : MonoBehaviour {
 
public int Vida = 100;
public int VidaMaxima = 100;
public int Armadura = 0;
public int ArmaduraExtra = 50;
public bool ArmaduraExtraB = true;
public int ArmaduraSegundo = 1;
public int ArmaduraMaxima = 100;
 
void Awake (){
 
   if (ArmaduraExtraB == true) {
      Armadura = Armadura + ArmaduraExtra;
   }
}
 
void Update () {
    time += Time.deltaTime;    
 
            if(time > timeToDoSomething){
               time = 0;
               if (Armadura < ArmaduraMaxima && Vida == VidaMaxima) {
      Armadura = Armadura + ArmaduraSegundo;
       }
            }
}
 
}

Saludos.


Cita de: juanma_teso date=1436841096 
Creía que el "Multiplica ArmaduraSegundo por Time.deltaTime" se entendía jaja. Línea 23:

Armadura = Armadura + ArmaduraSegundo * Time.deltaTime;

Ya lo prove antes de hacer el post y esperava que lo estava haciendo mal y que se devia hacer de otro modo.

Muchas gracias por la ayuda no entendi algunas cosas pero consegui hacerlo, tuve que hacer un monton de cosas xd.

using UnityEngine;
using System.Collections;
public class Test1Variables : MonoBehaviour {

public int Vida = 100;
public int VidaMaxima = 100;
public int Armadura = 0;
public int ArmaduraExtra = 50;
public bool ArmaduraExtraB = true;
public int ArmaduraSegundo = 1;
public int ArmaduraMaxima = 100;
public int Tiempo = 0;
public int TiempoMaximo = 30;
public int TiempoSubida = 1;

void Awake (){
   
   if (ArmaduraExtraB == true) {
      Armadura = Armadura + ArmaduraExtra;
   }
}

void Update () {
   if (Tiempo < TiempoMaximo) {
      Tiempo = Tiempo + TiempoSubida;
   }
   if (Tiempo == TiempoMaximo) {
      Tiempo = Tiempo - TiempoMaximo;
   }
      
   if (Armadura < ArmaduraMaxima && Vida == VidaMaxima && Tiempo == 28) {
         Armadura = Armadura + ArmaduraSegundo;
   }
}
}  

Para usar este scrip de manera corecta se deve bloquear los fps a 30.

using UnityEngine;
using System.Collections;
public class Limit30fps : MonoBehaviour {
public int fps = 30;
public int VSC = 0;
void Update () {
   QualitySettings.vSyncCount = VSC;
   Application.targetFrameRate = fps;
}
}


Cita de: juanma_teso date=1436888624Y como te lo puse no funciona??
No me dio error.

Julio 16, 2015, 01:52:23 AM #12 Ultima modificación: Julio 16, 2015, 02:02:21 AM por ProgramacionWH
Para aclarar:
 
Tenemos T = FramesPorSegundo.
 
time.deltaTime = 1 / T = el tiempo que ocupa un frame.
 
Es por esta razon que en:
 
// Esta funcion se ejecuta T veces por segundo. Por lo tanto
function Update{
        Primer Frame: time.deltaTime(Desde frame 1 a 1) = 1 / T * 1;
        Segundo Frame: time.deltaTime(Desde frame 1 a 2) = 1 / T * 2;
        ....
        T Frame: time.deltatime(Desde frame 1 a T) = 1 / T * T = 1;
}
 
=> Resumiendo que me lio:
 time.deltaTime es una "constante" para pasar segundos a frame;
 
¿Y porque es "constante" y no constante?
 
Porque en cada ordenador 1 segundo puede tener distinto numero de frames, esto significa que deltaTime varia en funcion del ordenador:
 
function Regeneracion(){
     Armadura += 1; //En un buen PC (Suposiciones) alomejor regeneraria 3000 y en uno malo solo 200.
                               //Por esto utilizamos deltaTime para normalizar el juego en todo tipo de ordenadores, aparte de para que nos salgan las cosas bien hechas
}
 
Un saludo , espero que haya quedado mas claro, entender esto bien ayuda un monton a hacer todo tipo de contadores.
 
@ThePalyerZftP Hechale un ojo a InvokeRepeating porque en este caso puedes hacerlo asi, no necesitas un contador en el Update

Visita http://www.programacionwh.com encontraras tutoriales y muchas cosas .


Tambien puedes visitar mi canal de YouTube https://www.youtube.com/channel/UClSCTn0wPN1iFjED0yaoJUA



Etiquetas: