[RESOLVIDO] Duvidas sobre o Canvas, preFabs e o collisor na Unity
2 participantes
SchultzGames :: UNITY 3D :: Resolvidos
Página 1 de 1
[RESOLVIDO] Duvidas sobre o Canvas, preFabs e o collisor na Unity
Olá Pessoal, estou com uma duvida. Quando o player atingir um colisor ele deve acionar o menu de game over. No script do player declarei uma variavel do tipo GameObject, então pego o objeto lá do canvas e arrasto para o script do player no inspector, funciona de boa. O problema é que não posso deixar o player na cena pois ele vai ser spawnado depois que o osuario escolher em uma lista o player que ele vai usar no jogo, e nessa lista inseri os plyaers que estão como preFabs, mas os preFabs não estão aceitando eu arrastar o game over do canvas e anexar no script no inspector, e se eu transformar o menu de game over em um preFab e arrastar para o script do player no inspector ai ele aceita, porem, o colisor que estar no iscript não funciona, ou seja, o player fica batendo nos objetos e não aciona o game over. Com isso percebi que um preFab que não está em cena, só aceita objetos no script que também seja preFab, mas no meu caso dá esse erro de não funcionar mais o collisor.
acefogo- Avançado
- PONTOS : 1549
REPUTAÇÃO : 9
Respeito as regras :
Re: [RESOLVIDO] Duvidas sobre o Canvas, preFabs e o collisor na Unity
Uma prática bem comum é separar a parte visual da parte lógica, dessa forma o "player" é só um objeto vazio que pode ficar na cena.
o visual é spawnado quando o jogo inicia e vira filho do player(objeto lógico com scripts, colisor, etc).
Isso resolve esse tipo de problema que você está enfrentando. Apesar de existirem outras formas de fazer isso, essa é a mais simples que me vem a cabeça.
o visual é spawnado quando o jogo inicia e vira filho do player(objeto lógico com scripts, colisor, etc).
Isso resolve esse tipo de problema que você está enfrentando. Apesar de existirem outras formas de fazer isso, essa é a mais simples que me vem a cabeça.
Fagner- Moderador
- PONTOS : 4442
REPUTAÇÃO : 667
Áreas de atuação : Modelagem 3D, Programação.
Respeito as regras :
Re: [RESOLVIDO] Duvidas sobre o Canvas, preFabs e o collisor na Unity
Se puder me dar um exemplo de como faz, estou começando agora com a unity e com C#, vou ver se consigo mandar umas imagens. No meu caso eu coloquei um script no player e transformei ele em preFab, e passei o preFab para a lista dataBase onde tenho players diferentes para o usuario escolher, só que o preFab não aceita o objeto GameOver que está no canvas sem antes transformar ele também em preFab, mas isso está anulando o collider que está no script do player.
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
public class BirdClassico : MonoBehaviour
{
public float speed = 1f; // controla a velocidade do passaro
private Rigidbody2D rig; // aqui controla o rigidbody do passaro
public GameObject GameOver;
// Start is called before the first frame update
void Start()
{
rig = GetComponent<Rigidbody2D>(); // aqui pega o componente rigibody do passaro que está com esse script
}
// Update is called once per frame
void Update()
{
if (Input.GetMouseButtonDown(0)) // aqui o codigo checa se o botão esquerdo do mouse foi clicado, o direito seria 1
{
rig.velocity = Vector2.up * speed; // aqui adiciona velocidade no passarinho sempre pra cima
}
}
// Ao inserir o preFab do gameOver pelo inspector aqui nesse script que vai estar no player, essa parte do codigo abaixo não funciona
public void OnCollisionEnter2D(Collision2D col)
{
if (col.gameObject.tag != "Player")
{
GameOver.SetActive(true);
Time.timeScale = 0;
// quando o passarinho bater em alguma coisa com colisãomostra na tela gameOver
}
}
}
acefogo- Avançado
- PONTOS : 1549
REPUTAÇÃO : 9
Respeito as regras :
Re: [RESOLVIDO] Duvidas sobre o Canvas, preFabs e o collisor na Unity
Olha, eu disse que tem outras formas de fazer isso, uma delas é usando um singleton pra guardar a referência da sua tela de game over.
Aí quando tiver a colisão, você chama o painel atraves dele.
Esse código você coloca em um objeto vazio, no campo "painelGameOver" você coloca o painel da UI com a mensagem.
Aí no seu script do player, onde detecta a colisão, você acessa esse script e chama o painel:
Aí quando tiver a colisão, você chama o painel atraves dele.
Esse código você coloca em um objeto vazio, no campo "painelGameOver" você coloca o painel da UI com a mensagem.
- Código:
using UnityEngine;
public class GerenciadorGameOver : MonoBehaviour
{
public static GerenciadorGameOver gameOver;
public GameObject painelGameOver;
private void Awake()
{
if (gameOver == null)
{
gameOver = this;
}
else
{
Destroy(this.gameObject);
}
}
public void MostrarTeladeGameOver()
{
painelGameOver.SetActive(true);
}
}
Aí no seu script do player, onde detecta a colisão, você acessa esse script e chama o painel:
- Código:
public void OnCollisionEnter2D(Collision2D col)
{
if (col.gameObject.tag != "Player")
{
GerenciadorGameOver.gameOver.MostrarTeladeGameOver();
Time.timeScale = 0;
// quando o passarinho bater em alguma coisa com colisãomostra na tela gameOver
}
}
Fagner- Moderador
- PONTOS : 4442
REPUTAÇÃO : 667
Áreas de atuação : Modelagem 3D, Programação.
Respeito as regras :
Re: [RESOLVIDO] Duvidas sobre o Canvas, preFabs e o collisor na Unity
Amigo, deu certinho, funcionou do jeito que eu queria, passei o dia inteiro ontem tentando resolver isso ai e não consegui, e o que você me ensinou ai resolveu. Sou muito grato!
Mas agora surgiu outro problema, pois tenho o painel gameOver que você me ensinou a resolver, e tenho outro painel que é no caso do usuario pausar o jogo. o que está acontecendo é que se o painel do gameOver estiver ativo e eu apertar a tecla "escape" o painel de pause fica ativo junto com o gameOver, aí se o usuario apertar " resume jogo" no painel o jogo ativa novamente mesmo estando já com gameOver. Ai gostaria de saber como impedir a tecla "escape" de ser ativada enquanto o gameOver tiver ativo.
Eu não faço ideia de como impedir de ativar a tecla Escape se o jogo já deu gameOver.
Mas agora surgiu outro problema, pois tenho o painel gameOver que você me ensinou a resolver, e tenho outro painel que é no caso do usuario pausar o jogo. o que está acontecendo é que se o painel do gameOver estiver ativo e eu apertar a tecla "escape" o painel de pause fica ativo junto com o gameOver, aí se o usuario apertar " resume jogo" no painel o jogo ativa novamente mesmo estando já com gameOver. Ai gostaria de saber como impedir a tecla "escape" de ser ativada enquanto o gameOver tiver ativo.
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
public class PauseMenu : MonoBehaviour
{
public static bool GameIsPaused = false;
public GameObject pauseMenuUI;
// Update is called once per frame
void Update()
{
if (Input.GetKeyDown(KeyCode.Escape))
{
if (GameIsPaused)
{
Resume();
}else
{
Pause();
}
}
}
public void Resume()
{
pauseMenuUI.SetActive(false);
Time.timeScale = 1f;
GameIsPaused = false;
}
void Pause ()
{
pauseMenuUI.SetActive(true);
Time.timeScale = 0f;
GameIsPaused = true;
}
public void LoadMenu()
{
SceneManager.LoadScene("Main");
}
public void QuitGame()
{
Application.Quit();
}
}
Eu não faço ideia de como impedir de ativar a tecla Escape se o jogo já deu gameOver.
acefogo- Avançado
- PONTOS : 1549
REPUTAÇÃO : 9
Respeito as regras :
Re: [RESOLVIDO] Duvidas sobre o Canvas, preFabs e o collisor na Unity
Você tem uma bool chamada "GameIsPaused" que controla quando deve resumir ou pausar, basta criar mais uma pro game over.
Com essa nova bool, você checa se apertou Esc E se gameOver é falso, somente nesse caso é que o painel de pause é chamado.
Aí no script que mandei, você altera essa variável quando o jogador perder.
Não esqueça de fazer gameOver receber falso quando você inicia a partida.
Com essa nova bool, você checa se apertou Esc E se gameOver é falso, somente nesse caso é que o painel de pause é chamado.
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
public class PauseMenu : MonoBehaviour
{
public static bool GameIsPaused = false;
public static bool GameOver = false;
public GameObject pauseMenuUI;
// Update is called once per frame
void Update()
{
if (Input.GetKeyDown(KeyCode.Escape) && !GameOver)
{
if (GameIsPaused)
{
Resume();
}else
{
Pause();
}
}
}
public void Resume()
{
pauseMenuUI.SetActive(false);
Time.timeScale = 1f;
GameIsPaused = false;
}
void Pause ()
{
pauseMenuUI.SetActive(true);
Time.timeScale = 0f;
GameIsPaused = true;
}
public void LoadMenu()
{
SceneManager.LoadScene("Main");
}
public void QuitGame()
{
Application.Quit();
}
}
Aí no script que mandei, você altera essa variável quando o jogador perder.
- Código:
public void MostrarTeladeGameOver()
{
painelGameOver.SetActive(true);
PauseMenu.GameOver = true;
}
Não esqueça de fazer gameOver receber falso quando você inicia a partida.
Fagner- Moderador
- PONTOS : 4442
REPUTAÇÃO : 667
Áreas de atuação : Modelagem 3D, Programação.
Respeito as regras :
Re: [RESOLVIDO] Duvidas sobre o Canvas, preFabs e o collisor na Unity
Funcionou perfeitamente desse jeito aí que você passou. Aí para tornar ele false coloquei no void start () e dentro do método de restart game.
- Código:
void Start()
{
Time.timeScale = 1;
PauseMenu.GameOver = false;
}
public void RestartGame()
{
SceneManager.LoadScene(1); // aqui passa por parametro reiniciar o jogo no botão verde
PauseMenu.GameOver = false; // sempre que o usuario reiniciar a partida ele joga para false novamente
}
acefogo- Avançado
- PONTOS : 1549
REPUTAÇÃO : 9
Respeito as regras :
Tópicos semelhantes
» [RESOLVIDO] Como fazer um efeito Parallax com o Canvas no Unity?
» [RESOLVIDO] Como fazer o canvas ficar atrás do personagem? Unity 2D
» [RESOLVIDO] Duvidas sobre dar restart na cena com Scene Management
» [RESOLVIDO] Duvida sobre Unity
» [RESOLVIDO] Duvida sobre versao da unity e sobre o lerp
» [RESOLVIDO] Como fazer o canvas ficar atrás do personagem? Unity 2D
» [RESOLVIDO] Duvidas sobre dar restart na cena com Scene Management
» [RESOLVIDO] Duvida sobre Unity
» [RESOLVIDO] Duvida sobre versao da unity e sobre o lerp
SchultzGames :: UNITY 3D :: Resolvidos
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos