мы делаем простую 2d платформенную игру, и с лестницей возникают сложности ._. Суть в том, что необходимо, чтобы персонаж мог взобраться по лестнице, чтобы встать на нее, и нажав стрелку вниз, чтобы спуститься. Чтобы сделать это, мы использовали PlatformEffector2D на платформе, с которой лестница касается самой высокой точки, и написали сценарий, который должен изменять вращениеOffset, когда персонаж касается коллайдера этой платформы, в зависимости от его текущего значения (0 или 180) и зажатыми ключами (вверх или вниз). Вот код:
private void OnCollisionStay2D(Collision2D col)
{
if (col.gameObject.name == "platform_ladder")
{
PlatformEffector2D pe =
col.gameObject.GetComponent<PlatformEffector2D>();
if (Input.GetKeyDown(KeyCode.DownArrow) && pe.rotationalOffset ==
0)
{
pe.rotationalOffset = 180;
}
else if (Input.GetKeyDown(KeyCode.UpArrow) && pe.rotationalOffset
== 180)
{
pe.rotationalOffset = 0;
}
}
}
В результате персонаж поднимается по лестнице, стоит на ней, но не реагирует на нажатие клавиши вниз. Если вы сделаете шаг назад и вернетесь, чтобы заработать деньги, сценарий сработает, и смещение поворота изменится. Однако тогда невозможно встать на платформу, а персонаж просто пролезает туда-сюда. Я привожу пример записи с экрана (к сожалению, это замедляет видео, но суть того, что я написал на нем, видна)
https://drive.google.com/file/d/1ccUi0sqtVxFS1UAKE7QaQKvr3x4-7S8o
В любом случае я дам код для подъема по лестнице; вдруг в этом есть ошибка:
/* CLimbing */
raydistance = 0;
RaycastHit2D hitinfo = Physics2D.Raycast(transform.position, Vector2.up, raydistance, whatisLadder);
if (hitinfo.collider != null)
{
if (Input.GetKeyDown(KeyCode.UpArrow))
{
isClimbing = true;
}
else if (Input.GetKeyDown(KeyCode.RightArrow) || Input.GetKeyDown(KeyCode.LeftArrow))
{
isClimbing = false;
}
}
else
{
isClimbing = false;
}
anim.SetBool("OnLadder", isClimbing);
if (isClimbing && hitinfo.collider != null)
{
rb.velocity = new Vector2(rb.position.x, Input.GetAxisRaw("Vertical") * speed);
// rb.gravityScale = 0;
rb.isKinematic = true;
anim.SetBool("Ground", true);
else
{
rb.isKinematic = false;
// rb.gravityScale = 3;
}
Мы не просим написать код решения, но просим вас объяснить нам этот принцип и отправить его в правильном направлении, спасибо ^^