3
respostas

[Dúvida] Não consigo programar o DisablePlayerInput

mesmo ja tendo criado corretamente no input manager, o DisablePlayerInput simplismnete não esta funcionando!Insira aqui a descrição dessa imagem para ajudar na acessibilidade Insira aqui a descrição dessa imagem para ajudar na acessibilidade Insira aqui a descrição dessa imagem para ajudar na acessibilidade

3 respostas

Olá André!

Parece que o problema está relacionado à forma como você está acessando o método DisablePlayerInput. O erro indica que o GameManager.Instance.InputManager está retornando um tipo object, que não possui o método DisablePlayerInput.

Aqui estão algumas dicas para resolver o problema:

  1. Verifique o Tipo de Retorno: Certifique-se de que GameManager.Instance.InputManager está retornando o tipo correto que contém o método DisablePlayerInput. Pode ser que você precise fazer um cast para o tipo correto.

  2. Confirme a Instância do GameManager: Assegure-se de que o GameManager.Instance está devidamente inicializado e que InputManager é uma propriedade pública ou um campo acessível que retorna o tipo correto.

  3. Reveja o Script do GameManager: No script do GameManager, verifique se InputManager está sendo inicializado corretamente e se é do tipo que possui o método DisablePlayerInput.

  4. Verifique Referências: Certifique-se de que todos os scripts necessários estão corretamente referenciados e que não há erros de compilação em outros scripts que possam estar afetando o comportamento.

Aqui está um exemplo de como poderia ser a definição no GameManager:

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

    private void Awake()
    {
        if (Instance == null)
        {
            Instance = this;
            // Inicialize o InputManager aqui
            InputManager = GetComponent<InputManager>();
        }
        else
        {
            Destroy(gameObject);
        }
    }
}

Espero ter ajudado e bons estudos!

Quando fiz iso, outro problema surgiu, agora a cena não carrega mais corretamente, fica danso esse erroInsira aqui a descrição dessa imagem para ajudar na acessibilidade , ja tentei de tudo mas nada resolve, aqui esta o código do playerbehavior

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

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

    private float moveDirection;

    private new Rigidbody2D rigidbody;
    private IsGroundChecker isGroundChecker;

    private void Awake()
    {
        rigidbody = GetComponent<Rigidbody2D>();
        isGroundChecker = GetComponent<IsGroundChecker>();

        GetComponent<Health>().OnDead += HandlePlayerDeath;
    }

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

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

    private void MovePlayer()
    {
        moveDirection = GameManager.Instance.InputManager.Movement;
        transform.Translate(moveDirection * Time.deltaTime * moveSpeed, 0, 0);
    }

    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 (isGroundChecker.IsGround() == false) return;
        rigidbody.velocity += Vector2.up * jumpForce;
    }

    private void HandlePlayerDeath()
    {
        GetComponent<Collider2D>().enabled = false;
        rigidbody.constraints = RigidbodyConstraints2D.FreezeAll;
        GameManager.Instance.InputManager.DisablePlayerInput();
    }
}

Agora parece que você está com dois problemas principais:

1. ArgumentException: GetComponent requires that the requested component 'InputManager' derives from MonoBehaviour or Component or is an interface

  • Causa: Este erro indica que você está tentando usar GetComponent<InputManager>() em algum lugar, mas o objeto que está chamando o GetComponent (provavelmente o GameManager.Instance) não tem um componente InputManager que seja do tipo MonoBehaviour ou Component, e não é uma interface também.
  • Solução:
    • Verifique o GameManager: Certifique-se de que o seu GameManager tenha um componente do tipo InputManager anexado. O GameManager precisa ser um objeto Unity ativo na cena e deve ter um script InputManager (ou algum script derivado de MonoBehaviour ou Component que possa ser acessado por GetComponent) que é o componente correto.
    • Verifique o tipo de InputManager: Certifique-se de que GameManager.Instance.InputManager está sendo referenciado corretamente e que a propriedade InputManager não é apenas um campo de tipo não-componente mas realmente acessa um script componente que existe. Verifique se o nome de classe (ex: InputManager) está correto, lembrando que o nome de classe deve coincidir com o nome de arquivo que o contém.
    • Crie um InputManager no mesmo gameObject que o GameManager: Se InputManager é um script (por exemplo, InputManager.cs), crie um objeto vazio chamado GameManager na cena e adicione a ele tanto o script GameManager.cs quanto o script InputManager.cs. Se os dois scripts estão no mesmo objeto, GetComponent<InputManager>() funcionará nesse objeto.

2. NullReferenceException: Object reference not set to an instance of an object PlayerBehavior.Start() (at Assets/Scripts/Player/PlayerBehavior.cs:25) e NullReferenceException: Object reference not set to an instance of an object PlayerBehavior.MovePlayer() (at Assets/Scripts/Player/PlayerBehavior.cs:36)

  • Causa: Esses erros indicam que você está tentando acessar um objeto que não foi instanciado (ou seja, é nulo). Os erros ocorrem nas linhas 25 (método Start()) e 36 (método MovePlayer()) do seu script PlayerBehavior.
  • Origem: Olhando para o código, você está tentando acessar GameManager.Instance.InputManager nessas linhas. Se GameManager.Instance ou GameManager.Instance.InputManager forem nulos, isso causará os NullReferenceExceptions.
  • Solução:
    • Certifique-se de que GameManager.Instance existe e é válido:
      • Verificação de inicialização: Se o script GameManager é responsável por inicializar a sua instância Instance, coloque o script GameManager para ser executado ANTES do script PlayerBehavior nas configurações do seu projeto. Para isso vá em "Project Settings -> Script Execution Order" e arraste o seu script GameManager para a lista e coloque ele ANTES do seu script PlayerBehavior.
      • Cena ativa: Certifique-se de que o GameObject com o script GameManager está na cena e está ativo quando o PlayerBehavior é inicializado.
      • Validação no script PlayerBehavior: No método Start() do PlayerBehavior, você pode adicionar uma verificação para ver se GameManager.Instance é nulo. Se for, mostre um erro ou faça o que for apropriado para o seu jogo. Exemplo:
         private void Start()
          {
              if(GameManager.Instance == null)
              {
                Debug.LogError("GameManager.Instance é nulo. Certifique-se de que o GameManager foi instanciado na cena.");
                 return;
              }
              if(GameManager.Instance.InputManager == null)
              {
                Debug.LogError("GameManager.Instance.InputManager é nulo. Certifique-se de que InputManager foi inicializado.");
                 return;
              }
             GameManager.Instance.InputManager.OnJump += HandleJump;
          }
      
    • Verifique se InputManager foi inicializado: Além de ter o script InputManager no mesmo objeto que o GameManager como falado acima, você precisa ter certeza que o método Start() do script InputManager (se ele tiver um) foi executado antes de GameManager.Instance.InputManager ser acessado em qualquer outro script.

Siga esses passos e você deve resolver os problemas!