Как создать лестницу для 2d платформера? - PullRequest
0 голосов
/ 04 января 2019

мы делаем простую 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;
    }

Мы не просим написать код решения, но просим вас объяснить нам этот принцип и отправить его в правильном направлении, спасибо ^^

1 Ответ

0 голосов
/ 05 января 2019

Может быть, добавить триггеры-триггеры к игровым объектам персонажей и лестниц и увеличить позицию игрока при удерживании и в триггере?

private Rigidbody rb;
[SerializeField]
private float ClimbingSpeed;

void Start(){
rb = GetComponent<Rigidbody>();
}

Public void OnTriggerStay(Collider collider){
 if(collider.gameobject.tag == "Ladder" && input.GetKey(KeyCode.W)){
     rb.moveposition(
  transform.position.x, 
  transform.position.y + 1 * Time.DeltaTime * ClimbingSpeed, 
  transform.position.z
{
{
...