(Unity2D) Переключение стиля движения при столкновении - PullRequest
0 голосов
/ 20 ноября 2018

У меня есть персонаж игрока в игре сверху вниз, которая движется в виде сетки (1 единица за раз), но когда она попадает на кусок льда (квадрат), я хочу, чтобы он переключился на движение lerp-движениемдо края и остановитесь.

В настоящее время у меня есть 5 разных коллайдеров в качестве детей для каждого ледяного куска: сам ледяной коллайдер и 4 слегка удаленных коллайдера, по одному на каждую сторону льда.Когда он попадает в ледяной коллайдер, в зависимости от того, в каком направлении он движется, он должен привязываться к связанному удаленному коллайдеру.

Примерно так (трудно увидеть основной коллайдер, но он есть): ice

Вот код, который я использовал для клавиши «вниз» (она в основном одинакова для всех клавиш):

else if (Input.GetKeyDown(KeyCode.DownArrow))
    {
        Vector2 movementDown = new Vector2(0, -1);
        RaycastHit2D hitDown = Physics2D.Raycast(transform.position, movementDown, 0.05f);

        if (hitDown.collider && hitDown.collider.gameObject.tag == "barrier")
        {
            Debug.Log("N/A");
        }
        else if (onIce)
        {
            player.transform.position = Vector3.Lerp(transform.position, downIce.transform.position, 100 * Time.fixedDeltaTime);
        }
        else
        {
            player.transform.position += new Vector3(movementDown.x, movementDown.y, -0.1f);
        }
    }

РЕДАКТИРОВАТЬ: код, который обновляет bool 'onIce':

void OnTriggerEnter2D(Collider2D collision)
{
    if (collision.gameObject.tag == "ice") {
        onIce = true;
    }
}

void OnTriggerExit2D(Collider2D collision)
{
    if (collision.gameObject.tag == "ice")
    {
        onIce = false;
    }
}

1 Ответ

0 голосов
/ 21 ноября 2018

Lerp вызывается только один раз, когда вы нажимаете кнопку. Один из способов исправить это - использовать сопрограмму:

IEnumerator Slide() {
    var t = 0f;
    var start = player.transform.position; //we will change the position every frame
                                         //so for lerp to work, we need to save it here.
    var end = downIce.transform.position;
    while(t < 1f){
        t += Time.deltaTime;
        player.transform.position = Vector3.Lerp(start, end , t);
        yield return null; //returning null waits until the next frame
    }
}

И тогда вы используете это так:

...
    else if (onIce)
    {
         this.StartCoroutine(this.Slide());
    }
    else
...

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

...