Как создать движение, как Snake vs Block в Unity3D - PullRequest
0 голосов
/ 23 июня 2018

Я пытаюсь воссоздать популярную мобильную игру SnakeVSBlock.Большая часть физики довольно проста, но я не могу воссоздать движение змеи.Что особенного в движении змей в игре, так это то, что предыдущий узел идеально следует по следующему пути, как в X, так и в Y. Это мой текущий код, который работает как движение змеи, но не следует точному пути следующегоузел.Мне интересно, есть ли у кого-нибудь решение для этого.

public void Move()
{
    if (Input.GetMouseButton(0) && GameManager.Instance.IsGameOver() == false && Nodes.Count > 0)
    {
        Vector3 curPos = Input.mousePosition;
        curPos.z = -1;
        curPos = Camera.main.ScreenToWorldPoint(curPos);
        Nodes[0].GetComponent<Rigidbody2D>().velocity = new Vector2(curPos.x - Nodes[0].position.x, 0) * 20;

    if (Nodes[0].position.x > 2.56f)
    {
        Nodes[0].position = new Vector2(2.56f,Nodes[0].position.y);
    }
    else if (Nodes[0].position.x < -2.56f)
    {
        Nodes[0].position = new Vector2(-2.56f, Nodes[0].position.y);
    }
    for (int i = 1; i < Nodes.Count; i++)
    { 
        Vector2 newPos = new Vector2(Nodes[i-1].position.x, Nodes[i].position.y);
        if (GameManager.Instance.GetPoweredUp())
        {
            Nodes[i].position = Vector2.Lerp(Nodes[i].position, newPos, Time.deltaTime * 14);
        }
        else
        {
            Nodes[i].position = Vector2.Lerp(Nodes[i].position, newPos, Time.deltaTime * 10);
        }

    }
}

ОБНОВЛЕНИЕ: я изменил основную логику движения змей в своей игре.Вместо того, чтобы змея двигалась вверх, змея остается в том же положении, а блоки движутся вниз.Однако я все еще не могу получить плавное движение змеи, как в реальных играх.Есть ли другие предложения?

Ответы [ 2 ]

0 голосов
/ 25 июня 2018

Старая мобильная игра «Змея», в которой вы собираете маленькие квадраты, имеет такой же тип движения. Решение тогда состояло в том, что части змеи фактически не двигаются, просто каждый кадр, который вы добавляете немного в голову и снимаете один с хвоста.

Причина, по которой этот подход работает со змеей, но не сразу в этой игре «змея против блоков», заключается в том, что первый дискретен, а второй непрерывен.

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

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

0 голосов
/ 23 июня 2018

Если я понимаю, что вы хотите сделать, вам следует обратиться к этому в обратном порядке. Итак, если у вас есть узлы от 0 до n:

  • Запуск с n-го узла
  • Назначение этому узлу позиции (n-1) -го узла
  • Затем для каждого узла i присвойте ему положение узла i-1
  • Когда вы переместили все узлы, переместите узел 0 в соответствии с пользовательским вводом.

Это должно выглядеть так:

public void Move()
{
    int n = Nodes.Count;

    if (n > 0)
    {
        for (int i = n - 1; i > 0; i--)
        {
            _curNode = Nodes[i];
            _nextNode = Nodes[i - 1];

            Vector3 pos = _nextNode.transform.position;
            pos.z = Nodes[0].position.z;

            _curNode.tranform.position = pos;
        }

        float horizontalInput = Input.GetAxis("Horizontal");
        Nodes[0].Translate(Vector3.right * Time.deltaTime * horizontalInput * 10);
        Nodes[0].Translate(Vector3.up * Time.deltaTime * 4);

        if (Nodes[0].position.x > 2.90)
        {
            Nodes[0].position = new Vector2(2.90f, Nodes[0].position.y);
        }
        else if (Nodes[0].position.x < -2.90)
        {
            Nodes[0].position = new Vector2(-2.90f, Nodes[0].position.y);
        }
    }    
}

Кроме того, если вы как-то не увеличиваете две переменные LerpTime, вы неправильно используете функцию Lerp, и она вам также не нужна в этом контексте. Это удивительно четкое руководство о том, что на самом деле означает Lerp и как правильно его использовать: http://lunarlabs.pt/blog/post/the-art-of-lerp

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