Dúvida com Time.deltaTime
3 participantes
Página 1 de 1
Dúvida com Time.deltaTime
Olá boa noite!
Eu estou tentando aprender unity, e para praticar, estou refazendo o jogo antigo do mario. Naquele jogo, quando se pula, têm um tempo até você descer, uns 0.3, 0.5 segundos.
Selecionar Código
Abrir Codigo
[list=linenums]
[*]if (Input.GetKey(KeyCode.Space) && isGround)
[*]{
[*] rb.AddForce(transform.up * forcaPulo);
[*] isGround = false;
[*]}
[*]
[*]if (Input.GetKeyUp(KeyCode.Space))
[*]{
[*]
[*] contagemPulo -= Time.deltaTime;
[*] rb.AddForce(transform.up * forcaDescida);
[*]
[*] contagemPulo = 0.5f;
[*]}
[/list]
Este é o meu código para quando ele estiver no ar e eu soltar o o espaço, faz uma força contrária a gravidade, porém eu gostaria que essa força fosse após um certo tempo, mas não sei como fazer isso muito bem.
Eu estou tentando aprender unity, e para praticar, estou refazendo o jogo antigo do mario. Naquele jogo, quando se pula, têm um tempo até você descer, uns 0.3, 0.5 segundos.
Selecionar Código
Abrir Codigo
[list=linenums]
[*]if (Input.GetKey(KeyCode.Space) && isGround)
[*]{
[*] rb.AddForce(transform.up * forcaPulo);
[*] isGround = false;
[*]}
[*]
[*]if (Input.GetKeyUp(KeyCode.Space))
[*]{
[*]
[*] contagemPulo -= Time.deltaTime;
[*] rb.AddForce(transform.up * forcaDescida);
[*]
[*] contagemPulo = 0.5f;
[*]}
[/list]
Este é o meu código para quando ele estiver no ar e eu soltar o o espaço, faz uma força contrária a gravidade, porém eu gostaria que essa força fosse após um certo tempo, mas não sei como fazer isso muito bem.
SulofShadow- Iniciante
- PONTOS : 1193
REPUTAÇÃO : 0
Respeito as regras :
Re: Dúvida com Time.deltaTime
- Código:
public float delay = 0.5f;
if (Input.GetKeyUp(KeyCode.Space))
{
contagemPulo = delay;
contagemPulo -= Time.deltaTime;
if(contagemPulo <= 0) rb.AddForce(transform.up * forcaDescida);
Voce pode fazer uma verificação se contagempulo chegou a 0
Pokedlg- ProgramadorMaster
- PONTOS : 2337
REPUTAÇÃO : 198
Áreas de atuação : Iniciante: ShaderLab, Blender, Java, C++, ASP.NET.
Intermediário: C#.NET, Unity, Shader Graph.
Respeito as regras :
Re: Dúvida com Time.deltaTime
Eu tinha até tentado fazer com essa verificação, só que estranhei porque parecia que não fazia essa addForce para baixo. Botei até um debug.log() para ver se realmente não estava entrando, e não está!Pokedlg escreveu:
- Código:
public float delay = 0.5f;
if (Input.GetKeyUp(KeyCode.Space))
{
contagemPulo = delay;
contagemPulo -= Time.deltaTime;
if(contagemPulo <= 0) rb.AddForce(transform.up * forcaDescida);
Voce pode fazer uma verificação se contagempulo chegou a 0
Como eu sou bem novo em unity, eu só fico vendo alguns tutoriais sobre como fazer e a lógica que adquiri com outras linguagens, não sei se o problema está no resto do código.
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MovimentoPersonagem : MonoBehaviour
{
public float velocidade = 10f;
public float forcaPulo = 500;
public float forcaDescida = -210;
public float contagemPulo = 0.5f;
private bool isGround;
private Rigidbody2D rb;
// Start is called before the first frame update
void Start()
{
rb = GetComponent<Rigidbody2D>();
}
// Update is called once per frame
void Update()
{
Movimentação();
}
private void Movimentação()
{
// Coisas a se fazer: Atualizar movimentação para rigidbody
// A movimentação do personagem para os lados
if (Input.GetKey(KeyCode.D))
{
transform.position += new Vector3(1, 0, 0) * velocidade * Time.deltaTime;
}
if (Input.GetKey(KeyCode.A))
{
transform.position += new Vector3(-1, 0, 0) * velocidade * Time.deltaTime;
}
// Pulo
if (Input.GetKey(KeyCode.Space) && isGround)
{
rb.AddForce(transform.up * forcaPulo);
isGround = false;
}
// Força inversa à gravidade para descer quando não estiver no ar.
if (Input.GetKeyUp(KeyCode.Space))
{
contagemPulo -= Time.deltaTime;
if (contagemPulo <= 0)
{
rb.AddForce(transform.up * forcaDescida);
Debug.Log("entrei aqui.");
}
}
}
// Colisão no chão para pular
private void OnCollisionEnter2D(Collision2D collision)
{
if(collision.gameObject.tag == "chao")
{
isGround = true;
}
}
}
SulofShadow- Iniciante
- PONTOS : 1193
REPUTAÇÃO : 0
Respeito as regras :
Re: Dúvida com Time.deltaTime
Infelizmente por motivos de hardware, não consigo criar um ambiente e testar seu código, porém logicamente alegando isto deveria funcionar.
Crie um outro script com o nome PersonMovement e copie o código abaixo ou altere o nome do arquivo do seu script para isso ou, até mesmo, somente mude o nome dos componentes do meu código para acomodar com a sua escrita.
Se funcionar, avise, caso contrário veja se há alguma ação estranha em como o seu personagem se comporta.
Infelizmente, também, deixei o código sem comentários, todavia imagino que compreenderás sem problemas.
Espero ter ajudado.
Crie um outro script com o nome PersonMovement e copie o código abaixo ou altere o nome do arquivo do seu script para isso ou, até mesmo, somente mude o nome dos componentes do meu código para acomodar com a sua escrita.
Se funcionar, avise, caso contrário veja se há alguma ação estranha em como o seu personagem se comporta.
- Código::
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PersonMovement : MonoBehavior
{
public float velocity = 10f;
public float jumpForce = 500;
public float fallForce = -210;
public float jumpTimeCount = 0;
public bool isPressingJump = false;
private bool isOnGround;
private Rigidbody2D rb;
void Start()
{
rb = GetComponent<Rigidbody2D>();
}
void Update ()
{
Movement();
}
private void Movement ()
{
if (Input.GetKey (KeyCode.D))
transform.position += new Vector3 (1, 0, 0) * velocity * Time.deltaTime;
if (Input.GetKey (KeyCode.A))
transform.position += new Vector3(-1, 0, 0) * velocity * Time.deltaTime;
if (Input.GetKey (KeyCode.Space) && isOnGround)
{
jumpTimeCount = 0.0f;
isPressingJump = true;
rb.AddForce(transform.up * jumpForce);
isOnGround = false;
}
if (Input.GetKeyUp (KeyCode.Space))
{
isPressingJump = false;
}
if ((isOnGround == false) && (jumpTimeCount < 0.5f))
{
jumpTimeCount += Time.deltaTime;
}
if ((isPressingJump == false) && (jumpTimeCount > 0.3f))
rb.AddForce(transform.up * fallForce);
else if (jumpTimeCount >= 0.5f)
rb.AddForce(transform.up * fallForce);
else {
// Nothing.
}
}
private void OnCollisionEnter2D (Collision2D collision)
{
if (collision.gameObject.tag == "chao")
isOnGround = true;
}
}
Infelizmente, também, deixei o código sem comentários, todavia imagino que compreenderás sem problemas.
Espero ter ajudado.
classicandsimple- ProgramadorMaster
- PONTOS : 1267
REPUTAÇÃO : 26
Áreas de atuação : Desenvolvimento de software (iniciante com linguagem C).
Respeito as regras :
Re: Dúvida com Time.deltaTime
Eu implementei esse código e funcionou! Porém, depois de um tempo o meu personagem para de pular.classicandsimple escreveu:Infelizmente por motivos de hardware, não consigo criar um ambiente e testar seu código, porém logicamente alegando isto deveria funcionar.
Crie um outro script com o nome PersonMovement e copie o código abaixo ou altere o nome do arquivo do seu script para isso ou, até mesmo, somente mude o nome dos componentes do meu código para acomodar com a sua escrita.
Se funcionar, avise, caso contrário veja se há alguma ação estranha em como o seu personagem se comporta.
- Código:
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PersonMovement : MonoBehavior
{
public float velocity = 10f;
public float jumpForce = 500;
public float fallForce = -210;
public float jumpTimeCount = 0;
public bool isPressingJump = false;
private bool isOnGround;
private Rigidbody2D rb;
void Start()
{
rb = GetComponent<Rigidbody2D>();
}
void Update ()
{
Movement();
}
private void Movement ()
{
if (Input.GetKey (KeyCode.D))
transform.position += new Vector3 (1, 0, 0) * velocity * Time.deltaTime;
if (Input.GetKey (KeyCode.A))
transform.position += new Vector3(-1, 0, 0) * velocity * Time.deltaTime;
if (Input.GetKey (KeyCode.Space) && isOnGround)
{
jumpTimeCount = 0.0f;
isPressingJump = true;
rb.AddForce(transform.up * jumpForce);
isOnGround = false;
}
if (Input.GetKeyUp (KeyCode.Space))
{
isPressingJump = false;
}
if ((isOnGround == false) && (jumpTimeCount < 0.5f))
{
jumpTimeCount += Time.deltaTime;
}
if ((isPressingJump == false) && (jumpTimeCount > 0.3f))
rb.AddForce(transform.up * fallForce);
else if (jumpTimeCount >= 0.5f)
rb.AddForce(transform.up * fallForce);
else {
// Nothing.
}
}
private void OnCollisionEnter2D (Collision2D collision)
{
if (collision.gameObject.tag == "chao")
isOnGround = true;
}
}
Infelizmente, também, deixei o código sem comentários, todavia imagino que compreenderás sem problemas.
Espero ter ajudado.
E como não pude compreender totalmente essa parte do código, eu não consigo tentar ajeitar ou pelo menos saber o que tá acontecendo.
- Código:
// Essa parte não ficou muita clara para mim
if (Input.GetKeyUp(KeyCode.Space))
{
isPressingJump = false;
}
if ((isOnGround == false) && (jumpTimeCount < 0.5f))
{
jumpTimeCount += Time.deltaTime;
}
if ((isPressingJump == false) && (jumpTimeCount > 0.3f))
rb.AddForce(transform.up * fallForce);
else if (jumpTimeCount >= 0.5f)
rb.AddForce(transform.up * fallForce);
SulofShadow- Iniciante
- PONTOS : 1193
REPUTAÇÃO : 0
Respeito as regras :
Re: Dúvida com Time.deltaTime
Nesse segmento de código o que acontece é:
- PRIMEIRO: se eu soltar a tecla de espaço, então a váriavel isPressingJump ficará falsa, alegando então que eu não irei mais exercer do pulo maior (0.5 segundos no ar).
- SEGUNDO: se eu não estiver no chão (isOnTheGround for falso) e o contador for menor que o tempo de maior pulo (0.5 segundos), então eu aumento o contador de tempo de pulo (jumpTimeCount). Obs.: creio que tu possas omitir a parte (isOnGround == false) && , tente retirá-la e veja se haverá algum efeito positivo para o novo problema.
- TERCEIRO: Se eu não estiver com a tecla de pulo pressionada (isPressingJump for falso) e meu tempo de pulo for maior que o menor tempo de pulo (0.3 segundos), então a gravidade se aplica para retornar ao chão, senão se (else if) se meu tempo de pulo for maior que o maior tempo de pulo (0.5 segundos), novamente, tenho a aplicação da gravidade.
Infelizmente, não consigo deduzir o que possa estar acontecendo para seu personagem parar de pular, pode ser algo relacionado ao Collider do objeto, porém, para isto eu precisaria ver o seu projeto, caso contrário seria necessário outra lógica de código (o que não seria díficil de se criar já tendo uma outra lógica pronta).
Caso tenhas resolvido, comente, assim podemos analizar o real erro para futuros problemas. Espero ter ajudado.
- PRIMEIRO: se eu soltar a tecla de espaço, então a váriavel isPressingJump ficará falsa, alegando então que eu não irei mais exercer do pulo maior (0.5 segundos no ar).
- SEGUNDO: se eu não estiver no chão (isOnTheGround for falso) e o contador for menor que o tempo de maior pulo (0.5 segundos), então eu aumento o contador de tempo de pulo (jumpTimeCount). Obs.: creio que tu possas omitir a parte (isOnGround == false) && , tente retirá-la e veja se haverá algum efeito positivo para o novo problema.
- TERCEIRO: Se eu não estiver com a tecla de pulo pressionada (isPressingJump for falso) e meu tempo de pulo for maior que o menor tempo de pulo (0.3 segundos), então a gravidade se aplica para retornar ao chão, senão se (else if) se meu tempo de pulo for maior que o maior tempo de pulo (0.5 segundos), novamente, tenho a aplicação da gravidade.
- Segmento de código.:
- Código:
if (Input.GetKeyUp(KeyCode.Space)) // Primeiro;
{
isPressingJump = false;
}
if ((isOnGround == false) && (jumpTimeCount < 0.5f)) // Segundo;
{
jumpTimeCount += Time.deltaTime;
}
// Terceiro; If para caso eu queira um pulo de no máximo 0.3 segundos.
if ((isPressingJump == false) && (jumpTimeCount > 0.3f))
rb.AddForce(transform.up * fallForce);
else if (jumpTimeCount >= 0.5f) // if para caso eu queira um pulo maior que 0.3 segundos (com maior pulo sendo de 0.5 segundos);
rb.AddForce(transform.up * fallForce);
Infelizmente, não consigo deduzir o que possa estar acontecendo para seu personagem parar de pular, pode ser algo relacionado ao Collider do objeto, porém, para isto eu precisaria ver o seu projeto, caso contrário seria necessário outra lógica de código (o que não seria díficil de se criar já tendo uma outra lógica pronta).
Caso tenhas resolvido, comente, assim podemos analizar o real erro para futuros problemas. Espero ter ajudado.
classicandsimple- ProgramadorMaster
- PONTOS : 1267
REPUTAÇÃO : 26
Áreas de atuação : Desenvolvimento de software (iniciante com linguagem C).
Respeito as regras :
Tópicos semelhantes
» Time.deltatime;
» [DUVIDA]sobre Time.deltaTime
» Pergunta sobre o Time.deltaTime
» Duvida sobre Time.deltaTime
» Como Posso Fazer um Time.DeltaTime com uma Int ?
» [DUVIDA]sobre Time.deltaTime
» Pergunta sobre o Time.deltaTime
» Duvida sobre Time.deltaTime
» Como Posso Fazer um Time.DeltaTime com uma Int ?
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos