Как проверить почву для игры Unity2D Platformer - PullRequest
0 голосов
/ 12 октября 2019

Я пытаюсь сделать 2-ой платформер, где вы видите игрока со стороны. Я хочу, чтобы он постоянно двигался, и вы должны нажимать в нужное время, чтобы он не упал. Сейчас все работает, но он не сталкивается с землей. Я хочу, чтобы он был таким, будто он бежит за стеной, поэтому я хочу игнорировать определенный слой, который я сделал, и сталкиваться с полями под ним. До сих пор я пробовал кастовать лучи, смотрел несколько уроков и делал столкновения с коробками. Столкновения с коробками работали, но для того, чтобы все платформы считались надежными, мне понадобилось бы 50 коробочных коллайдеров. Вот мой текущий код:

public int playerSpeed = 10;
    public int playerJumpPower = 1250;
    public float moveX;
    public float playerYSize = 2;
    public LayerMask mainGround;
    public float playerFallSpeed = 5;

    void Awake(){

    }

    // Update is called once per frame
    void Update()
    {
        RaycastHit2D hit = Physics2D.Raycast(transform.position, new Vector2(10, 0));
        if(hit.distance < 0.7f){
            print("hi");
        }

        Vector3 characterTargetPosition = new Vector3(transform.position.x + playerSpeed, transform.position.y, transform.position.z);
        transform.position = Vector3.Lerp(transform.position, characterTargetPosition, playerSpeed * Time.deltaTime);

        if(Input.GetKeyDown("space")){
            // float playerTargetPosY = transform.position.y + playerJumpPower;
            // Vector3 characterTargetPosition = new Vector3(transform.position.x, playerTargetPosY, transform.position.z);
            // transform.position = Vector3.Lerp(transform.position, characterTargetPosition, playerJumpPower * Time.deltaTime);

            gameObject.GetComponent<Rigidbody2D>().AddForce(Vector2.up * playerJumpPower);
        }
        //PlayerMove();
    }

У меня есть жесткая Body2D на моем плеере, так что сейчас он просто падает сквозь землю, но прыжок работает. Если есть простой способ сделать это. Как какой-то сценарий, учебник или веб-сайт, я для него открыт. Пожалуйста, помогите.

1 Ответ

1 голос
/ 13 октября 2019

Есть ли у вас Rigidbody2D в вашем плеере? Вещи, которые будут перемещаться, обычно должны иметь RigidBody

(извините за публикацию этого ответа).

EDIT:

Попробуйте это:

Rigidbody2D rb;

void Awake()
{
    rb = GetComponent<Rigidbody2D>();
}

//Physics usually are done in FixedUpdate to be more constant
public void FixedUpdate(){
    if (Input.GetKeyDown("space"))
    {
        if(!rb.simulated)
            //player can fall
            rb.simulated = true;

        rb.AddForce(Vector2.up * playerJumpPower);
    }
    else
    {
        //third argument is the distance from the center of the object where it will collide
        //therefore you want the distance from the center to the bottom of the sprite
        //which is half of the player height if the center is acctually in the center of the sprite
        RaycastHit2D hit = Physics2D.Raycast(transform.position, -Vector2.up, playerYSize / 2);

        if (hit.collider)
        {
            //make player stop falling
            rb.simulated = false;
        }
    }
}

Если игрок - единственное, что может столкнуться с чем-то, вы можете просто вытащить коллайдеры из объекта, с которым игрок не столкнется.

В противном случае вы можете проверить слойстолкнулся с объектом hit.collider.gameObject.layer и решите, столкнется ли игрок с этим слоем или нет

(обратите внимание, что вы должны сравнить с индексом слоя. Если вы хотите получить индекс по его имени, вы можетеиспользуйте LayerMask.NameToLayer(/*layer name*/))

вам придется делать rb.simulated = true каждый раз, когда вы хотите что-то сделать с RigidBody (например, AddForce ())

надеюсь, это помогло:)

...