2
respostas

Colisão fazendo o personagem tombar

Segui o passo a passo até a aula de implementação do som, mas percebi que quando vou testar o game, se meu personagem esbarra num tile curvo, o personagem tomba e cai no chão, bugando completamente. Poderiam me ajudar?

2 respostas

Boa tarde, será um prazer ajudar... manda o código completo

Olá! Boa tarde!

Esse é o playerBehaviour:

using System; using UnityEngine;

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

[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 += PlayHurtAudio;
    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 (isGroundedChecker.IsGrounded() == false) return;
    rigidbody.linearVelocity += Vector2.up * jumpForce;
    GameManager.Instance.AudioManager.PlaySFX(SFX.PlayerJump);

}

private void PlayHurtAudio()
{
    GameManager.Instance.AudioManager.PlaySFX(SFX.PlayerHurt);
}

private void HandlePlayerDeath()
{
    GetComponent<Collider2D>().enabled = false;
    rigidbody.constraints = RigidbodyConstraints2D.FreezeAll;
    GameManager.Instance.AudioManager.PlaySFX(SFX.PlayerDeath);
    GameManager.Instance.InputManager.DisablePlayerInput();
}
private void PlayerWalkSound()
{
    GameManager.Instance.AudioManager.PlaySFX(SFX.PlayerWalk);
}
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);
}

}


E esse o playerAnim

using UnityEngine;

public class PlayerAnimController : MonoBehaviour { private Animator animator; private IsGroundedChecker groundedChecker; private Health playerHealth;

private void Awake()
{
    animator = GetComponent<Animator>();
    groundedChecker = GetComponent<IsGroundedChecker>();
    playerHealth = GetComponent<Health>();

    playerHealth.OnHurt += PlayHurtAnim;
    playerHealth.OnDead += PlayDeadAnim;

    GameManager.Instance.InputManager.OnAttack += PlayAttackAnim;
}

private void Update()
{
    bool isMoving = GameManager.Instance.InputManager.Movement != 0;
    animator.SetBool("isMoving", isMoving);
    animator.SetBool("isJumping", !groundedChecker.IsGrounded());

}

    private void PlayHurtAnim()
{
    animator.SetTrigger("hurt");
}
private void PlayDeadAnim()
{
    animator.SetTrigger("dead");
}
    private void PlayAttackAnim()
{
    animator.SetTrigger("attack");
}

}