Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Após reiniciar na tela de Game Over, apenas o Jogador 2 volta a se mover

Olá!

Está acontecendo um bug comigo... Quando fui testar, depois de todo o processo de duplicação dos jogadores e cenários. Tudo funcionando. Mas, caso dê Game Over e eu clico para recomeçar, apenas o Jogador 2 volta a se mover. O Jogador 1 apenas entra na animação "olhando para cima" e solta partículas, mas nao se move nem colide com nada.

Conferi o código e até baixei o projeto da aula mas não consigo encontrar o problema

4 respostas

Oi Leonardo, tudo bom?

Provavelmente no processo de reiniciar o avião vc esqueceu de ativar os componentes de física dele e por isso não está colidindo com nada nem se movendo

Então...Olhei de novo o código, e está tudo certo. O erro continua mesmo baixando o projeto final da aula..

Código do Avião:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Aviao : MonoBehaviour {
    private Rigidbody2D fisica;
    [SerializeField]
    private float forca;
    private Diretor diretor;
    private Vector3 posicaoInicial;
    private bool deveImpulsionar;
    private Animator animacao;



    private void Awake()
    {
        this.posicaoInicial = this.transform.position;
        this.fisica = this.GetComponent<Rigidbody2D>();
        this.animacao = this.GetComponent<Animator>();
    }

    private void Start()
    {
        this.diretor = GameObject.FindObjectOfType<Diretor>();
    }

    private void Update () {
        if (Input.GetButtonDown("Fire1"))
        {
            this.deveImpulsionar = true;
        }
        this.animacao.SetFloat("VelocidadeY", this.fisica.velocity.y);
    }

    private void FixedUpdate()
    {
        if(this.deveImpulsionar)
        {
            this.Impulsionar();
        }

    }

    public void Reiniciar()
    {
        this.transform.position = this.posicaoInicial;
        this.fisica.simulated = true;
    }

    private void Impulsionar()
    {
        this.fisica.velocity = Vector2.zero;
        this.fisica.AddForce(Vector2.up * this.forca, ForceMode2D.Impulse);
        this.deveImpulsionar = false;
    }

    private void OnCollisionEnter2D(Collision2D colisao)
    {
        this.fisica.simulated = false;
        this.diretor.FinalizarJogo();
    }
}

Código do Diretor:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Diretor : MonoBehaviour {

    private Aviao aviao;
    private Pontuacao pontucao;
    private InterfaceGameOver interfaceGameOver;



    private void Start()
    {
        this.aviao = GameObject.FindObjectOfType<Aviao>();
        this.pontucao = GameObject.FindObjectOfType<Pontuacao>();
        this.interfaceGameOver = GameObject.FindObjectOfType<InterfaceGameOver>();

    }

    public void FinalizarJogo()
    {
        Time.timeScale = 0;

        this.pontucao.SalvarRecorde();
        this.interfaceGameOver.MostrarInterface();

    }

    public void ReiniciarJogo()
    {
        this.interfaceGameOver.EsconderInterface();
        Time.timeScale = 1;
        this.aviao.Reiniciar();
        this.DestruirObstaculos();
        this.pontucao.Reiniciar();

    }

    private void DestruirObstaculos()
    {
        Obstaculo[] obstaculos = GameObject.FindObjectsOfType<Obstaculo>();
        foreach(Obstaculo obstaculo in obstaculos)
        {
            obstaculo.Destruir();
        }
    }

}
solução!

O Problema está no código do Diretor. vc está pegando uma única ref de "Aviao" no método Awake do Diretor. Como agora vc tem 2 vc precisa de um array de aviões. Use o método FindObjectsOfType para buscar mais de uma Ref

Funcionou! Obrigado!