Unity: игровой объект не может двигаться вправо в первый раз, когда я нажимаю стрелку вправо на клавиатуре - PullRequest
0 голосов
/ 07 сентября 2018

Обновление: после того, как вы пойдете дальше с этой книгой, я получу причину.Это ограничение единства коллайдеров, о котором говорится в книге.Поэтому я думаю, что мы могли бы закрыть этот билет.

Что сказано в книге:

"Прямо сейчас, если вы используете бок-коллайдеры на своих фишках и на вашем игровом персонаже, вы можете найтичто вы иногда застреваете на вещах, которые не следует делать - ваш персонаж может перестать двигаться и давить на воздух.Проблема обычно возникает в вершинах между близко расположенными плитками, и, к сожалению, кажется, что это небольшая проблема с Unityсам по себе, а не что-либо, что вы можете исправить (очевидно, оно было введено в 4.3.1 и еще не решено на момент написания). Если вы столкнулись с этой проблемой, просто попробуйте использовать многоугольный коллайдер для самого Squarey, изменивслегка измените форму, нажав «Редактировать коллайдер», а затем создайте небольшой выступ в контуре, как показано на рис. 5-9, чтобы вы могли «скользить» по этим воображаемым препятствиям. "

Следуя книге, я создаю простую игруиспользуя Unity 2D.Он включает GameObject с именем 'Player', который может выполнять какие-то простые действия, перемещаться влево / вправо / прыгать при нажатии leftArrow / rightArrow / Пробел моего ПК.А также некоторые плитки в качестве основания платформы.

Я обнаружил проблему, заключающуюся в том, что во время игры сначала игрок падает на платформу, а затем, когда я нажимаю клавишу Стрелка вправо , он не имеетэффект.Но если я нажму Влево Клавишу или Пробел , проигрыватель перейдет влево или прыгнет, тогда Право Клик вступит в силу ...

Эта проблема занимает у меня часы!Поиск в интернете, но ответа не найдено.Одна подсказка, которую я обнаружил, состоит в том, что когда я снимаю флажок с опции Freeze Rotation в RigidBody2D, тогда правильное движение работает, но я пока не знаю, почему.

Issue1_000

Issue1_001

Вот мой код, ребята, ваша помощь будет оценена!

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Player : MonoBehaviour
{

    public Rigidbody2D rb;
    public int moveSpeed;
    public int jumppower;
    public Transform groundCheck;
    public float groundCheckRadius;
    public LayerMask whatIsGround;
    private bool onGround;


    // Use this for initialization
    void Start()
    {
        rb = GetComponent<Rigidbody2D>();
    }

    private void FixedUpdate()
    {
        onGround = Physics2D.OverlapCircle(groundCheck.position, groundCheckRadius,
            whatIsGround);
    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetKey(KeyCode.LeftArrow))
        {
            rb.velocity = new Vector2(-moveSpeed, rb.velocity.y);
        }
        if (Input.GetKey(KeyCode.RightArrow))
        {
            rb.velocity = new Vector2(moveSpeed, rb.velocity.y);
        }

        if (Input.GetKey(KeyCode.Space) && onGround)
        {
            rb.velocity = new Vector2(rb.velocity.x, jumppower);
        }
    }
}

1 Ответ

0 голосов
/ 07 сентября 2018

Хорошо, позвольте мне закрыть этот вопрос. Причина, по которой игрок иногда останавливается во время перемещения, заключается в ограничении Box Collider. Обходной путь мог бы использовать вместо этого многоугольный коллайдер и изменять формы, как сказано в книге.

Конечно, я попробую свой проект, на самом деле он работает. Спасибо, ребята, дело сейчас закрыто, и я буду изучать Unity шаг за шагом, так как интерес к играм!

...