Слайд на стене перестает работать после первого прыжка на стенеC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Слайд на стене перестает работать после первого прыжка на стене

Сообщение Anonymous »

Слайд стены работает отлично, но после того, как я делаю прыжок с одной стеной, стеновая слайд перестает работать, и я больше не могу прыгать на стенах. < /p>
Вот мой код для движения игрока: < /p>

Код: Выделить всё

public class PlayerMovement : MonoBehaviour
{
[Header("Movement Options")]

public float speed;

public float jumpForce;
public float acceleration;
private float currentSpeed;

private float horizontal;
private bool isFacingRight = true;

[SerializeField] private bool isWallSliding;
private float wallSlidingSpeed = 2f;

private bool isWallJumping;
private float wallJumpingDirection;
private float wallJumpingTime = 0.2f;
private float wallJumpingCounter;
private float wallJumpingDuration = 0.4f;
private Vector2 wallJumpingPower = new Vector2(8f, 16f);

[SerializeField] private Transform wallCheck;
[SerializeField] private LayerMask wallLayer;

[Header("Coyote and Buffer")]
public float coyoteTime;
private float coyoteCounter;
public float bufferTime;
private float buffetCounter;

[Header("Components")]

public Rigidbody2D rb;
public Transform groundCheck;
public LayerMask groundLayer;

void Start()
{
currentSpeed = 0;
}

void Update()
{
Debug.Log($"isWallJumping: {isWallJumping}, isWallSliding: {isWallSliding}, isWalled: {isWalled()}, isGrounded: {isGrounded()}");

horizontal = Input.GetAxisRaw("Horizontal");

Jump();
BetterJump();

WallSlide();
WallJump();

if (!isWallJumping && !isWallSliding)
{
Flip();
}

}

void FixedUpdate()
{
if (!isWallJumping)
{
if (horizontal != 0)
{
currentSpeed = Mathf.MoveTowards(currentSpeed, speed * horizontal, acceleration * Time.fixedDeltaTime);
}
else
{
currentSpeed = Mathf.MoveTowards(currentSpeed, 0, acceleration * Time.fixedDeltaTime);
}

rb.velocity = new Vector2(currentSpeed, rb.velocity.y);
}

}

bool isGrounded()
{
return Physics2D.OverlapCircle(groundCheck.position, 0.2f, groundLayer);
}

private bool isWalled()
{
return Physics2D.OverlapCircle(wallCheck.position, 0.2f, wallLayer);
}

private void WallSlide()
{
if (isWalled() && !isGrounded() && horizontal != 0)
{
isWallSliding = true;
rb.velocity = new Vector2(rb.velocity.x, Mathf.Clamp(rb.velocity.y, -wallSlidingSpeed, float.MaxValue));
}
else
{
isWallSliding = false;
}
}

private void WallJump()
{
if (isWallSliding)
{
isWallJumping = false;
wallJumpingDirection = -transform.localScale.x;
wallJumpingCounter = wallJumpingTime;

CancelInvoke(nameof(StopWallJumping));
}
else
{
wallJumpingCounter -= Time.deltaTime;
}

if (Input.GetButtonDown("Jump") && (wallJumpingCounter > 0f || isWallSliding))
{
isWallJumping = true;
isWallSliding = false;
rb.velocity = new Vector2(wallJumpingDirection * wallJumpingPower.x, wallJumpingPower.y);
wallJumpingCounter = 0f;

if (transform.localScale.x != wallJumpingDirection)
{
isFacingRight = !isFacingRight;
Vector3 localScale = transform.localScale;
localScale.x *= -1f;
transform.localScale = localScale;
}

Invoke(nameof(StopWallJumping), wallJumpingDuration);
}

// Verifica se o personagem está na parede após o Wall Jump
if (isWalled() && !isGrounded())
{
isWallSliding = true;
}
}

private void StopWallJumping()
{
isWallJumping = false;
}

void Jump()
{
if (buffetCounter > 0f && coyoteCounter >  0f)
{
rb.velocity = new Vector2(rb.velocity.x, jumpForce);

buffetCounter = 0f;
}

if (Input.GetButtonDown("Jump") && rb.velocity.y > 0f)
{
rb.velocity = new Vector2(rb.velocity.x, rb.velocity.y * 0.5f);

coyoteCounter = 0f;
}
}

void BetterJump()
{
if (isGrounded())
{
coyoteCounter = coyoteTime;
}
else { coyoteCounter -= Time.deltaTime; }

if (Input.GetButtonDown("Jump"))
{
buffetCounter = bufferTime;
}
else { buffetCounter -= Time.deltaTime; }
}

void Flip()
{
if (isFacingRight && horizontal < 0f || !isFacingRight && horizontal > 0f)
{
isFacingRight = !isFacingRight;
Vector3 localScale = transform.localScale;
localScale.x *= 1f;
transform.localScale = localScale;
}
}
}
Я предполагаю, что проблема в методе прыжка стены после того, как я нажимаю кнопку прыжка, но я не могу понять, в чем проблема

Подробнее здесь: https://stackoverflow.com/questions/795 ... -wall-jump
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Unity Application.OpenUrl() перестает работать после первого вызова на IOS
    Anonymous » » в форуме C#
    0 Ответы
    24 Просмотры
    Последнее сообщение Anonymous
  • Unity Application.OpenUrl() перестает работать после первого вызова на IOS
    Anonymous » » в форуме Android
    0 Ответы
    25 Просмотры
    Последнее сообщение Anonymous
  • Unity Application.OpenUrl() перестает работать после первого вызова на IOS
    Anonymous » » в форуме IOS
    0 Ответы
    20 Просмотры
    Последнее сообщение Anonymous
  • Слайдер jQuery, как определить первый слайд, последний слайд и счетчик обновлений?
    Гость » » в форуме Jquery
    0 Ответы
    102 Просмотры
    Последнее сообщение Гость
  • Слайдер jQuery, как определить первый слайд, последний слайд и счетчик обновлений?
    Гость » » в форуме CSS
    0 Ответы
    70 Просмотры
    Последнее сообщение Гость

Вернуться в «C#»