Заставить объект скользить в одном направлении - PullRequest
0 голосов
/ 18 ноября 2018

Я хочу, чтобы мой объект Rigidbody скользил вправо или влево.

Например, если он в 0 X, он будет скользить 1 в направлении, затем остановится в этом направлении и остановится.

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

Редактировать Это то, что я пробовал

void Update() {

    if (Input.GetKeyDown("d") && !isMoving) {
        StartCoroutine(MoveToPos(Vector3.right));
    }

    if (Input.GetKeyDown("a") && !isMoving) {
        StartCoroutine(MoveToPos(Vector3.left));
    }
}

public IEnumerator MoveToPos(Vector3 direction) {
    isMoving = true;
    var t = 0f;
    var startPosition = transform.position;
    var value = direction == Vector3.right? 1 : -1;
    while (t < 1f) {
        t += 0.05f;
        var endPosition = transform.position;
        endPosition.x = startPosition.x + value * t;
        transform.position = Vector3.Lerp(transform.position, endPosition, t);
        Debug.Log(player.position);
        yield return null;
    }
    isMoving = false;
}

Но, к сожалению, анимация очень уродливая, объект через некоторое время возвращается в конечное положение, не похоже, что объект скользит, а затем останавливается там. Как будто нет ускорения и замедления.

Редактировать 2

Я пытался настроить значения и сделать замедление движения. Вроде работал, но я думаю, что это все еще нуждается в улучшении.

public IEnumerator MoveToPos(Vector3 direction) {
    isMoving = true;
    var t = 0.0;
    var startPosition = transform.position;
    var value = direction == Vector3.right ? 1 : -1;
    while (t < 1) {
        if (t < 0.5) t += 0.1;
        else t += 0.03125;
        Debug.Log(t);
        var endPosition = transform.position;
        endPosition.x = startPosition.x + value * (float)t;
        transform.position = Vector3.Lerp(transform.position, endPosition, (float)t);
        yield return null;
    }
    isMoving = false;
}

Я предполагаю, что настройка значений ускорения и замедления сделает анимацию более плавной.

Ответы [ 2 ]

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

В вашем коде есть несколько ошибок:

1 .Не увеличивайте время (переменная t) с фиксированным числом.Для этого используйте Time.deltaTime.

2 .Не перемещайте GameObject с Rigidbody с помощью transform.Так что не делайте transform.position = xxx или transform.Translate(xxx).При перемещении объекта Rigidbody используйте функцию Rigidbody.MovePosition.

3 . Вы должны включить isKinematic на Rigidbody при перемещении его с помощью функции Rigidbody.MovePosition, потому что это делает его очень плавным.

Наконец, чтобы он сразу остановился после завершения движенияустановите velocity и angularVelocity на ноль.

Ваша фиксированная новая функция:

bool isMoving = false;
IEnumerator MoveToPos(Rigidbody targetObject, Vector3 direction, float duration, float units = 1f)
{
    isMoving = true;
    targetObject.isKinematic = true;

    float counter = 0;

    //Get the current position of the object to be moved
    Vector3 startPos = targetObject.position;
    //Get destination position
    Vector3 toPosition = startPos + direction * units;

    while (counter < duration)
    {
        counter += Time.deltaTime;
        //targetObject.position = Vector3.Lerp(startPos, toPosition, counter / duration);
        Vector3 newPos = Vector3.Lerp(startPos, toPosition, counter / duration); ;
        targetObject.MovePosition(newPos);
        yield return null;
    }

    targetObject.isKinematic = false;
    //Stop right away
    targetObject.velocity = Vector3.zero;
    targetObject.angularVelocity = Vector3.zero;
    isMoving = false;
}

Использование:

Rigidbody rb = GetComponent<Rigidbody>();
StartCoroutine(MoveToPos(rb, Vector3.right, 3f, 1f));
0 голосов
/ 18 ноября 2018

Простой способ таков:

void Update()
    {
        if(Input.GetKeyDown(KeyCode.A))
            transform.Translate(Vector3.right * 1);
    }

Будучи «Ключом», вы условно перемещаете объект и меняете Vector3.right на соответствующее направление (влево, вверх, вниз ...)

Но я предлагаю использовать функцию Lerp, чтобы придать ей более реалистичное движение: https://docs.unity3d.com/ScriptReference/Vector3.Lerp.html

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