Estou tendo problemas na hora que o personagem coleta algum diamante, ao invés de ele coletar de um em um tem vezes que quando ele colide com 1 diamante, na contagem aparece como dois diamantes coletados. Alguma solução mais correta para esse problema?
Esse script aparentemente está certo, o problema não deve ser ai, já checou se não está sendo instanciado mais de um diamante na mesma posição? ou se a posição para instanciar os diamantes não está duplicada?
Printei o script errado. Aqui segue o script de instanciar os diamantes, mas mesmo assim irei checar se em algum lugar estar sendo instanciado mais de um diamante na mesma posição:
Percebi que um aluno enfrentou um problema semelhante ao seu em um post anterior. Eu propus uma solução que deve resolver essa questão. Você pode conferir os detalhes no link abaixo:
Eu até tinha visto a sua solução, mas não entendi como fazer o script corretamente, por isso vim aqui pedir uma solução, não entendi como criar o script que você propôs, poderia me ensinar de formar mais fácil de entender, pois sou principiante no assunto ainda.
Claro! Vou detalhar melhor o processo para você implementar a solução:
1. Criar o Script Diamante
Primeiro, precisamos criar um script que controlará o estado de cada diamante (se já foi coletado ou não).
Criar o Script:
No Unity, vá até a pasta onde deseja armazenar seus scripts (por exemplo, Scripts).
Clique com o botão direito na pasta, selecione Create > C# Script e nomeie-o como Diamante.
Definir a Variável foiColetado:
Abra o script Diamante no seu editor de código preferido.
Substitua o conteúdo pelo seguinte:
using UnityEngine;
public class Diamante : MonoBehaviour
{
public bool foiColetado = false;
}
Observações:
A variável foiColetado será usada para determinar se o diamante já foi coletado, evitando múltiplas contagens.
Não precisamos dos métodos Start e Update, então podemos removê-los ou deixá-los vazios.
2. Anexar o Script ao Prefab do Diamante
Após criar o script Diamante, precisamos anexá-lo ao prefab do diamante para que cada instância do diamante no jogo possua essa funcionalidade.
Selecionar o Prefab:
Na aba de Project, localize o prefab do seu diamante.
Adicionar o Componente:
Selecione o prefab do diamante.
Arraste o script para o inspetor do prefab
3. Atualizar o Script ColetarDiamantes
Agora, vamos modificar o script responsável por coletar os diamantes para que ele utilize a variável foiColetado e evite múltiplas contagens.
Abrir o Script:
Abra o script ColetarDiamantes no seu editor de código.
Modificar o Método OnControllerColliderHit:
Localize o método OnControllerColliderHit e atualize-o conforme abaixo:
void OnControllerColliderHit(ControllerColliderHit other)
{
// Verifica se o objeto colidido tem a tag "Diamante"
if (other.gameObject.CompareTag("Diamante"))
{
// Obtém o componente Diamante do objeto colidido
Diamante diamante = other.gameObject.GetComponent<Diamante>();
// Verifica se o componente foi encontrado e se o diamante ainda não foi coletado
if (diamante != null && !diamante.foiColetado)
{
// Marca o diamante como coletado
diamante.foiColetado = true;
// Incrementa a contagem de diamantes coletados
diamantesColetados += 1;
// Desativa o objeto do diamante para removê-lo da cena
other.gameObject.SetActive(false);
}
}
}
Tente implementar essa mudanças, deve funcionar! Qualquer coisa só avisar também.
Problema resolvido, agora queria entender um pouco sobre este código para fins didáticos. Pois fiquei com dúvidas em algumas coisas como o CompareTag, o other, null, && e a repetição de “Diamante diamante”.