[RESOLVIDO] Utilizar o Range
2 participantes
SchultzGames :: UNITY 3D :: Resolvidos
Página 1 de 1
[RESOLVIDO] Utilizar o Range
Estou com problemas no meu código, ele deveria ler todas as linhas escritas em um .txt, e depois guardar cada uma em uma variável da lista, isso seria para fazer um sistema de cartas, onde haveriam varias cartas espalhadas pelo cenário e o jogador poderia pegar uma por vez, o conteúdo da mesma sendo o que está em uma das linhas do .txt e não podendo repetir o conteúdo (tipo: tem 3 linhas no .txt, uma escrita "bla", outra "ble" e outra "bli", e as cartas estariam uma em cada canto) porém ele só percorre uma vez o "for", então todas as cartas que crio ficam com o mesmo conteúdo e também aparece um erro na Unity quando um carta abre: "ArgumentOutOfRangeException:Index was out of range Must be non-negative and less than the size of the collection".
Código:
Código:
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using System.IO;
public class AbrirCarta : MonoBehaviour
{
int cartas1;
bool apertou = false;
public Text aviso;
public GameObject panelCartas;
public Text conteudoCartas;
public static bool estaLendo = false;
public float tempo = 5f;
List<string> lista = new List<string>();
void Start()
{
string[] cartasFase1 = File.ReadAllLines("Assets\\Txt\\CartasFase1.txt");
for (int i = 0; i < cartasFase1.Length; i++)
{
lista.Add(cartasFase1[i]);
}
aviso.gameObject.SetActive(false);
panelCartas.SetActive(false);
}
void Update()
{
if (estaLendo)
{
VisaoMouse.mouseOn = true;
tempo -= Time.deltaTime;
Ler();
}
else
{
apertou = false;
VisaoMouse.mouseOn = false;
}
}
public void SairLeitura()
{
estaLendo = false;
}
public void OnTriggerEnter(Collider other)
{
if (other.gameObject.CompareTag("Carta"))
{
aviso.gameObject.SetActive(true);
estaLendo = true;
Destroy(other.gameObject);
}
}
public void Ler()
{
if (Input.GetKey(KeyCode.KeypadEnter) && tempo >= 0f || (Input.GetKey(KeyCode.KeypadEnter)) && tempo >= 0f)
{
apertou = true;
estaLendo = true;
panelCartas.SetActive(true);
cartas1 = Random.Range(0, lista.Count);
conteudoCartas.text = lista[cartas1];
lista.RemoveAt(cartas1);
}
if (tempo <= 0f || apertou)
{
aviso.gameObject.SetActive(false);
tempo = 5f;
}
}
}
Th2y- Membro
- PONTOS : 1769
REPUTAÇÃO : 4
Idade : 23
Áreas de atuação : Programação de jogos digitais
Respeito as regras :
Re: [RESOLVIDO] Utilizar o Range
Obs: já tentei utilizar no Update, porém não funciona, ele não apaga o que está escrito na lista e acaba repetindo o conteúdo, a diferença é que para de aparecer o erro que a Unity falaTh2y escreveu:Estou com problemas no meu código, ele deveria ler todas as linhas escritas em um .txt, e depois guardar cada uma em uma variável da lista, isso seria para fazer um sistema de cartas, onde haveriam varias cartas espalhadas pelo cenário e o jogador poderia pegar uma por vez, o conteúdo da mesma sendo o que está em uma das linhas do .txt e não podendo repetir o conteúdo (tipo: tem 3 linhas no .txt, uma escrita "bla", outra "ble" e outra "bli", e as cartas estariam uma em cada canto) porém ele só percorre uma vez o "for", então todas as cartas que crio ficam com o mesmo conteúdo e também aparece um erro na Unity quando um carta abre: "ArgumentOutOfRangeException:Index was out of range Must be non-negative and less than the size of the collection".
Código:
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using System.IO;
public class AbrirCarta : MonoBehaviour
{
int cartas1;
bool apertou = false;
public Text aviso;
public GameObject panelCartas;
public Text conteudoCartas;
public static bool estaLendo = false;
public float tempo = 5f;
List<string> lista = new List<string>();
void Start()
{
string[] cartasFase1 = File.ReadAllLines("Assets\\Txt\\CartasFase1.txt");
for (int i = 0; i < cartasFase1.Length; i++)
{
lista.Add(cartasFase1[i]);
}
aviso.gameObject.SetActive(false);
panelCartas.SetActive(false);
}
void Update()
{
if (estaLendo)
{
VisaoMouse.mouseOn = true;
tempo -= Time.deltaTime;
Ler();
}
else
{
apertou = false;
VisaoMouse.mouseOn = false;
}
}
public void SairLeitura()
{
estaLendo = false;
}
public void OnTriggerEnter(Collider other)
{
if (other.gameObject.CompareTag("Carta"))
{
aviso.gameObject.SetActive(true);
estaLendo = true;
Destroy(other.gameObject);
}
}
public void Ler()
{
if (Input.GetKey(KeyCode.KeypadEnter) && tempo >= 0f || (Input.GetKey(KeyCode.KeypadEnter)) && tempo >= 0f)
{
apertou = true;
estaLendo = true;
panelCartas.SetActive(true);
cartas1 = Random.Range(0, lista.Count);
conteudoCartas.text = lista[cartas1];
lista.RemoveAt(cartas1);
}
if (tempo <= 0f || apertou)
{
aviso.gameObject.SetActive(false);
tempo = 5f;
}
}
}
Th2y- Membro
- PONTOS : 1769
REPUTAÇÃO : 4
Idade : 23
Áreas de atuação : Programação de jogos digitais
Respeito as regras :
Re: [RESOLVIDO] Utilizar o Range
A lógica está meio confusa, tem Ou(||) comparando a mesma coisa, enfim...
Você usou o GetKey pra iniciar a checagem, como o GetKey continua a ser chamado enquanto a tecla permanecer pressionada, seu código será executado várias vezes até você soltar a tecla, limpando a lista de textos e mostrando apenas o ultimo sorteado, por isso que você acha que não está mudando...
Seu Range está funcionando, o problema é que você não checa primeiro se a quantidade de itens na lista é maior que 0 antes de remover, o que gera o erro que você comentou. E tem esse problema de lógica, que faz o texto mudar muito rápido, removendo os itens e deixando apenas o ultimo sorteado visível no texto da UI.
Você usou o GetKey pra iniciar a checagem, como o GetKey continua a ser chamado enquanto a tecla permanecer pressionada, seu código será executado várias vezes até você soltar a tecla, limpando a lista de textos e mostrando apenas o ultimo sorteado, por isso que você acha que não está mudando...
Seu Range está funcionando, o problema é que você não checa primeiro se a quantidade de itens na lista é maior que 0 antes de remover, o que gera o erro que você comentou. E tem esse problema de lógica, que faz o texto mudar muito rápido, removendo os itens e deixando apenas o ultimo sorteado visível no texto da UI.
Fagner- Moderador
- PONTOS : 4445
REPUTAÇÃO : 667
Áreas de atuação : Modelagem 3D, Programação.
Respeito as regras :
Re: [RESOLVIDO] Utilizar o Range
Muito obrigada, troquei o GetKey pelo GetKeyDown e funcionou (aquela parte repetida também consertei), e adicionei um if antes de removerFagner escreveu:A lógica está meio confusa, tem Ou(||) comparando a mesma coisa, enfim...
Você usou o GetKey pra iniciar a checagem, como o GetKey continua a ser chamado enquanto a tecla permanecer pressionada, seu código será executado várias vezes até você soltar a tecla, limpando a lista de textos e mostrando apenas o ultimo sorteado, por isso que você acha que não está mudando...
Seu Range está funcionando, o problema é que você não checa primeiro se a quantidade de itens na lista é maior que 0 antes de remover, o que gera o erro que você comentou. E tem esse problema de lógica, que faz o texto mudar muito rápido, removendo os itens e deixando apenas o ultimo sorteado visível no texto da UI.
Th2y- Membro
- PONTOS : 1769
REPUTAÇÃO : 4
Idade : 23
Áreas de atuação : Programação de jogos digitais
Respeito as regras :
Tópicos semelhantes
» [RESOLVIDO] IA Array index is out of range
» [RESOLVIDO] int Random.Range(int min, int max) para geração procedural ?
» [RESOLVIDO] Utilizar o mesmo botão para duas ações. (if e else)
» [RESOLVIDO]Utilizar um software que não pode ser usado para fins comerciais
» Salvar Random.Range
» [RESOLVIDO] int Random.Range(int min, int max) para geração procedural ?
» [RESOLVIDO] Utilizar o mesmo botão para duas ações. (if e else)
» [RESOLVIDO]Utilizar um software que não pode ser usado para fins comerciais
» Salvar Random.Range
SchultzGames :: UNITY 3D :: Resolvidos
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos