Problema com a coleta dos diamantes no módulo 3

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?

Aqui está o meu script:

2 curtidas

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?

1 curtida

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:

2 curtidas

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:

Espero que isso ajude!

2 curtidas

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.

2 curtidas

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).

  1. 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.
  2. 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.

  1. Selecionar o Prefab:
  • Na aba de Project, localize o prefab do seu diamante.
  1. 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.

  1. Abrir o Script:
  • Abra o script ColetarDiamantes no seu editor de código.
  1. 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.

3 curtidas

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”.

2 curtidas