Histórico de Input
+3
MarcosSchultz
luiz12345
NKKF
7 participantes
Página 1 de 1
Histórico de Input
Oi pessoal.
Eu queria fazer com que meu jogador tivesse um "histórico de inputs", porque ele se move à cada 1 clique no WASD e ele faz uma animação que demora uns 0.8 segundos, então se o usuário apertar bem rápido ele esquece alguns movimentos que deveria ter feito (Já que o usuário clicou, por isso o histórico seria necessário).. Alguém tem alguma ideia de como fazer isso?
Eu queria fazer com que meu jogador tivesse um "histórico de inputs", porque ele se move à cada 1 clique no WASD e ele faz uma animação que demora uns 0.8 segundos, então se o usuário apertar bem rápido ele esquece alguns movimentos que deveria ter feito (Já que o usuário clicou, por isso o histórico seria necessário).. Alguém tem alguma ideia de como fazer isso?
NKKF- ProgramadorMaster
- PONTOS : 4631
REPUTAÇÃO : 574
Idade : 19
Áreas de atuação : Desenvolvedor na Unity, NodeJS, React, ReactJS, React Native, MongoDB e Firebase.
Respeito as regras :
Re: Histórico de Input
acho que você poderia utilizar o Debug.Log(); marcar qual botão foi apertado nele e depois coloca uma data em minuto e segundo.
Ficaria algo assim:
Debug.log("Apertou W " + System.DateTime.Now.Minute + System.DateTime.Now.Second);
Tente ver se eu n errei nada, pode ter alguma letra maiúscula ou minúscula errada ai.
também você poderia resolver esse problema colocando uma float para dar um tempo de espera, ai quando uma animação estiver ocorrendo ele não pode mais se locomover.
ex:
cria 2 float, uma um tempo, outra um tempo máximo.
cria uma void que pede um tempo máximo, e seta a sua variável tempo máximo para ela e deixa a variável do tempo em 0.
chame esta void nos input de deie +/- o tempo que demroa para executar a animação.
ficaria algo assim:
public float Tempo;
public float TempoMaximo;
void update(){
if(Tempo >= TempoMaximo){
if(Input.getkeydown(Keycode.W){
AnimExecution(0.8f);
}else{
Tempo += 1 * Time.deltaTime;
}
}
void AnimExecution(float MaxTime){
TempoMaximo = MaxTime;
Tempo = 0;
}
(algumas letras maiúsculas e minúsculas devem estar faltando)
só uma ideia de como fazer este sistema de espera, assim basicamente ele não executará uma nova animação se uma já estiver sendo executada, e neste sistema da para colocar animações que possuem o tempo diferentes umas das outras.
Ficaria algo assim:
Debug.log("Apertou W " + System.DateTime.Now.Minute + System.DateTime.Now.Second);
Tente ver se eu n errei nada, pode ter alguma letra maiúscula ou minúscula errada ai.
também você poderia resolver esse problema colocando uma float para dar um tempo de espera, ai quando uma animação estiver ocorrendo ele não pode mais se locomover.
ex:
cria 2 float, uma um tempo, outra um tempo máximo.
cria uma void que pede um tempo máximo, e seta a sua variável tempo máximo para ela e deixa a variável do tempo em 0.
chame esta void nos input de deie +/- o tempo que demroa para executar a animação.
ficaria algo assim:
public float Tempo;
public float TempoMaximo;
void update(){
if(Tempo >= TempoMaximo){
if(Input.getkeydown(Keycode.W){
AnimExecution(0.8f);
}else{
Tempo += 1 * Time.deltaTime;
}
}
void AnimExecution(float MaxTime){
TempoMaximo = MaxTime;
Tempo = 0;
}
(algumas letras maiúsculas e minúsculas devem estar faltando)
só uma ideia de como fazer este sistema de espera, assim basicamente ele não executará uma nova animação se uma já estiver sendo executada, e neste sistema da para colocar animações que possuem o tempo diferentes umas das outras.
Re: Histórico de Input
public float Tempo;
public float TempoMaximo;
void update(){
if(Tempo >= TempoMaximo){
if(Input.getkeydown(Keycode.W){
AnimExecution(0.8f);
}
}else{
Tempo += 1 * Time.deltaTime;
}
}
void AnimExecution(float MaxTime){
TempoMaximo = MaxTime;
Tempo = 0;
}
ops.. esqueci um " } " ;-;
public float TempoMaximo;
void update(){
if(Tempo >= TempoMaximo){
if(Input.getkeydown(Keycode.W){
AnimExecution(0.8f);
}
}else{
Tempo += 1 * Time.deltaTime;
}
}
void AnimExecution(float MaxTime){
TempoMaximo = MaxTime;
Tempo = 0;
}
ops.. esqueci um " } " ;-;
Re: Histórico de Input
Mas é exatamente o contrário que eu quero fazer: Eu quero que sim, ele siga o que o usuário fez enquanto o "robô" fazia a animação dele.
NKKF- ProgramadorMaster
- PONTOS : 4631
REPUTAÇÃO : 574
Idade : 19
Áreas de atuação : Desenvolvedor na Unity, NodeJS, React, ReactJS, React Native, MongoDB e Firebase.
Respeito as regras :
Re: Histórico de Input
A parte de armazenamento dos dados da pra fazer com list:
Basta adicionar os inputs nas listas toda vez que alguma 'anyKey' for pressionada
Basta adicionar os inputs nas listas toda vez que alguma 'anyKey' for pressionada
Re: Histórico de Input
Aproveitando o tópico: como eu faço para que uma tecla se sobreponha à outra? Tipo: eu clico A e B, só que o A eu cliquei primeiro, mas se for em if, ele sempre executará o primeiro IF. Exemplo:
Não importa se eu clico primeiro o A, ele sempre executa o B, ignorando o A.
O que eu quero é que o A se sobreponha apenas por eu ter clicado primeiro nele. Mas o mesmo aconteceria caso eu clicasse no B primeiro.
- Código:
if (B)
jsfjiejf;
else if (A)
igkjrgijk;
Não importa se eu clico primeiro o A, ele sempre executa o B, ignorando o A.
O que eu quero é que o A se sobreponha apenas por eu ter clicado primeiro nele. Mas o mesmo aconteceria caso eu clicasse no B primeiro.
NKKF- ProgramadorMaster
- PONTOS : 4631
REPUTAÇÃO : 574
Idade : 19
Áreas de atuação : Desenvolvedor na Unity, NodeJS, React, ReactJS, React Native, MongoDB e Firebase.
Respeito as regras :
Re: Histórico de Input
acho que entendi, tente algo parecido com isto:
public string Prioridade = "Nenhuma";
if(Prioridade == "Nenhuma"){
if(input.getkeydown(A)){ // utilize o getkeydown.
Prioridade = "A";
Return;
}
if(input.getkeydown(B)){
Prioridade = "B";
Return;
}
}
if(Prioridade == "A"){
a coisa que vc quer executar;
if(Input.getkeyup(A){
Prioridade = "Nenhuma";
return;//isto talvez nem seja necessario
}
}
if(Prioridade == "B"){
a coisa que vc quer executar;
if(Input.getkeyup(B){
Prioridade = "Nenhuma";
Return;
}
}
//acho que vc entendeu a ideia
este código seta uma string para a primeira tecla clicada, depois é impossível setar esta string ate ela ser des-clicada, com isto é possível checar um clique por vez.
acho que era isso que você queria desculpe se eu n tiver entendido.
public string Prioridade = "Nenhuma";
if(Prioridade == "Nenhuma"){
if(input.getkeydown(A)){ // utilize o getkeydown.
Prioridade = "A";
Return;
}
if(input.getkeydown(B)){
Prioridade = "B";
Return;
}
}
if(Prioridade == "A"){
a coisa que vc quer executar;
if(Input.getkeyup(A){
Prioridade = "Nenhuma";
return;//isto talvez nem seja necessario
}
}
if(Prioridade == "B"){
a coisa que vc quer executar;
if(Input.getkeyup(B){
Prioridade = "Nenhuma";
Return;
}
}
//acho que vc entendeu a ideia
este código seta uma string para a primeira tecla clicada, depois é impossível setar esta string ate ela ser des-clicada, com isto é possível checar um clique por vez.
acho que era isso que você queria desculpe se eu n tiver entendido.
Re: Histórico de Input
Vamos lá, se entendi bem, você quer poder clicar em várias teclas, e quer que cada ação seja executada na ordem que você apertou, não importa quantas ações ou quanto tempo leve.
Tentei implementar usando List como o @MarcosSchultz recomendou, como eu ainda tô começando na programação, pode haver algo mal otimizado, então aceito sugestões de melhora :3
Basicamente tenho 4 ações (A,B,C,D) que são chamadas respectivamente pelas teclas de seta (Pra cima, pra baixo, direita, esquerda).
Se você apertar mais de uma ação, ela vai aguardar a atual ser executada e só então irá pra próxima...
Achei que seria legal poder personalizar o tempo de cada ação, então se você quiser, basta alterar dentro de cada método "ExecutarAção"
Boooa Noiteee!
#edit
Depois que postei percebi que o tempo permanece o mesmo se houver mais de uma ação a ser executada, Segue abaixo as correções:
Tentei implementar usando List como o @MarcosSchultz recomendou, como eu ainda tô começando na programação, pode haver algo mal otimizado, então aceito sugestões de melhora :3
- Código Antigo:
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class HistoricoInputs : MonoBehaviour
{
private List<char> historico;
private bool trava = false;
private float tempo = 0;
private void Start()
{
historico = new List<char>();
}
void Update()
{
if (Input.GetKeyDown(KeyCode.UpArrow))
{
AdicionarHistorico('A');
if (trava == false)
StartCoroutine(Espera());
}
if (Input.GetKeyDown(KeyCode.DownArrow))
{
AdicionarHistorico('B');
if (trava == false)
StartCoroutine(Espera());
}
if (Input.GetKeyDown(KeyCode.RightArrow))
{
AdicionarHistorico('C');
if (trava == false)
StartCoroutine(Espera());
}
if (Input.GetKeyDown(KeyCode.LeftArrow))
{
AdicionarHistorico('D');
if (trava == false)
StartCoroutine(Espera());
}
}
private void AdicionarHistorico(char indexAcao)
{
historico.Add(indexAcao);
}
private void ExecutarAcaoA()
{
tempo = 2;
//Ação A
}
private void ExecutarAcaoB()
{
tempo = 3;
//Ação B
}
private void ExecutarAcaoC()
{
tempo = 4;
//Ação C
}
private void ExecutarAcaoD()
{
tempo = 5;
//Ação D
}
IEnumerator Espera()
{
trava = true;
print("Executando Acao " + historico[0] + "...");
switch (historico[0])
{
case 'A':
ExecutarAcaoA();
break;
case 'B':
ExecutarAcaoB();
break;
case 'C':
ExecutarAcaoC();
break;
case 'D':
ExecutarAcaoD();
break;
default:
break;
}
yield return new WaitForSeconds(tempo);
print("Acao " + historico[0] + " concluida!\n\n");
historico.RemoveAt(0);
if (historico.Count > 0)
{
StartCoroutine(Espera());
}
else
{
trava = false;
}
}
}
Basicamente tenho 4 ações (A,B,C,D) que são chamadas respectivamente pelas teclas de seta (Pra cima, pra baixo, direita, esquerda).
Se você apertar mais de uma ação, ela vai aguardar a atual ser executada e só então irá pra próxima...
Achei que seria legal poder personalizar o tempo de cada ação, então se você quiser, basta alterar dentro de cada método "ExecutarAção"
Boooa Noiteee!
#edit
Depois que postei percebi que o tempo permanece o mesmo se houver mais de uma ação a ser executada, Segue abaixo as correções:
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class HistoricoInputs : MonoBehaviour
{
private List<char> historico = new List<char>();
private bool trava = false;
private float tempo = 0;
private float tempoA = 2, tempoB = 3, tempoC = 4, tempoD = 5;
void Update()
{
if (Input.GetKeyDown(KeyCode.UpArrow))
AdicionarHistorico('A');
if (Input.GetKeyDown(KeyCode.DownArrow))
AdicionarHistorico('B');
if (Input.GetKeyDown(KeyCode.RightArrow))
AdicionarHistorico('C');
if (Input.GetKeyDown(KeyCode.LeftArrow))
AdicionarHistorico('D');
}
private void AdicionarHistorico(char acao)
{
historico.Add(acao);
if (trava == false)
StartCoroutine(ExecutarAcao());
}
private void AcaoA()
{
//Ação A
}
private void AcaoB()
{
//Ação B
}
private void AcaoC()
{
//Ação C
}
private void AcaoD()
{
//Ação D
}
IEnumerator ExecutarAcao()
{
trava = true;
print("Executando Acao "+historico[0]+"...");
if (historico[0] == 'A') {
AcaoA();
tempo = tempoA;
}
else if (historico[0] == 'B') {
AcaoB();
tempo = tempoB;
}
else if (historico[0] == 'C') {
AcaoC();
tempo = tempoC;
}
else if (historico[0] == 'D') {
AcaoD();
tempo = tempoD;
}
yield return new WaitForSeconds(tempo);
print("Acao "+ historico[0] +" concluida!");
historico.RemoveAt(0);
if (historico.Count > 0)
StartCoroutine(ExecutarAcao());
else
trava = false;
}
}
Última edição por Isabela em Dom Mar 31, 2019 11:58 am, editado 5 vez(es)
Isabela- Avançado
- PONTOS : 2648
REPUTAÇÃO : 260
Idade : 24
Respeito as regras :
Re: Histórico de Input
- Spoiler:
- Isabela escreveu:Vamos lá, se entendi bem, você quer poder clicar em várias teclas, e quer que cada ação seja executada na ordem que você apertou, não importa quantas ações ou quanto tempo leve.
Tentei implementar usando List como o @MarcosSchultz recomendou, como eu ainda tô começando na programação, pode haver algo mal otimizado, então aceito sugestões de melhora :3- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class HistoricoInputs : MonoBehaviour
{
private List<char> historico;
private bool trava = false;
private float tempo = 0;
private void Start()
{
historico = new List<char>();
}
void Update()
{
if (Input.GetKeyDown(KeyCode.UpArrow))
{
AdicionarHistorico('A');
if (trava == false)
StartCoroutine(Espera());
}
if (Input.GetKeyDown(KeyCode.DownArrow))
{
AdicionarHistorico('B');
if (trava == false)
StartCoroutine(Espera());
}
if (Input.GetKeyDown(KeyCode.RightArrow))
{
AdicionarHistorico('C');
if (trava == false)
StartCoroutine(Espera());
}
if (Input.GetKeyDown(KeyCode.LeftArrow))
{
AdicionarHistorico('D');
if (trava == false)
StartCoroutine(Espera());
}
}
private void AdicionarHistorico(char indexAcao)
{
historico.Add(indexAcao);
}
private void ExecutarAcaoA()
{
tempo = 2;
//Ação A
}
private void ExecutarAcaoB()
{
tempo = 3;
//Ação B
}
private void ExecutarAcaoC()
{
tempo = 4;
//Ação C
}
private void ExecutarAcaoD()
{
tempo = 5;
//Ação D
}
IEnumerator Espera()
{
trava = true;
print("Executando Acao "+historico[0]+"...");
switch (historico[0])
{
case 'A':
ExecutarAcaoA();
break;
case 'B':
ExecutarAcaoB();
break;
case 'C':
ExecutarAcaoC();
break;
case 'D':
ExecutarAcaoD();
break;
default:
break;
}
yield return new WaitForSeconds(tempo);
print("Acao "+ historico[0] +" concluida!\n\n");
historico.RemoveAt(0);
if (historico.Count > 0)
{
StartCoroutine(Espera());
}
else
{
trava = false;
}
}
}
Basicamente tenho 4 ações (A,B,C,D) que são chamadas respectivamente pelas teclas de seta (Pra cima, pra baixo, direita, esquerda).
Se você apertar mais de uma ação, ela vai aguardar a atual ser executada e só então irá pra próxima...
Achei que seria legal poder personalizar o tempo de cada ação, então se você quiser, basta alterar dentro de cada método "ExecutarAção"
:cheers:Boooa Noiteee!
Já To Salvando Esse Script, Pois Assim Que Comecei Na Unity Eu Precisava De Algo Parecido.
Magnatah- Instrutor
- PONTOS : 3357
REPUTAÇÃO : 208
Idade : 24
Áreas de atuação : Dєรєиvσlvєdσя Wєb(Fяσит-єиd), Blєиdєя, υиiтy, C#, ρнρ є Jαvαรcяiρт.
Respeito as regras :
Re: Histórico de Input
Pode armazenar os botões clicados em uma List, como é o caso que o Marcos disse, e usar o Linq para verificar se ele foi clicado, e se calhar, usar um timer para remover ele da lista para poder repetir o processo novamente.NKKF escreveu:Oi pessoal.
Eu queria fazer com que meu jogador tivesse um "histórico de inputs", porque ele se move à cada 1 clique no WASD e ele faz uma animação que demora uns 0.8 segundos, então se o usuário apertar bem rápido ele esquece alguns movimentos que deveria ter feito (Já que o usuário clicou, por isso o histórico seria necessário).. Alguém tem alguma ideia de como fazer isso?
Re: Histórico de Input
Fiz algo aqui bem simples!
- Código:
//animator
public Animator animator;
//historico de botoes precionados
Queue<KeyCode> m_HistoryInputs = new Queue<KeyCode>();
//tabela de consulta de ações já previamente registradas
private Dictionary<KeyCode, Action> m_LookupTable = new Dictionary<KeyCode, Action>();
//proxima acão
private bool m_Next;
private void Start()
{
//adicionado ações para cada chave
//a chave é o KeyCode(botão) precionado
m_LookupTable.Add(KeyCode.W, delegate { print("W"); animator.SetTrigger("teste"); });
m_LookupTable.Add(KeyCode.A, delegate { print("A"); animator.SetTrigger("teste"); });
m_LookupTable.Add(KeyCode.S, delegate { print("S"); animator.SetTrigger("teste"); });
m_LookupTable.Add(KeyCode.D, delegate { print("D"); animator.SetTrigger("teste"); });
m_Next = true;
}
private void Update()
{
//verificando sé existe ações na fila é sé pode executar a ação
if (m_HistoryInputs.Any() && m_Next)
{
//remove o indice 0 do historico
//setando o indice 0 em current
KeyCode current = m_HistoryInputs.Dequeue();
//verificando sé existe esse botão na tabela
if (m_LookupTable.ContainsKey(current))
{
//verificando sé a ação não é nula
if (m_LookupTable[current] != null)
//executando a ação
m_LookupTable[current].Invoke();
//esperar a animação acabar
StartCoroutine(OnCompleteAnimation());
}
}
}
/// <summary>
/// Setar m_Next = true quando a animação atual acabar
/// </summary>
/// <returns>WaitForSeconds</returns>
IEnumerator OnCompleteAnimation()
{
//proxima ação
m_Next = false;
if (animator != null)
{
//esperar o tempo da animação atual!
yield return new WaitForSeconds(animator.GetCurrentAnimatorStateInfo(0).length);
//proxima ação
m_Next = true;
}
else
//proxima ação
m_Next = true;
}
void OnGUI()
{
//verificando sé o botão precionadado e do teclado e se é KeyDown
if (Event.current.isKey && Event.current.type == EventType.KeyDown)
{
//pegando o botão precionado
KeyCode current = Event.current.keyCode;
//verificando sé existe esse botão na tabela
if (m_LookupTable.ContainsKey(current))
//adicionado o botão na fila
m_HistoryInputs.Enqueue(current);
}
}
Weslley- Moderador
- PONTOS : 5540
REPUTAÇÃO : 744
Idade : 26
Áreas de atuação : Inversión, Desarrollo, Juegos e Web
Respeito as regras :
Re: Histórico de Input
Opa, tudo bem? Então, quando eu disse animação, não é o Animator que a própria unity usa, o meu objeto só faz uma simples rotação (O que eu chamo de rotação, eu acho, que é assim que diz, né?). E então, como eu faço desse jetio?
Valeu pelas respostas pessoal, e desculpe-me pela má explicação..
Valeu pelas respostas pessoal, e desculpe-me pela má explicação..
NKKF- ProgramadorMaster
- PONTOS : 4631
REPUTAÇÃO : 574
Idade : 19
Áreas de atuação : Desenvolvedor na Unity, NodeJS, React, ReactJS, React Native, MongoDB e Firebase.
Respeito as regras :
Tópicos semelhantes
» Ajuda com tabela de historico de pontuaçao.
» Input Get Key
» Input Mouse
» Input Text
» Problemas de input
» Input Get Key
» Input Mouse
» Input Text
» Problemas de input
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos