4
respostas

Problemas com menu e player

Cheguei ao final do curso e fiz a build do game para enviar para alguns amigos testarem, porém detectei 3 problemas que não estou conseguindo resolver:

1- O menu inicial sempre abre fora de ordem, começando pelo menu de opções. Fiz algumas alterações como ocultar os paineis mas mesmo assim quando entro em opções somem as barrinhas de controle de volume e o botão de retorno, deixando o game preso ali.

2- A animação de pulo do player não funciona na build final. Dentro da unity está funcionando perfeitamente mas não sei o que acontece que na build não é executada.

3- A ação de atacar do player não acontece na build final. Dentro da unity também funciona mas na build não.

Poderiam me ajudar?

4 respostas

Olá!

É preciso ver teu código, manda ele completo

UIManager

using TMPro; using UnityEngine;

public class UIManager : MonoBehaviour { [SerializeField] private TextMeshProUGUI keysText; [SerializeField] private TextMeshProUGUI livesText; [SerializeField] private TextMeshProUGUI victoryText;

[Header("Panels")]
[SerializeField] private GameObject OptionsPanel;
[SerializeField] private GameObject PausePanel;
[SerializeField] private GameObject GameOverPanel;

private void Awake()
{
    victoryText.gameObject.SetActive(false);
    OptionsPanel.SetActive(false);
    PausePanel.SetActive(false);
    GameOverPanel.SetActive(false);

}

private void Start()
{
    GameManager.Instance.InputManager.OnMenuOpenClose += OpenClosePauseMenu;
}

public void OpenClosePauseMenu()
{
    if (PausePanel.activeSelf == false)
    {
        PausePanel.SetActive(true);
    }
    else
    {
        PausePanel.SetActive(false);
    }
}

public void OpenOptionsPanel()
{
    OptionsPanel.SetActive(true);
}

public void OpenGameOverPanel()
{
    GameOverPanel.SetActive (true);
}

public void ShowVictoryText()
{
    victoryText.gameObject.SetActive(true);
}
public void UpdateKeysLeftText(int totalValue, int leftValue)
{
    keysText.text = $"{leftValue}/{totalValue}";
}

public void UpdateLivesText(int amount)
{
    livesText.text = $"{amount}";
}

}

player behaviour

using System; using UnityEngine;

public class PlayerBehavior : MonoBehaviour { [SerializeField] private float moveSpeed = 5; [SerializeField] private float jumpForce = 3; [SerializeField] private ParticleSystem hitParticle;

[Header("Propriedades de ataque")]
[SerializeField] private float attackRange = 1f;
[SerializeField] private Transform attackPosition;
[SerializeField] private LayerMask attackLayer;

private float moveDirection;

private Rigidbody2D rigidbody;
private Health health;
private IsGroundedChecker isGroundedChecker;

private void Awake()
{
    rigidbody = GetComponent<Rigidbody2D>();
    isGroundedChecker = GetComponent<IsGroundedChecker>();
    health = GetComponent<Health>();
    health.OnHurt += HandleHurt;
    health.OnDead += HandlePlayerDeath;
}

private void Start()
{
    GameManager.Instance.InputManager.OnJump += HandleJump;
}

private void FixedUpdate()
{
    MovePlayer();
    FlipSpriteAccordingToMoveDirection();
}

private void MovePlayer()
{
    moveDirection = GameManager.Instance.InputManager.Movement;
    Vector2 directionToMove = new Vector2(moveDirection * moveSpeed, rigidbody.linearVelocity.y);
    rigidbody.linearVelocity = directionToMove;
}

private void FlipSpriteAccordingToMoveDirection()
{
    if (moveDirection < 0)
    {
        transform.localScale = new Vector3(-1, 1, 1);
    }
    else if (moveDirection > 0)
    {
        transform.localScale = Vector3.one;
    }
}

private void HandleJump()
{
    if (isGroundedChecker.IsGrounded() == false) return;
    rigidbody.linearVelocity += Vector2.up * jumpForce;
    GameManager.Instance.AudioManager.PlaySFX(SFX.PlayerJump);

}

private void HandleHurt()
{
    GameManager.Instance.AudioManager.PlaySFX(SFX.PlayerHurt);
    UpdateLives(health.GetLives());
    PlayHitParticle();
}

private void HandlePlayerDeath()
{
    GetComponent<Collider2D>().enabled = false;
    rigidbody.constraints = RigidbodyConstraints2D.FreezeAll;
    GameManager.Instance.AudioManager.PlaySFX(SFX.PlayerDeath);
    GameManager.Instance.InputManager.DisablePlayerInput();
    UpdateLives(health.GetLives());
    PlayHitParticle();
}

private void UpdateLives(int amount)
{
    GameManager.Instance.UpdateLives(amount);
}

private void PlayerWalkSound()
{
    GameManager.Instance.AudioManager.PlaySFX(SFX.PlayerWalk);
}

private void PlayHitParticle()
{
    ParticleSystem instantiatedParticle = Instantiate(hitParticle, transform.position, transform.rotation);
    instantiatedParticle.Play();
}
private void Attack()
{
    Collider2D[] hittedEnemies =
        Physics2D.OverlapCircleAll(attackPosition.position, attackRange, attackLayer);

    GameManager.Instance.AudioManager.PlaySFX(SFX.PlayerAttack);

    foreach (Collider2D hittedEnemy in hittedEnemies)
    {
        if (hittedEnemy.TryGetComponent(out Health enemyHealth))
        {
            enemyHealth.TakeDamage();
        }
    }
}

   private void OnDrawGizmos()
{
    Gizmos.color = Color.yellow;
    Gizmos.DrawWireSphere(attackPosition.position, attackRange);
}

}

game manager

using System; using System.Collections; using UnityEngine; using UnityEngine.SceneManagement;

public class GameManager : MonoBehaviour { public static GameManager Instance; public InputManager InputManager { get; private set; }

[Header("Dynamic Game Objects")]
[SerializeField] private GameObject bossDoor;
[SerializeField] private PlayerBehavior player;
[SerializeField] private BossBehaviour boss;
[SerializeField] private BossFightTrigger bossFightTrigger;


[Header("Managers")]
public UIManager UIManager;
public AudioManager AudioManager;


private int totalKeys;
private int keysLeftToCollect;

private void Awake()
{
    if (Instance != null) Destroy(this.gameObject);
    Instance = this;

    totalKeys = FindObjectsOfType<CollectableKey>().Length;
    keysLeftToCollect = totalKeys;
    UIManager.UpdateKeysLeftText(totalKeys, keysLeftToCollect);

    InputManager = new InputManager();

    bossFightTrigger.OnPlayerEnterBossFight += ActivateBossBehaviour;

    player.GetComponent<Health>().OnDead += HandleGameOver;

    boss.GetComponent<Health>().OnDead += HandleVictory;

}

    public void updateKeysLeft()
{
    keysLeftToCollect--;
    UIManager.UpdateKeysLeftText(totalKeys, keysLeftToCollect);
    CheckAllKeysCollected();
}

private void CheckAllKeysCollected()
{
    if (keysLeftToCollect <= 0)
    {
        Destroy(bossDoor);  
    }
}

private void ActivateBossBehaviour()
{
    boss.StartChasing();
}

private void HandleGameOver()
{
    UIManager.OpenGameOverPanel();
}

private void HandleVictory()
{
    UIManager.ShowVictoryText();
    StartCoroutine(GoToCreditsScene());

}

private IEnumerator GoToCreditsScene()
{
    yield return new WaitForSeconds(2f);
    SceneManager.LoadScene("Credits");
}
public void UpdateLives(int amount)
{
    UIManager.UpdateLivesText(amount);
}

public PlayerBehavior GetPlayer()
{
    return player;
}

}