[TUTORIAL] Sistema simples para VOLTAR NO TEMPO, Unity 3D
+2
Tegh
MarcosSchultz
6 participantes
Página 1 de 1
[TUTORIAL] Sistema simples para VOLTAR NO TEMPO, Unity 3D
Fala galera, elaborei este tutorial simples mostrando como fazer um sistema para voltar no tempo na Unity 3D.
Vídeo tutorial:
Código utilizado (versão corrigida):
Vídeo tutorial:
Código utilizado (versão corrigida):
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ReverseTime : MonoBehaviour {
public KeyCode teclaReverseTime = KeyCode.Y;
public float frequencia_Hz = 30;
public int maxFrames = 100;
[Space(15)]
public bool fixedUpdate_50Hz = false;
//
float freq;
float cronometro;
bool reverseTime = false;
List<Vector3> posicoes = new List<Vector3>();
List<Quaternion> rotacoes = new List<Quaternion>();
List<Vector3> rbVelocity = new List<Vector3>();
List<Vector3> rbAngularVelocity = new List<Vector3>();
Rigidbody componentRig;
void Start () {
freq = 1 / frequencia_Hz;
componentRig = GetComponent<Rigidbody> ();
}
void Update () {
if (Input.GetKeyDown (teclaReverseTime)) {
if (posicoes.Count > 1 && rotacoes.Count > 1) {
reverseTime = true;
if (componentRig) {
componentRig.useGravity = false;
}
}
}
if (Input.GetKeyUp (teclaReverseTime)) {
reverseTime = false;
if (componentRig) {
componentRig.useGravity = true;
//explicar
componentRig.velocity = rbVelocity[rbVelocity.Count - 1];
componentRig.angularVelocity = rbAngularVelocity[rbAngularVelocity.Count - 1];
}
}
if (!fixedUpdate_50Hz) {
cronometro += Time.deltaTime;
if (cronometro >= freq) {
cronometro = 0;
ChecarReverseTime ();
}
}
if (reverseTime) {
transform.position = Vector3.Lerp (transform.position, posicoes [posicoes.Count - 1], Time.deltaTime * 5.0f);
transform.rotation = Quaternion.Lerp (transform.rotation, rotacoes [rotacoes.Count - 1], Time.deltaTime * 5.0f);
}
}
void FixedUpdate(){
if (fixedUpdate_50Hz) {
ChecarReverseTime ();
}
if (componentRig) {
if (reverseTime) {
componentRig.velocity = Vector3.zero;
componentRig.angularVelocity = Vector3.zero;
}
}
}
void ChecarReverseTime(){
if (!reverseTime) {
posicoes.Add (transform.position);
rotacoes.Add (transform.rotation);
//
if (componentRig) {
rbVelocity.Add (componentRig.velocity);
rbAngularVelocity.Add (componentRig.angularVelocity);
}
//
if (posicoes.Count > maxFrames) {
posicoes.Remove (posicoes [0]);
rotacoes.Remove (rotacoes [0]);
if (componentRig) {
rbVelocity.Remove (rbVelocity [0]);
rbAngularVelocity.Remove (rbAngularVelocity [0]);
}
}
} else {
if (posicoes.Count > 1) {
posicoes.Remove (posicoes [posicoes.Count - 1]);
rotacoes.Remove (rotacoes [rotacoes.Count - 1]);
if (componentRig) {
rbVelocity.Remove (rbVelocity [rbVelocity.Count - 1]);
rbAngularVelocity.Remove (rbAngularVelocity [rbAngularVelocity.Count - 1]);
}
}
}
}
}
Última edição por MarcosSchultz em Sáb Jul 07, 2018 1:02 am, editado 1 vez(es)
Re: [TUTORIAL] Sistema simples para VOLTAR NO TEMPO, Unity 3D
É triste não entender a 100% da compilação do código(ainda estou estudando a Unity e suas aplicações C#) mas pelo que me parece é bem complexo o código, você o acha viável para utilização do mesmo em projetos 2D? Sinceramente me fascina já ver você fazendo o Unity voltar o tempo, muito bom mesmo cara .
Última edição por Tegh em Sex Mar 29, 2019 2:47 pm, editado 1 vez(es) (Motivo da edição : Erros Ortográficos)
Tegh- Avançado
- PONTOS : 2653
REPUTAÇÃO : 97
Idade : 23
Respeito as regras :
Re: [TUTORIAL] Sistema simples para VOLTAR NO TEMPO, Unity 3D
Muito bom, agora é só modificar, modificar até entender, para algum dia reproduzir
rafaelllsd- ProgramadorMaster
- PONTOS : 5241
REPUTAÇÃO : 507
Idade : 24
Áreas de atuação : Unity, Audacity, Blender, Gimp, C#, JS, MySQL.
Respeito as regras :
Re: [TUTORIAL] Sistema simples para VOLTAR NO TEMPO, Unity 3D
Código atualizado e corrigido
Vídeo upado :D
Vídeo upado :D
Re: [TUTORIAL] Sistema simples para VOLTAR NO TEMPO, Unity 3D
Marcos ve se estou enganado voce colocou vetor e mandou ele voltar por eles?
Chilinger- MembroAvançado
- PONTOS : 4091
REPUTAÇÃO : 42
Idade : 30
Respeito as regras :
Re: [TUTORIAL] Sistema simples para VOLTAR NO TEMPO, Unity 3D
Chilinger escreveu:Marcos ve se estou enganado voce colocou vetor e mandou ele voltar por eles?
Exato... eu fiz uma lista de vetores e guardei o valor de posição, rotação, etc a cada frame...
Quando eu volto no tempo, eu apenas sigo a lista do final para o início e vou deletando os pontos que eu já retornei.
Re: [TUTORIAL] Sistema simples para VOLTAR NO TEMPO, Unity 3D
Perguntei pois me lembrou do código de troca de camera que voce tinha feito ai olhei o código e esta bem na cara show não tinha pensado nisso.MarcosSchultz escreveu:Chilinger escreveu:Marcos ve se estou enganado voce colocou vetor e mandou ele voltar por eles?
Exato... eu fiz uma lista de vetores e guardei o valor de posição, rotação, etc a cada frame...
Quando eu volto no tempo, eu apenas sigo a lista do final para o início e vou deletando os pontos que eu já retornei.
Chilinger- MembroAvançado
- PONTOS : 4091
REPUTAÇÃO : 42
Idade : 30
Respeito as regras :
Re: [TUTORIAL] Sistema simples para VOLTAR NO TEMPO, Unity 3D
Ao assistir este tutorial, fiquei na dúvida em como por exemplo usar ele para repetir os movimentos do player, no lugar de retroceder. Tentei fazer algumas adaptações, porém não tive resultados satisfatórios.
Alguém já tentou fazer isso.
Alguns jogos usam este sistema, como jogos de corrida com o "corredor fantasma" Super Meat Boy com uma sombra repetindo todos os movimentos do player, etc.
Alguém já tentou fazer isso.
Alguns jogos usam este sistema, como jogos de corrida com o "corredor fantasma" Super Meat Boy com uma sombra repetindo todos os movimentos do player, etc.
Re: [TUTORIAL] Sistema simples para VOLTAR NO TEMPO, Unity 3D
guimaraf escreveu:Ao assistir este tutorial, fiquei na dúvida em como por exemplo usar ele para repetir os movimentos do player, no lugar de retroceder. Tentei fazer algumas adaptações, porém não tive resultados satisfatórios.
Alguém já tentou fazer isso.
Alguns jogos usam este sistema, como jogos de corrida com o "corredor fantasma" Super Meat Boy com uma sombra repetindo todos os movimentos do player, etc.
Para retroceder o movimento no player é necessário fazer algumas adaptações para fazer o seu jogador não receber nenhum input enquanto está retrocedendo.
Por exemplo, se o seu jogador recebe um rigidbody.velocity = new vector3(0,input y, 0) no fixed Update, vai dar conflito com o código de retroceder no tempo, então uma adaptação precisa ser feita para fazer o jogador não receber inputs ou velocidades quando está a retroceder.
Re: [TUTORIAL] Sistema simples para VOLTAR NO TEMPO, Unity 3D
MarcosSchultz escreveu:guimaraf escreveu:Ao assistir este tutorial, fiquei na dúvida em como por exemplo usar ele para repetir os movimentos do player, no lugar de retroceder. Tentei fazer algumas adaptações, porém não tive resultados satisfatórios.
Alguém já tentou fazer isso.
Alguns jogos usam este sistema, como jogos de corrida com o "corredor fantasma" Super Meat Boy com uma sombra repetindo todos os movimentos do player, etc.
Para retroceder o movimento no player é necessário fazer algumas adaptações para fazer o seu jogador não receber nenhum input enquanto está retrocedendo.
Por exemplo, se o seu jogador recebe um rigidbody.velocity = new vector3(0,input y, 0) no fixed Update, vai dar conflito com o código de retroceder no tempo, então uma adaptação precisa ser feita para fazer o jogador não receber inputs ou velocidades quando está a retroceder.
Eu fiz de uma forma um pouco diferente, já que é um fantasma, o natural é que ele não receba parâmetros de gravidade, então eu salvei a posição e rotação do carro, depois para reproduzir, eu clonei o carro, alterei os materiais para transparentes e mandei ler as listas "tem mais algumas maracutaias que tive que fazer", mas o miolo é este e deu certo.
Re: [TUTORIAL] Sistema simples para VOLTAR NO TEMPO, Unity 3D
Poderia fazer um tutorial sobre e um video mostrando como esta.guimaraf escreveu:MarcosSchultz escreveu:guimaraf escreveu:Ao assistir este tutorial, fiquei na dúvida em como por exemplo usar ele para repetir os movimentos do player, no lugar de retroceder. Tentei fazer algumas adaptações, porém não tive resultados satisfatórios.
Alguém já tentou fazer isso.
Alguns jogos usam este sistema, como jogos de corrida com o "corredor fantasma" Super Meat Boy com uma sombra repetindo todos os movimentos do player, etc.
Para retroceder o movimento no player é necessário fazer algumas adaptações para fazer o seu jogador não receber nenhum input enquanto está retrocedendo.
Por exemplo, se o seu jogador recebe um rigidbody.velocity = new vector3(0,input y, 0) no fixed Update, vai dar conflito com o código de retroceder no tempo, então uma adaptação precisa ser feita para fazer o jogador não receber inputs ou velocidades quando está a retroceder.
Eu fiz de uma forma um pouco diferente, já que é um fantasma, o natural é que ele não receba parâmetros de gravidade, então eu salvei a posição e rotação do carro, depois para reproduzir, eu clonei o carro, alterei os materiais para transparentes e mandei ler as listas "tem mais algumas maracutaias que tive que fazer", mas o miolo é este e deu certo.
Chilinger- MembroAvançado
- PONTOS : 4091
REPUTAÇÃO : 42
Idade : 30
Respeito as regras :
Re: [TUTORIAL] Sistema simples para VOLTAR NO TEMPO, Unity 3D
Para fazer aquele velho slow mousho do need for speed que quando viramos em uma curva muito rápido voce consegui ir nela bem devagar.MarcosSchultz escreveu:guimaraf escreveu:Ao assistir este tutorial, fiquei na dúvida em como por exemplo usar ele para repetir os movimentos do player, no lugar de retroceder. Tentei fazer algumas adaptações, porém não tive resultados satisfatórios.
Alguém já tentou fazer isso.
Alguns jogos usam este sistema, como jogos de corrida com o "corredor fantasma" Super Meat Boy com uma sombra repetindo todos os movimentos do player, etc.
Para retroceder o movimento no player é necessário fazer algumas adaptações para fazer o seu jogador não receber nenhum input enquanto está retrocedendo.
Por exemplo, se o seu jogador recebe um rigidbody.velocity = new vector3(0,input y, 0) no fixed Update, vai dar conflito com o código de retroceder no tempo, então uma adaptação precisa ser feita para fazer o jogador não receber inputs ou velocidades quando está a retroceder.
Chilinger- MembroAvançado
- PONTOS : 4091
REPUTAÇÃO : 42
Idade : 30
Respeito as regras :
Re: [TUTORIAL] Sistema simples para VOLTAR NO TEMPO, Unity 3D
Chilinger escreveu:Para fazer aquele velho slow mousho do need for speed que quando viramos em uma curva muito rápido voce consegui ir nela bem devagar.MarcosSchultz escreveu:guimaraf escreveu:Ao assistir este tutorial, fiquei na dúvida em como por exemplo usar ele para repetir os movimentos do player, no lugar de retroceder. Tentei fazer algumas adaptações, porém não tive resultados satisfatórios.
Alguém já tentou fazer isso.
Alguns jogos usam este sistema, como jogos de corrida com o "corredor fantasma" Super Meat Boy com uma sombra repetindo todos os movimentos do player, etc.
Para retroceder o movimento no player é necessário fazer algumas adaptações para fazer o seu jogador não receber nenhum input enquanto está retrocedendo.
Por exemplo, se o seu jogador recebe um rigidbody.velocity = new vector3(0,input y, 0) no fixed Update, vai dar conflito com o código de retroceder no tempo, então uma adaptação precisa ser feita para fazer o jogador não receber inputs ou velocidades quando está a retroceder.
SlowMotion é só alterar o Time.Timescale do seu jogo, é bem simples.
Re: [TUTORIAL] Sistema simples para VOLTAR NO TEMPO, Unity 3D
Mas não fica pesado salvar tantas posições/rotações?guimaraf escreveu:
Eu fiz de uma forma um pouco diferente, já que é um fantasma, o natural é que ele não receba parâmetros de gravidade, então eu salvei a posição e rotação do carro, depois para reproduzir, eu clonei o carro, alterei os materiais para transparentes e mandei ler as listas "tem mais algumas maracutaias que tive que fazer", mas o miolo é este e deu certo.
Eu pensei em algo assim, mas salvava de tempos em tempos, depois eu só interpolava as posições/rotações usando o mesmo intervalo de tempo da captura.
As interpolações eram feitas com base numa curva de bezier quadrática, mais ou menos assim:
Pode parecer que o objeto vai ficar muito fora da trajetória original, mas na prática ficava quase a mesma coisa, só que muito mais suave.
Na época achei que ficaria pesado demais capturar cada posição e desisti antes de tentar ;-;
Lição aprendida, testar sempre.
SteveRogers- Instrutor
- PONTOS : 2672
REPUTAÇÃO : 156
Respeito as regras :
Re: [TUTORIAL] Sistema simples para VOLTAR NO TEMPO, Unity 3D
Tenho o sistema funcionando no vídeo abaixo.
Por enquanto estou sem tempo para gravar um tutorial.
Por enquanto estou sem tempo para gravar um tutorial.
Re: [TUTORIAL] Sistema simples para VOLTAR NO TEMPO, Unity 3D
SteveRogers escreveu:Mas não fica pesado salvar tantas posições/rotações?guimaraf escreveu:
Eu fiz de uma forma um pouco diferente, já que é um fantasma, o natural é que ele não receba parâmetros de gravidade, então eu salvei a posição e rotação do carro, depois para reproduzir, eu clonei o carro, alterei os materiais para transparentes e mandei ler as listas "tem mais algumas maracutaias que tive que fazer", mas o miolo é este e deu certo.
Eu pensei em algo assim, mas salvava de tempos em tempos, depois eu só interpolava as posições/rotações usando o mesmo intervalo de tempo da captura.
As interpolações eram feitas com base numa curva de bezier quadrática, mais ou menos assim:
Pode parecer que o objeto vai ficar muito fora da trajetória original, mas na prática ficava quase a mesma coisa, só que muito mais suave.
Na época achei que ficaria pesado demais capturar cada posição e desisti antes de tentar ;-;
Lição aprendida, testar sempre.
Eu tentei bastante fazer um sistema assim, porém o carro ficava "travando aos poucos" não era nada natural.
Então para resolver este problema eu fiz diferente, no lugar de gravar toda a corrida, eu gravo apenas a volta, então a array fica normalmente menos de 2k de tamanho. Já testei em um not e ficou bem agradável.
Re: [TUTORIAL] Sistema simples para VOLTAR NO TEMPO, Unity 3D
Esse é o ponto, não se usa a posição diretamente, pra não travar, o transform recebe um smoothdamp entre a posição atual e o próximo ponto interpolado.
SteveRogers- Instrutor
- PONTOS : 2672
REPUTAÇÃO : 156
Respeito as regras :
Re: [TUTORIAL] Sistema simples para VOLTAR NO TEMPO, Unity 3D
O problema de fazer a interpolação em pontos distantes é que perde bastante precisão dependendo do caso.... é útil caso você queira voltar no tempo uns 3 min, fazer um sistema de replay.... mas se quiser ter um sistema que volta no tempo de maneira fiel, é melhor fazer no fixedUpdate ponto a ponto e guardar apenas 10 segundos... ai sobrecarrega o código.
Re: [TUTORIAL] Sistema simples para VOLTAR NO TEMPO, Unity 3D
Entendo, realmente a aplicação desse sistema com interpolação era pra Ghost mode em um joguinho de corrida, as distâncias não eram muito grandes, pois ao invés de salvar cada frame, salvava a cada 100ms ~200ms dependendo do quão complexo era o circuito, fora que o movimento é bem linear... é que o assunto fugiu do tópico mesmo huauahua, não tem muito a ver com voltar no tempo.MarcosSchultz escreveu:O problema de fazer a interpolação em pontos distantes é que perde bastante precisão dependendo do caso.... é útil caso você queira voltar no tempo uns 3 min, fazer um sistema de replay.... mas se quiser ter um sistema que volta no tempo de maneira fiel, é melhor fazer no fixedUpdate ponto a ponto e guardar apenas 10 segundos... ai sobrecarrega o código.
Guimaraf, vou dar uma olhada no meu limbo de projetos inacabados, pra ver se encontro algo kkk
SteveRogers- Instrutor
- PONTOS : 2672
REPUTAÇÃO : 156
Respeito as regras :
Re: [TUTORIAL] Sistema simples para VOLTAR NO TEMPO, Unity 3D
SteveRogers escreveu:Entendo, realmente a aplicação desse sistema com interpolação era pra Ghost mode em um joguinho de corrida, as distâncias não eram muito grandes, pois ao invés de salvar cada frame, salvava a cada 100ms ~200ms dependendo do quão complexo era o circuito, fora que o movimento é bem linear... é que o assunto fugiu do tópico mesmo huauahua, não tem muito a ver com voltar no tempo.MarcosSchultz escreveu:O problema de fazer a interpolação em pontos distantes é que perde bastante precisão dependendo do caso.... é útil caso você queira voltar no tempo uns 3 min, fazer um sistema de replay.... mas se quiser ter um sistema que volta no tempo de maneira fiel, é melhor fazer no fixedUpdate ponto a ponto e guardar apenas 10 segundos... ai sobrecarrega o código.
Guimaraf, vou dar uma olhada no meu limbo de projetos inacabados, pra ver se encontro algo kkk
Inicialmente era para gravar as 3 voltas, porém como a array ficaria grande demais, eu decidi que iria gravar apenas 1 volta, como as pistas tem tamanhos diferentes, logo a volta se torna maior, porém ainda o arquivo ficou pequeno veja.
Re: [TUTORIAL] Sistema simples para VOLTAR NO TEMPO, Unity 3D
Bom, do projeto só achei os modelos 3D, pra o sistema de interpolação eu utilizei como base esse tutorial, e só adaptei criando uma função que pegava os pontos e criava esse path interpolado.
https://www.habrador.com/tutorials/interpolation/1-catmull-rom-splines/
Tem razão, os arquivos não ficam muito grandes, é que a pessoa aqui tem a mania de pensar demais e acaba complicando as coisas sem necessidade kkk
#Correção, o sistema usa curvas catmull rom ao invés de bézier quadrática, o BQ era de um sistema de waypoints.
Parando de poluir o tópico em 3, 2, 1....
https://www.habrador.com/tutorials/interpolation/1-catmull-rom-splines/
Tem razão, os arquivos não ficam muito grandes, é que a pessoa aqui tem a mania de pensar demais e acaba complicando as coisas sem necessidade kkk
#Correção, o sistema usa curvas catmull rom ao invés de bézier quadrática, o BQ era de um sistema de waypoints.
Parando de poluir o tópico em 3, 2, 1....
Última edição por SteveRogers em Ter Jul 23, 2019 8:52 pm, editado 1 vez(es)
SteveRogers- Instrutor
- PONTOS : 2672
REPUTAÇÃO : 156
Respeito as regras :
Re: [TUTORIAL] Sistema simples para VOLTAR NO TEMPO, Unity 3D
SteveRogers escreveu:Bom, do projeto só achei os modelos 3D, pra o sistema de interpolação eu utilizei como base esse tutorial, e só adaptei criando uma função que pegava os pontos e criava esse path interpolado.
https://www.habrador.com/tutorials/interpolation/1-catmull-rom-splines/
Tem razão, não fica muito grande os arquivos, é que a pessoa aqui tem a mania de pensar demais e acaba complicando as coisas sem necessidade kkk
#Correção, o sistema usa curvas catmull rom ao invés de bézier quadrática, o BQ era de um sistema de waypoints.
Parando de poluir o tópico em 3, 2, 1....
Bem interessante, vou dar uma estudada nestes tutoriais.
Re: [TUTORIAL] Sistema simples para VOLTAR NO TEMPO, Unity 3D
Eu ja estou seguindo seu projeto no face achei muito show de bola.guimaraf escreveu:Tenho o sistema funcionando no vídeo abaixo.
Por enquanto estou sem tempo para gravar um tutorial.
Chilinger- MembroAvançado
- PONTOS : 4091
REPUTAÇÃO : 42
Idade : 30
Respeito as regras :
Re: [TUTORIAL] Sistema simples para VOLTAR NO TEMPO, Unity 3D
Chilinger escreveu:Eu ja estou seguindo seu projeto no face achei muito show de bola.guimaraf escreveu:Tenho o sistema funcionando no vídeo abaixo.
Por enquanto estou sem tempo para gravar um tutorial.
Que bom, sempre estamos postando algo sobre o jogo
Re: [TUTORIAL] Sistema simples para VOLTAR NO TEMPO, Unity 3D
Tenho uma duvida.
No jogo Call of duty multiplayer
quando o jogador morre a camera de que o atacou mostra um pouco antes como isso funciona?
No jogo Call of duty multiplayer
quando o jogador morre a camera de que o atacou mostra um pouco antes como isso funciona?
Chilinger- MembroAvançado
- PONTOS : 4091
REPUTAÇÃO : 42
Idade : 30
Respeito as regras :
Tópicos semelhantes
» [TUTORIAL] Sistema simples de SEMÁFORO (sinaleira), com tempo entre fases, escolha da fase inicial e troca de cor dos materiais
» [TUTORIAL] Sistema simples para lançar objetos.
» [TUTORIAL] Movimento simples para objetos filiados ao FPSController da Unity por código.
» [TUTORIAL] Sistema simples de Cutscenes
» [TUTORIAL] Sistema Simples de Falas
» [TUTORIAL] Sistema simples para lançar objetos.
» [TUTORIAL] Movimento simples para objetos filiados ao FPSController da Unity por código.
» [TUTORIAL] Sistema simples de Cutscenes
» [TUTORIAL] Sistema Simples de Falas
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos