Обновление: после того, как вы пойдете дальше с этой книгой, я получу причину.Это ограничение единства коллайдеров, о котором говорится в книге.Поэтому я думаю, что мы могли бы закрыть этот билет.
Что сказано в книге:
"Прямо сейчас, если вы используете бок-коллайдеры на своих фишках и на вашем игровом персонаже, вы можете найтичто вы иногда застреваете на вещах, которые не следует делать - ваш персонаж может перестать двигаться и давить на воздух.Проблема обычно возникает в вершинах между близко расположенными плитками, и, к сожалению, кажется, что это небольшая проблема с Unityсам по себе, а не что-либо, что вы можете исправить (очевидно, оно было введено в 4.3.1 и еще не решено на момент написания). Если вы столкнулись с этой проблемой, просто попробуйте использовать многоугольный коллайдер для самого Squarey, изменивслегка измените форму, нажав «Редактировать коллайдер», а затем создайте небольшой выступ в контуре, как показано на рис. 5-9, чтобы вы могли «скользить» по этим воображаемым препятствиям. "
Следуя книге, я создаю простую игруиспользуя Unity 2D.Он включает GameObject
с именем 'Player', который может выполнять какие-то простые действия, перемещаться влево / вправо / прыгать при нажатии leftArrow / rightArrow / Пробел моего ПК.А также некоторые плитки в качестве основания платформы.
Я обнаружил проблему, заключающуюся в том, что во время игры сначала игрок падает на платформу, а затем, когда я нажимаю клавишу Стрелка вправо , он не имеетэффект.Но если я нажму Влево Клавишу или Пробел , проигрыватель перейдет влево или прыгнет, тогда Право Клик вступит в силу ...
Эта проблема занимает у меня часы!Поиск в интернете, но ответа не найдено.Одна подсказка, которую я обнаружил, состоит в том, что когда я снимаю флажок с опции Freeze Rotation
в RigidBody2D
, тогда правильное движение работает, но я пока не знаю, почему.
Вот мой код, ребята, ваша помощь будет оценена!
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);
}
}
}