Я просто не понимаю, почему мой игрок не сталкивается с приставками, но сталкивается на стороне
Я новичок в единстве, это один код, который я скопировал из Интернета, предыдущий сделал мой собственный прыжок, но он придерживалсястены, когда прыгают, так что я нашел это решение с Raycast лучше, но понимаю, если оно сталкивается со сторонами и дном, почему тогда не может столкнуться с вещами
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Player : MonoBehaviour
{
public Vector2 velocity;
public float jumpVelocity;
public float gravity;
public LayerMask floorMask;
public LayerMask wallMask;
private bool walk, walk_left, walk_right, jump;
public enum playerState
{
jumping,
idle,
walking
}
private playerState plState = playerState.idle;
private bool grounded = false;
// Start is called before the first frame update
void Start()
{
// fall();
}
// Update is called once per frame
void Update()
{
checkPlayerInput();
updatePlayerPosition();
}
void updatePlayerPosition()
{
Vector3 pos = transform.localPosition;
Vector3 scale = transform.localScale;
if (walk)
{
if (walk_left)
{
pos.x -= velocity.x * Time.deltaTime;
scale.x = -1;
}
if (walk_right)
{
pos.x += velocity.x * Time.deltaTime;
scale.x = 1;
}
pos = checkWallRays(pos, scale.x);
}
if(jump&& plState != playerState.jumping)
{
plState = playerState.jumping;
velocity = new Vector2(velocity.x, velocity.y);
}
if (plState == playerState.jumping)
{
pos.y += velocity.y * Time.deltaTime;
velocity.y -= gravity * Time.deltaTime;
}
if (velocity.y <= 0)
{
pos = checkFloorRays(pos);
}
if (velocity.y >= 0)
{
pos = checkCeilingRays(pos);
}
transform.localPosition = pos;
transform.localScale = scale;
}
void checkPlayerInput()
{
bool input_left = Input.GetKey(KeyCode.LeftArrow);
bool input_right=Input.GetKey(KeyCode.RightArrow);
bool input_space = Input.GetKeyDown(KeyCode.Space);
walk = input_left || input_right;
walk_left = input_left && !input_right;
walk_right = input_right && !input_left;
jump = input_space;
}
Vector3 checkWallRays(Vector3 pos,float direction)
{
Vector2 originTop = new Vector2(pos.x + direction * 0.4f,pos.y+1f-0.2f);
Vector2 originMidle= new Vector2(pos.x + direction * 0.4f, pos.y);
Vector2 originBotom = new Vector2(pos.x + direction * 0.4f, pos.y-1f +0.2f);
RaycastHit2D wallTop = Physics2D.Raycast(originTop, new Vector2(direction, 0), velocity.x * Time.deltaTime,wallMask);
RaycastHit2D wallMidle= Physics2D.Raycast(originMidle, new Vector2(direction, 0), velocity.x * Time.deltaTime, wallMask);
RaycastHit2D wallBotom = Physics2D.Raycast(originBotom, new Vector2(direction, 0), velocity.x * Time.deltaTime, wallMask);
if(wallTop.collider!=null||wallMidle.collider!=null || wallBotom.collider != null)
{
pos.x -= velocity.x * Time.deltaTime * direction;
}
return pos;
}
Vector3 checkFloorRays(Vector3 pos)
{
Vector2 originLeft = new Vector2(pos.x - 0.5f + 0.25f,pos.y-1f);
Vector2 originMidle = new Vector2(pos.x, pos.y - 1f);
Vector2 originRight = new Vector2(pos.x + 0.5f-0.25f, pos.y - 1f);
RaycastHit2D floorLeft = Physics2D.Raycast(originLeft, Vector2.down, velocity.y * Time.deltaTime, floorMask);
RaycastHit2D floorMidle = Physics2D.Raycast(originMidle, Vector2.down, velocity.y * Time.deltaTime, floorMask);
RaycastHit2D floorRight = Physics2D.Raycast(originRight, Vector2.down, velocity.y * Time.deltaTime, floorMask);
if(floorLeft.collider!=null||floorMidle.collider!=null || floorRight.collider != null)
{
RaycastHit2D hitRay = floorRight;
if (floorLeft)
{
hitRay = floorLeft;
}else if(floorMidle)
{
hitRay = floorMidle;
}else if (floorRight)
{
hitRay = floorRight;
}
plState = playerState.idle;
grounded = true;
velocity.y = 0;
pos.y = hitRay.collider.bounds.center.y + hitRay.collider.bounds.size.y *2 + 1;
}else
{
// if (plState != playerState.jumping)
//{
// fall();
//}
}
return pos;
}
Vector3 checkCeilingRays(Vector3 pos)
{
Vector2 originLeft = new Vector2(pos.x - 0.5f + 0.25f, pos.y - 1f);
Vector2 originMidle = new Vector2(pos.x, pos.y - 1f);
Vector2 originRight = new Vector2(pos.x + 0.5f - 0.25f, pos.y - 1f);
RaycastHit2D ceilleft = Physics2D.Raycast(originLeft, Vector2.up, velocity.y * Time.deltaTime, floorMask);
RaycastHit2D ceilMidle = Physics2D.Raycast(originMidle, Vector2.up, velocity.y * Time.deltaTime, floorMask);
RaycastHit2D ceilRight = Physics2D.Raycast(originRight, Vector2.up, velocity.y * Time.deltaTime, floorMask);
if (ceilleft.collider != null || ceilMidle.collider != null || ceilRight.collider != null)
{
RaycastHit2D hitRay = ceilleft;
if (ceilleft)
{
hitRay = ceilleft;
}
else if (ceilMidle)
{
hitRay = ceilMidle;
}
else if (ceilRight)
{
hitRay = ceilRight;
}
pos.y = hitRay.collider.bounds.center.y - hitRay.collider.bounds.size.y -1;
//fall();
}
return pos;
}
void fall()
{
velocity.y = 0;
plState = playerState.jumping;
grounded = false;
}
}