Я создаю 2D-платформер в Unity и столкнулся с проблемой со скриптом движения игрока.Дело в том, что персонаж никогда не бывает полностью на земле, в инспекторе его скорость у всегда изменяется с 0 на 0,3, а затем обратно на 0 и так для бесконечного цикла.
Возможно, это как-то связано сэта строка
position.y = hitRay.collider.bounds.center.y + hitRay.collider.bounds.size.y / 2 + 0.0801f;
еслиЯ поставил его на 0,08f, (мои игроки y размер 0,16f), мой игрок просто падает сквозь землю.
Если кто-то заметит ошибку и будет любезен помочь, я был бы очень благодарен.
void Fall()
{
velocity.y = 0;
playerState = PlayerState.jumping;
grounded = false;
bounce = false;
}
void UpdatePlayerPosition()
{
Vector3 position = transform.localPosition;
Vector3 scale = transform.localScale;
if (walk)
{
if (walk_left)
{
position.x -= velocity.x * Time.deltaTime;
scale.x = -1;
}
if (walk_right)
{
position.x += velocity.x * Time.deltaTime;
scale.x = 1;
}
position = CheckWallRays(position, scale.x);
}
if (jump && playerState != PlayerState.jumping)
{
playerState = PlayerState.jumping;
velocity = new Vector2(velocity.x, jumpVelocity);
}
if (playerState == PlayerState.jumping)
{
position.y += velocity.y * Time.deltaTime;
velocity.y -= gravity * Time.deltaTime;
}
if (bounce && playerState != PlayerState.bouncing)
{
playerState = PlayerState.bouncing;
velocity = new Vector2(velocity.x, bounceVelocity);
}
if (playerState == PlayerState.bouncing)
{
position.y += velocity.y * Time.deltaTime;
velocity.y -= gravity * Time.deltaTime;
}
if (velocity.y <= 0)
{
position = CheckGroundRays(position);
}
if (velocity.y >= 0)
{
position = CheckCeilingRays(position);
}
transform.localPosition = position;
transform.localScale = scale;
}
Vector3 CheckGroundRays(Vector3 position)
{
Vector2 left = new Vector2(position.x - 0.065f, position.y - 0.08f);
Vector2 middle = new Vector2(position.x, position.y - 0.08f);
Vector2 right = new Vector2(position.x + 0.065f, position.y - 0.08f);
Debug.DrawRay(left, Vector2.down, Color.green);
Debug.DrawRay(middle, Vector2.down);
Debug.DrawRay(right, Vector2.down);
RaycastHit2D groundLeft = Physics2D.Raycast(left, Vector2.down, velocity.y * Time.deltaTime, floorMask);
RaycastHit2D groundMiddle = Physics2D.Raycast(middle, Vector2.down, velocity.y * Time.deltaTime, floorMask);
RaycastHit2D groundRight = Physics2D.Raycast(right, Vector2.down, velocity.y * Time.deltaTime, floorMask);
if (groundLeft.collider != null || groundMiddle.collider != null || groundRight.collider != null)
{
RaycastHit2D hitRay = groundLeft;
if (groundLeft)
{
hitRay = groundLeft;
}
else if (groundMiddle)
{
hitRay = groundMiddle;
}
else if (groundRight)
{
hitRay = groundRight;
}
if (hitRay.collider.tag == "Enemy")
{
hitRay.collider.GetComponent<EnemyAI>().Crush();
this.GetComponent<PlayerScore>().score += 100;
bounce = true;
}
playerState = PlayerState.idle;
grounded = true;
velocity.y = 0;
position.y = hitRay.collider.bounds.center.y + hitRay.collider.bounds.size.y / 2 + 0.0801f;
}
else if (playerState != PlayerState.jumping)
{
Fall();
}
return position;
}