Sistema de coletar itens para aumentar vida/magia

Agora que eu percebi que tem que fazer um ajuste no método AtualizarVidaMaxima, eu não tava mudando o valor da váriavel “vidaAtual”, então só o slider estava aumentando, mas como o método não ta sendo usando ainda não deu nenhum problema, quando for usar me avisa que eu mando aqui, mas se quiser alterar agora é só colocar essa linha vidaAtual = vidaMaxima;

O slider não aumentou de tamanho, eu vi no inspector que ainda ta 500x150 e nao 550. Você disse que tem que chegar a 5 os itens.

public void AtualizarVida()
{
//Aqui ele vai atualizar tanto o valor do slider, quanto da vida máxima
//como essa condição não está sendo chamada no update, deve ser colocado o valor desejado -1;
if (itensColetados >= 4)//apesar de ser 4, ela vai atualizar quando chegar a 5
{
AtualizarVidaMaxima(110);
MudarTamanhoDoSlider(550, 150);
vidaMaxima = (int)barraDeVida.maxValue;
vidaAtual = (int)barraDeVida.value;
}
}

1 curtida

O método pra mudar o tamanho do slider é outro, eu fiz separado pra ficar mais simples, da pra chamar ele quando a vida atualizar, da pra mudar tanto a altura quanto a largura

Mas aí esse metodo que tem os valores 550 e 150 tao certos? Tem uma parte que você disse que o valor teria que ser -1

1 curtida

É verdade, tinha esquecido desse detalhe, no caso como são 4 itens tem que colocar if (itensColetados >= 3).
os valores de 550 e 150 eu coloquei só pra testar, pode ser o valor que tu quiser, o de vida máxima também pode ser qualquer valor.

Deu tudo certo, mas a barra cresce pra trás também. Senão for muito complicado, Você saberia como faz pra ela crescer só pra direita?

1 curtida

Isso ai é bem simples, da pra fazer no inspector mesmo, é só colocar o pivot no eixo x como 0.
Captura de Tela (197)

E mais uma coisa, tem que remover essa chamada do método, eu coloquei pra testar e acabei esquecendo, ele ja ta sendo chamado em outro método, então se coloca um valor diferente em cada um ele entra em conflito

Beleza. E no caso de eu querer que a barra aumente mais de 1 vez(só pra teste)
Tipo, cada 4 itens aumenta 10% (a primeira de 100 pra 110, a segunda de 110 pra 120 e por aí vai).
Vão estar espalhadas pelas fases, no final eu quero que fique com 200 de vida, e o tamanho de 1000x150

1 curtida

Eu pensei em uma solução bem simples.
Primeiro eu adicionei uma variável pra toda vez que o método de AtualizarVida for chamado ela recebe +10. ela começa com 110, depois vai pra 120,130 etc

No método de atualizar vida, quando pegar todos os itens a variável itens coletados vai voltar a ser zero, então a condição vai se repetir infinitamente.Além disso no método de atualizar vida máxima, eu tinha colocado um valor de exemplo como parâmetro, que no caso era 110, agora eu substitui pela nova variável "Adicionar vida máxima, que nesse caso ela começa com 110 e a cada atualização do método ela aumenta mais 10.

e por ultimo, eu mudei a ordem que os métodos são chamados, por que se não itensColetados nunca voltava a ser 0, AtualizarVida tem que ser chamado por ultimo.

Lembra que eu disse que a condição
if (itensColetados >= 4) tinha que colocar -1?
Agora se for 4, tem que ser 4, o problema era na ordem dos métodos, não tinha percebido isso.

Com o slider da pra fazer a mesma coisa, é a mesma lógica basicamente, mas ai tu que decide o quanto quer que ele cresça a cada vez que coletar os itens.
E também da pra organizar esse código, criar scripts diferentes etc etc é que eu não sabia como ia ser, só fui fazendo kkk

using TMPro;
using UnityEngine;
using UnityEngine.UI;

public class VidaDoPlayer : MonoBehaviour
{
//Colocar esse script no player

[SerializeField] private Image ImagemJogo; // Aqui vai a imagem criada no canvas
[SerializeField] private Sprite[] sprites; // Mover as 4 imagens aqui
[SerializeField] private GameObject panelItens;//arrastar o painel aqui
[SerializeField] private TMP_Text textPainel;//Criar um text no canvas

private int indiceImagemAtual = 0;//ImagemAtual
private string[] textos = { "Texto1", "Texto2", "Texto3", "Texto4" };//alTerar os textos que aparecem no painel

public Slider barraDeVida; //Arrastar o slider pra cá
public int vidaMaxima;
public int vidaAtual;
public int itensColetados;
public bool jogadorVivo;

private int adicionarVidaMaxima = 110;
private void Start()
{
    jogadorVivo = true;
    //Como eu to lidando apenas com valores inteiros eu converti pra int
    //Mas o melhor deveria ser usar float, porque max value e value são float
    vidaMaxima = (int)barraDeVida.maxValue;
    vidaAtual = (int)barraDeVida.value;
}

private void Update()
{
    
    if (Input.GetKeyDown(KeyCode.L))
    {
        LevarDano(10);
    }
}

//Como eu não adicionei nenhum sprite a imagem no canvas,eu fiz uma condição pra ela sempre 
//começar pelo indice zero, se eu colocasse a imagem 0, eu não precisaria dessa condição
//a primeira imagem automaticamente seria a 0
void MudarImagem()
{

    //Condição pra imagem começar pelo indíce 0
    if (indiceImagemAtual == 0)
    {
        textPainel.text = textos[indiceImagemAtual];
        ImagemJogo.sprite = sprites[indiceImagemAtual]; //imagem vai ser mudada
        indiceImagemAtual++;// Aqui ela vai valer 1, na próxima execução do metódo
                            //ele vai pra próxima condição
    }

    else
    {
        textPainel.text = textos[indiceImagemAtual];
        ImagemJogo.sprite = sprites[indiceImagemAtual];
        indiceImagemAtual++;

        //Quando o indice atual for maior que a quantidade de imagens ela vai voltar a zero
        //e vai continuar o loop infinitamente
        if (indiceImagemAtual >= sprites.Length)
        {
            indiceImagemAtual = 0;
        }
    }

}


public void LevarDano(int danoParaReceber)
{
    if (jogadorVivo)
    {
       barraDeVida.value = ( vidaAtual -= danoParaReceber);//Ajustei pro slider funcionar agora
        

        if (vidaAtual <= 0)
        {
            jogadorVivo = false;
            Debug.Log("Game Over");
        }
    }
}



//Método pra mudar o tamnho do slider, pode ser usado valores personalizados
//Se não quiser que ele mude é só não chamar no método AtualizarVida
public void MudarTamanhoDoSlider(int altura, int largura)
{
    RectTransform rectTransform = barraDeVida.GetComponent<RectTransform>();
    rectTransform.sizeDelta = new Vector2(altura, largura);
}


public int AtualizarVidaMaxima(int vidaMaxima)
{
    //toda vez que esse método for chamado ele vai atualizar a vida maxima
    //e a vida atual do player
    barraDeVida.maxValue = vidaMaxima;
    barraDeVida.value = vidaMaxima;//Se quiser que a vida atual não seja atualizada após pegar os artefatos,
                                   //é só remover essa linha
    vidaAtual = vidaMaxima;//E essa também
    return this.vidaMaxima = vidaMaxima;
}

public void AumentarItensColetados()
{
    panelItens.SetActive(true);//Mostrar painel na tela toda vez que o item for coletado
    itensColetados++;
    Time.timeScale = 0;//o jogo vai ser parado quando o painel estiver ativo,
                       //pode remover essa linha se quiser que o jogo conntinue

}

//Método pra ser chamado no evento de OnClick do botão
public void FecharPainel()
{
    panelItens.SetActive(false);//Mostrar painel na tela toda vez que o item for coletado
    Time.timeScale = 1;//Despausar o jogo
}


public void AtualizarVida()
{
    if (itensColetados >= 4)
    {
        itensColetados = 0;
        AtualizarVidaMaxima(adicionarVidaMaxima);
        MudarTamanhoDoSlider(1000, 150);
        vidaMaxima = (int)barraDeVida.maxValue;
        vidaAtual = (int)barraDeVida.value;
        adicionarVidaMaxima += 10;
    }
}


private void OnControllerColliderHit(ControllerColliderHit hit)
{
    if (hit.collider.gameObject.CompareTag("PedacoDeVida")) //Tag "Coletavel" Pode ser mudada
    {
        Destroy(hit.gameObject);
      
        AumentarItensColetados();
        MudarImagem();
        AtualizarVida();


    }
}

}
// Aqui o script Atualizado

Eu tenho que criar em outra linha no caso do tamanho do slider? Além dessa “MudarTamanhoDoSlider”. Pra que toda vez aumente 10.

1 curtida

Não, no caso eu tinha dito pra criar outra váriavel pra mudar o tamanho do slider e colocar como parâmetro, mas eu pensei em algo melhor agora.


Essas 3 alterações resolvem o problema, aquela variável “AdicionarVidaMaxima” pode apagar, agora eu to fazendo a adição diretamente na chamada do método, ai no exemplo ta aumentando de 10 em 10, mas se quiser que seja maior é só aumentar o valor no lugar do 10.

Muito obrigado Fernando, você ajudou demais. Meu sonho é criar um jogo no estilo dos God of war de ps2, devil may cry antigos.
Até agora eu fiz bastante coisa graças a você.

1 curtida

Top, fico feliz em ajudar. Isso me deu uma idéia pro meu jogo, vou implementar uma mecânica parecida.

Faltou essa variável