На основе сетки / движения плиток + столкновения в Unity? - PullRequest
0 голосов
/ 28 апреля 2018

Возникла огромная проблема с выяснением того, как выполнять движение на основе сетки или движения на основе плитки. В некоторой степени похож на Redungeon от Nitrome: не могу опубликовать изображение: вот и гифка. http://www.eneminds.com/redungeon/img/gifs/gif_1.gif

Я подумал, что мне следует создать систему сетки. Я думал, что это легко, как в старых играх (покемон и т. Д.), Но я не уверен, как это сделать. Но я также хочу, чтобы движение было быстрым.

Ответы [ 2 ]

0 голосов
/ 09 апреля 2019

Мне удалось это осуществить. Я просто немного изменил ввод из учебника по RogueLike из раздела обучения Unity.

Итак, это код, отвечающий за движение

    void Move(string direction_string)
    {
        ChangeDirection(direction_string);

        Vector2 start = transform.position;
        Vector2 end = start + direction;

        boxCollider.enabled = false;
        hit = Physics2D.Linecast(start, end, blockingLayer);
        boxCollider.enabled = true;

        if (hit.transform == null) {
            StartCoroutine(Movement(end));
            animator.SetTrigger(direction_string);
            return;
        } else {
            moveSequence.RemoveAt(0);
            animator.SetTrigger(direction_string);
            return;
        }
    }

    void ChangeDirection(string direction_string)
    {
        switch (direction_string) {
            case "up":
                direction = dir_Up;
                break;
            case "down":
                direction = dir_Down;
                break;
            case "left":
                direction = dir_Left;
                break;
            case "right":
                direction = dir_Right;
                break;
        }
    }

    IEnumerator Movement(Vector3 end)
    {
        moving = true;
        float sqrRemainingDistance = (transform.position - end).sqrMagnitude;

        while (sqrRemainingDistance > float.Epsilon) {
            Vector3 newPosition = Vector3.MoveTowards(rb2D.position, end, moveSpeed * Time.deltaTime);
            rb2D.MovePosition(newPosition);
            sqrRemainingDistance = (transform.position - end).sqrMagnitude;
            yield return null;
        }

        currentPos = end;
        moveSequence.RemoveAt(0);
        moving = false;
    }
}

Вот что отвечает за ввод


    void FixedUpdate ()
    {
        if (moveSequence.Count > 0 && !moving) {
            Move(moveSequence[0]);
        }
    }

Затем просто подключите его к функции Update (), которая прослушивает нажатие кнопки, и добавьте элемент списка в MoveSequence List, например

moveSequence.Add("up");
0 голосов
/ 28 апреля 2018

Unity имеет собственную реализацию тайлкарт, которая должна позволять вам создавать фон a.k.a на земле, по которой вы идете: https://docs.unity3d.com/Manual/Tilemap.html

Кроме того, Unity предоставляет больше 2d контента, чтобы помочь вам создавать вещи прямо здесь: https://github.com/Unity-Technologies/2d-extras

Столкновения описаны в многочисленных руководствах, которые можно найти здесь: https://unity3d.com/learn/tutorials/s/2d-game-creation

Сделать игру, похожую на анимированный GIF, не так просто . Это особенно актуально, если вы новичок в разработке игр, поэтому не ждите простых решений.

Возможно, вы захотите проверить в Unity Asset Store быстрый и грязный способ получения движения на основе тайлов, но это, как всегда, будет иметь цену и не поможет вам учиться. https://assetstore.unity.com/

Что касается скорости движения, это всегда просто переменная в вашей игре, которую можно настроить в соответствии с вашими предпочтениями. В случае игры на основе тайлов это будет соответствовать времени, которое требуется для визуального перемещения персонажа из одной плитки в другую. Попробуйте почитать о Лерпинге, который является частью движка Unity. https://docs.unity3d.com/ScriptReference/Vector3.Lerp.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...