У меня проблема с единством - PullRequest
0 голосов
/ 06 июля 2019

Я просто не понимаю, почему мой игрок не сталкивается с приставками, но сталкивается на стороне

Я новичок в единстве, это один код, который я скопировал из Интернета, предыдущий сделал мой собственный прыжок, но он придерживалсястены, когда прыгают, так что я нашел это решение с 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;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...