mesmo ja tendo criado corretamente no input manager, o DisablePlayerInput simplismnete não esta funcionando!
Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!
mesmo ja tendo criado corretamente no input manager, o DisablePlayerInput simplismnete não esta funcionando!
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:
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.
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.
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.
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 erro
, 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
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.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.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.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)
Start()) e 36 (método MovePlayer()) do seu script PlayerBehavior.GameManager.Instance.InputManager nessas linhas. Se GameManager.Instance ou GameManager.Instance.InputManager forem nulos, isso causará os NullReferenceExceptions.GameManager.Instance existe e é válido: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.GameManager está na cena e está ativo quando o PlayerBehavior é inicializado.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;
}
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!
Mais um vez, outro erro esta ocorrendo, segue não consigo encontrar esse objeto faltando que é dito
As outras linhas de código
public class InputManager : MonoBehaviour { private PlayerControls playerControls;
public float Movement => playerControls.Gameplay.Movement.ReadValue<float>();
public event Action OnJump;
public InputManager()
{
playerControls = new PlayerControls();
playerControls.Gameplay.Enable();
playerControls.Gameplay.Jump.performed += OnJumpPerformede;
}
private void OnJumpPerformede (InputAction.CallbackContext context)
{
OnJump?.Invoke();
}
public void DisablePlayerInput() => playerControls.Gameplay.Disable();
}
public class GameManager : MonoBehaviour { public static GameManager Instance { get; private set; } public InputManager InputManager { get; private set; } public int Movement { get; internal set; }
public void Start()
{
Instance = this;
}
private void Awake()
{
if (Instance == null)
{
Instance = this;
InputManager = GetComponent<InputManager>();
}
else
{
Destroy(gameObject);
}
}
}